您的位置 首页 软件

ARM初始化程序剖析

1个多月前看完周立功的ARM基础与ARM基础实验教程二,然后专研了一段时间TI的TMS320C5402,弄不懂,迫于师傅要求要出另一产品的压力,现在重…

1个多月前看完周建功的ARM根底与ARM根底试验教程二,然后专研了一段时间TI的TMS320C5402,弄不理解,迫于师傅要求要出另一产品的压力,现在从头又来看ARM根底试验二,今天下午在ADS下做了下Startup.s的试验,总算把第一次没懂的弄理解了。。。唉。。又收成啊。。。。

源代码与剖析注释如下:

;初始化C程序运转环境,然后进入C程序代码

IMPORT |Image$$RO$$Limit|

IMPORT |Image$$RW$$Base|

IMPORT |Image$$ZI$$Base|

IMPORT |Image$$ZI$$Limit|

IMPORT Main ;声明C程序中的Main函数

AREA Start,CODE,READONLY

ENTRY

CODE32

RESET LDR SP,=0x40003F00

LDR R0,=|Image$$RO$$Limit| ;RO段完毕地址加1 ,表明RO区末地址后边的地址,

;即RW数据源的开端地址,应该是RW的加载地址

LDR R1,=|Image$$RW$$Base| ;RW区在RAM里的履行区开端地址,也便是编译器选项

;RW_Base指定的地址,应该是RW运转地址

LDR R3,=|Image$$ZI$$Base|;ZI区在RAM里边的开端地址

CMP R0,R1

BEQ LOOP1 ;R0与R1持平就跳转

LOOP0 CMP R1,R3 ;R1小于R3

LDRCC R2,[R0],#4

STRCC R2,[R1],#4

BCC LOOP0

; COPY ROM TORAM

LOOP1 LDR R1,=|Image$$ZI$$Limit|

MOV R2,#0

LOOP2 CMP R3,R1

STRCC R2,[R3],#4 ;

BCC LOOP2 ;R3小于0,跳转到LOOP2

; ZI清零

B Main

END

;一个arm由RO,RW,ZI三个段组成 其间RO为代码段,RW是现已初始化的全局变量,ZI是未初始化的全局变量(关于GNU东西 对应的概念是TEXT ,DATA,BSS)bootloader

;bootloader要将RW段复制到ram中并将ZI段清零 编译器运用下列段来记载各段的开端和完毕地址

; |Image$$RO$$Base| ; RO段开端地址 2

; |Image$$RO$$Limit| ; RO段完毕地址加1 ,表明RO区末地址后边的地址,即RW数据源的开端地址

; |Image$$RW$$Base| ; RW段开端地址

; |Image$$RW$$Limit| ; RW段完毕地址加1

; |Image$$ZI$$Base| ; ZI段开端地址

; |Image$$ZI$$Limit| ; ZI段完毕地址加1

;IMPORT |Image$$RO$$Limit| ; End of ROM code (=start of ROM data)

;IMPORT |Image$$RW$$Base| ; Base of RAM to initialise

;IMPORT |Image$$ZI$$Base| ; Base and limit of area

;IMPORT |Image$$ZI$$Limit| ; to zero initialise

;IMPORT Main ; The main entry of mon program

;大总结!!!!!!!!!!!!!映像一开端总是存储在ROM/Flash里边的,其RO部分既能够在ROM/Flash里边履行,也能够转移到速度更快的RAM中履行;而RW和ZI这两部分是有必要转移到可写的RAM里去。所谓应用程序履行环境的初始化,便是完结必要的从ROM到RAM的数据传输和内容清零。

;r0是RW区的load address

;r1是RW区的execution address

;当两者持平时就不必复制

;不持平时,程序先把ROM里|Image$$RO$$Limt|开端的RW初始数据复制到RAM里边|Image$$RW$$Base|开端的地址,当RAM这边的方针地址抵达|Image$$ZI$$Base|后就表明RW区的完毕和ZI区的开端,接下去就对这片ZI区进行清零操作,直到遇到完毕地址|Image$$ZI$$Limit|

这个发动程序,是为下面C言语程序做准备的,其实这个程序很有含义,为今后自己写C程序建立了环境

#define uint8 unsigned char

#define uint32 unsigned int

#define N 100

uint32 sum;

//核算1加到N N是大于0的数

void Main(void)

{

uint32 i;

sum=0;

for(i=0;i

{

sum+=i;

}

while(1);

}

非常感谢网上的朋友写的日志,看了你们的日志我才渐渐弄懂是发动是怎么会工作

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/ruanjian/275078.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部