TI支持很多种方式的boot,内部的ram(saram),flash,sci,spi等等,但无论哪种启动都遵循下面的流程。
而该流程中的reset,initboot,call selectbootmode, read i/o state, call boot loader这些步骤都是固化在芯片内的程序自己执行的,也就是说这些代码在出厂的时候已经在TI的芯片内。在28335中是一段的8k*16的read-only的memory,地址位于0x3fe000-0x3fffff,见下图:
根据上面的流程图和rom分布图,详细的解释一下流程:
1.在3f ffc0到3f ffff其实是放了中断向量表的地方:系统一开机当然是处于reset中断,因此直接跳至reset的地方执行(0x3f ffc0)。而这个地方的两个字节只是放了一条指令,就是跳至initboot函数,也就是3f f34c的地址执行boot load.
2.在3f f34c的bootloader操作中会去检测外部GPIO口的状态,从而判断是哪种方式的启动:
3. 然后根据相依的启动方式跳至相应的入口地址:比如FLASH启动就是0x33fff6, 内部SARAM启动就是0x0.
4. 而这里的入口地址就是cmd文件中定义的begin段。因此对于flash启动和ram启动,begin的定义是不同的,在flash启动时begin就是 0x33fff6 ,而ram启动begin就是0x0. 这个2个字的区间也就是放了我们程序最初执行的第一条指令(通常是code_start).
因为CSM_PWL的存放位置是在0x33fff8,因此只有2个words空间来存放跳转指令。而一条长跳转指令LB刚好占两个字节(这摆明着是ti精心设计的)