http://blog.sina.com.cn/s/blog_4ab4a532010006qp.html
RO代表代码区;RW代表可读写区(预先被初始化的数据和预先被清零的数据);ZI预先被清零的数据区(未初始化)。预先被初始化的数据定位在代码区之后;预先被清零的数据区定位在预先被初始化的数据区之后。
该部分程序功能:先判断当前是在RAM中运行还是在FLASH中运行,如果在FLASH中运行先把FLASH中的预先赋值的RW段数据和未负值的ZI段数据都搬到RAM区中,再把ZI段数据清零;如果程序就是在RAM中运行,则直接把ZI段数据清零。
.extern Image_RO_Limit /* ROM区中数据段的起始地址*/
.extern Image_RW_Base /* RW段起始地址 */
.extern Image_ZI_Base /* ZI段的起始地址*/
.extern Image_ZI_Limit /* ZI段的结束地址加1 */
ldr r0, =Image_RO_Limit /* 取ROM区中数据段的首地址 */
ldr r1, =Image_RW_Base /* 取RAM区中RW段的目标首地址*/
ldr r3, =Image_ZI_Base /*取RAM区中ZI段的首地址 */
cmp r0, r1 /* 比较ROM区中数据段首地址和RAM区中RW段目标首地址*/
beq NoRW /*相等代表当前是在RAM中运行*/
LoopRw: cmp r1, r3 /*不相等则和RAM区中ZI段的目标地址比较*/
ldrcc r2, [r0], #4 /*如果r1<r3,则把r0地址上的数据读出到r2中,然后r0=r0+4*/
strcc r2, [r1], #4 /*如果r1<r3,则把r2内数据写入道r1地址中,然后r1=r1+4*/
bcc LoopRw /*如果r1<r3,则跳转到LoopRw 继续执行*/
NoRW: ldr r1, =Image_ZI_Limit /* 取ZI段的结束地址 */
mov r2, #0 /*将r2赋0*/
LoopZI: cmp r3, r1 /* 将ZI段清零*/
strcc r2, [r3], #4 /*如果r3<r1,将r2内容写入到r3地址单元中,然后r3=r3+1*/
bcc LoopZI /*如果r3<r1(即C=0),则跳转到LoopZI */
.extern Main /*声明外部变量*/
B Main /*t跳转到用户的主程序入口*/
还有一点需要注意:|Image$$RO$$Limit|:表示RO区末地址后面的地址,即RW数据源的起始地址