新聞中心

        ARM指令定址問(wèn)題

        作者: 時(shí)間:2016-11-11 來(lái)源:網(wǎng)絡(luò) 收藏
        AREA BOOTCODE, CODE, READONLY

        ENTRY
        BootloAd
        LDRr0, =0x00
        LDRr1, =0x00
        LDRr2, =0x00
        LDRr3, =0x00
        END

        1)在ARM程序里,如何指定指令在ROM中存放的位置(類似單片機(jī)的ORG偽指令)
        我想不管哪款A(yù)RM芯片,肯定都有上電復(fù)位地址,也就是上電后PC指向的位置。比如某款A(yù)RM芯片復(fù)位地址為0x00000000,復(fù)位后我希望執(zhí)行的第一條指令是LDR R0, =0x00。那么在程序里我們?cè)趺粗付▽⒃摋l指令放在ROM的0x00位置呢?

        2)ENTRY偽指令的作用
        ENTRY偽指令是程序的入口,一個(gè)程序只能有一個(gè)ENTRY,在生成ELF格式的IMAGE文件時(shí),它能夠告訴仿真器從哪條指令開(kāi)始執(zhí)行程序,但是在生成BIN文件時(shí),它又有什么用呢??我們希望將ENTRY下面的那條指令燒錄到ARM芯片的上電復(fù)位地址處,每款芯片的復(fù)位地址都可能不同,ADS如何能通過(guò)ENTRY就知道實(shí)際芯片的復(fù)位地址在哪里?

        3)ARMLINKER配置時(shí)RO BASE的作用
        我在ARMLINKER的配置頁(yè)里將RO BASE設(shè)置為0x3000,通過(guò)用AXD裝載生成的AXF文件仿真,觀察發(fā)現(xiàn),LDRr0, =0x00這條指令被放在存儲(chǔ)器的0x3000位置,這似乎說(shuō)明通過(guò)設(shè)置RO BASE可以設(shè)置程序在ROM中的起始位置。但我看同時(shí)生成的BIN文件,只有16個(gè)字節(jié),那如果用燒錄器燒芯片時(shí),燒錄器如何知道BIN文件的第一個(gè)字節(jié)要放在ROM的0x3000位置呢?(不通過(guò)填寫燒錄軟件里的燒錄起始地址為0x3000)

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

        VECTORS。S是在ADS中設(shè)定的: vector.s中"section"=STARTUP為首運(yùn)行。

        類似的。 復(fù)位后是中斷向量表。第一個(gè)是復(fù)位向量,在那里
        放一個(gè)跳轉(zhuǎn)。(一般才幾個(gè)字節(jié)大小,只能放跳轉(zhuǎn)了)
        跳轉(zhuǎn)到:
        1。初始化的代碼處。InitStAck 初始化堆棧。。。
        2。C 的 _MAIN 地址,運(yùn)行 MAIN()

        vector.s應(yīng)該是自己寫的ARM匯編,不是每個(gè)項(xiàng)目都會(huì)有vector.s文件的吧?
        另外,就算在section指定了STARTUP為首運(yùn)行,怎么將該條指令和硬件的復(fù)位地址對(duì)上呢?

        是這樣的:
        CODE32
        AREAStArtup,CODE,READONLY

        ENTRY
        ;//中斷向量表每個(gè)寬 4個(gè)字節(jié)。只能放一條32位的ARM指令
        Vectors;BASE+0
        LDRPC, ResetAddr;復(fù)位的第一條。跳到標(biāo)號(hào);ResetAddr
        LDRPC, UndefinedAddr ;32位的ARM指令。 BASE+1
        LDRPC, SWI_Addr;32位的ARM指令。 BASE+2
        LDRPC, PrefetchAddr
        LDRPC, DAtAAbortAddr
        DCD0xb9205f80
        LDRPC,[PC, #-0xff0]
        LDRPC,FIQ_Addr
        ...


        ResetAddr:
        BLInitStAck
        B_MAIN
        跳轉(zhuǎn)到:
        1。初始化的代碼處。InitStAck 初始化堆棧。。。
        2。C 的 _MAIN 地址,運(yùn)行 MAIN()

        假設(shè)我的工程中 vector.s是初始化文件。
        其主要內(nèi)容為:
        CODE32
        AREAStArtup,CODE,READONLY

        ENTRY
        ;//中斷向量表每個(gè)寬 4個(gè)字節(jié)。只能放一條32位的ARM指令。
        Vectors;BASE+0
        LDRPC, ResetAddr;復(fù)位的第一條。跳到標(biāo)號(hào);ResetAddr
        LDRPC, UndefinedAddr ;32位的ARM指令。 BASE+1
        LDRPC, SWI_Addr;32位的ARM指令。 BASE+2
        LDRPC, PrefetchAddr
        LDRPC, DAtAAbortAddr
        DCD0xb9205f80
        LDRPC,[PC, #-0xff0]
        LDRPC,FIQ_Addr
        ...


        ResetAddr:
        BLInitStAck
        B_MAIN
        ;=======================================

        所以需要在ADS中設(shè)定
        object/symbol: vector.o,"section"=STARTUP為首運(yùn)行。
        ;=======================================

        上電復(fù)位后,程序從entry處進(jìn)入。
        則第一條指令就是:LDRPC, ResetAddr
        那么PC指針跳轉(zhuǎn)到ReseAddr標(biāo)號(hào)處。
        你可以在這里實(shí)現(xiàn)初始化功能。

        答6:
        竟然不能重編輯。。。今晚剛看了44b0 的 bootloAder程序。
        有不對(duì)的地方希望各位指正。


        關(guān)鍵詞: ARM指令定址問(wèn)

        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 山阴县| 富平县| 清新县| 南郑县| 平武县| 霍林郭勒市| 盱眙县| 科技| 团风县| 夏邑县| 孝感市| 突泉县| 彰武县| 融水| 日土县| 银川市| 永川市| 唐山市| 腾冲县| 定南县| 蓝田县| 太仓市| 惠东县| 黔西| 北安市| 瑞昌市| 浙江省| 保靖县| 思茅市| 阿图什市| 禹城市| 西华县| 南部县| 思南县| 望谟县| 南充市| 临沂市| 龙游县| 乌拉特后旗| 富裕县| 离岛区|