
难度:★★本文首发于我的嵌入式技术号「OneChan讲Soc嵌入式」,未经授权禁止转载。如果你曾经手写过 Cortex-M3 的启动代码,一定见过这样的片段:LDR R1, =|Load$$RW_IRAM1$$Base| LDR R2, =|Image$$RW_IRAM1$$Base| LDR R3, =|Image$$RW_IRAM1$$Limit| CopyLoop CMP R2, R3 BEQ CopyDone LDR R0, [R1], #4 STR R0, [R2], #4 B CopyLoop CopyDone这是最朴素的字拷贝循环——每次从 Flash 搬 4 个字节到 RAM,循环次数等于.data段的字数。但翻看一些官方启动文件或者高度优化的底层库,你会发现另一种写法:LDR R1, =|Load$$RW_IRAM1$$Base| LDR R2, =|Image$$RW_IRAM1$$Base| LDR R3, =|Image$$RW_IRAM1$$Limit| SUB R3, R3, R