repository provides the example blinking LED example I alluded to in the earlier
post. The exact file is
blink_slow_Teensy32.hex. I've been doubting all 14324
bytes are required and thought embedded programming was a bit better.
The first two addresses in the vector table are all we need to get started. The
first address at
0x00000000 is the initial value of the banked stack pointer
SP_main. The other stack pointer banked register,
SP_process, is in
an unknown state except for being 4 byte aligned (bits 1 and 0 are both
The second address at
0x00000004 is the initial value of the program counter,
PC. Bit 0 of this value sets the Thumb mode of the processor (bit 24 in the
EPSR) and must be 1. Since this is a ARMv7E-M specification processer it only
has Thumb mode.
Execution starts in the cores
repository with the program counter at
0x01BC. This address is the beginning
ResetHandler in the
teensy3/mk20dx128.c source file. Up to line
while (dest < &_edata) *dest++ = *src++;) this code sets system registers
which I'll leave as a topic for another day. This line copies the text section
of the executable to data, which is in SRAM.
For this blinking LED code the text section (located in the flash) is 1540 bytes
long and located at the end. For this example it's address range is [
0x37F4). The corresponding data in SRAM is located at the adddress range
0x1FFF8A44). Note that the first valid address of SRAM for
Teensy 3.2 is
0x1FFF8000. It does this by copying word by word (4 bytes).
After 2351 instructions since starting the system finally falls through the
branch in the while loop. I hope those 1540 bytes are worth it, we'll get to