新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM初始化程序分析

        ARM初始化程序分析

        作者: 時間:2016-11-11 來源:網絡 收藏
        1個多月前看完周立功的ARM基礎與ARM基礎實驗教程二,然后專研了一段時間TI的TMS320C5402,弄不懂,迫于師傅要求要出另一產品的壓力,現在重新又來看ARM基礎實驗二,今天下午在ADS下做了下Startup.s的實驗,終于把第一次沒懂的弄明白了。。。唉。。又收獲啊。。。。

        源代碼與分析注釋如下:

        本文引用地址:http://www.104case.com/article/201611/316974.htm

        ;初始化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);

        }

        非常感謝網上的朋友寫的日志,看了你們的日志我才慢慢弄懂是啟動是怎么會事情



        關鍵詞: ARM初始化程

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 黔西县| 乌拉特中旗| 望奎县| 广平县| 云林县| 安徽省| 内江市| 景泰县| 宣城市| 资阳市| 松潘县| 曲松县| 佛教| 大宁县| 涞水县| 阿鲁科尔沁旗| 茶陵县| 大洼县| 云龙县| 格尔木市| 徐闻县| 正蓝旗| 香格里拉县| 吉安县| 喀喇沁旗| 拉孜县| 五原县| 凤山县| 朝阳区| 蒙城县| 行唐县| 七台河市| 灵川县| 刚察县| 壶关县| 崇明县| 丰城市| 通榆县| 浮梁县| 遂川县| 济宁市|