可以看到定义了两个存储区块
MEMORY
{
rom (rxai!w) : ORIGIN = 0x20000000, LENGTH = 40K
ram (wxa!ri) : ORIGIN = 0x20020000, LENGTH = 4K
}
和数据手册描述的片上存储对应,分别对应片上ROM和片上RAM。
可以看到.init放在了rom的开头
{
__stack_size = DEFINED(__stack_size)?__stack_size : 256;
PROVIDE(_stack_size =_stack_size);
_heap_size = DEFINED(__heap_size)?__heap_size : 256;
PROVIDE(_stack_size =_stack_size);
. = ALIGN(4);
.init :
{
*(.init);
} >rom AT>rom :rom
搜索.init可以看到
该代码段位于vectors.S
该代码段的第一条语句是
跳转到_start执行
而芯片复位正是从ROM开始处执行,即执行j _start语句。
继续往下看
进行中断向段基地址配置,data初始化,bss初始化,栈指针设置等工作
最后进入main函数执行
main函数中再进行时钟,中断等底层初始化,最后才是用户的业务代码。