新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM啟動代碼研究(附源代碼)

        ARM啟動代碼研究(附源代碼)

        作者: 時間:2011-05-12 來源:網絡 收藏

        1:PRESERVE8:
        Reguire8和Preserve8
        C和匯編有8位對齊的要求,這兩個偽指令可以滿足此要求,存在REQUIRE8——> PRESERVE8的對應關系,但不是說有一個REQUIRE8就要有一個 PRESERVE8,如果是一個c文件和一個匯編文件的調用,也就涉及一個PRESERVE8或者是一個REQUIRE8.
        另外,REQUIRE8和PRESERVE8并不完成8 byte 對齊的操作,對齊由ALIGN完成。

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

        將ADS的移植到KEIL MDK上需要做的修改:
        當用戶擁有ADS遺留工程的所有時,使用MDK重新編譯鏈接全部是最好的解決方法,MDK中的新版本編譯工具會重新生成滿足堆棧8BYTE對齊要求的目標文件,避免由于堆棧不對齊引起的鏈接錯誤.
        從ADS到KEIL很重要的一個修改的地方就是這里的8BYTE對齊,想要編譯通過,在startup.s里面我們必須加入PRESERVE8指令,使得寄存器8BYTE對齊.
        代碼:
        CODE32
        PRESERVE8 ;這個在KEIL里面是必須的,要求8BYTE對齊.在ADS的代碼中就沒有.
        AREA vectors,CODE,READONLY

        2: 的處理器可工作于多種模式,下面設置個模式的一些參數.
        Mode_USR EQU 0x10 用戶模式
        Mode_FIQ EQU 0x11 快中斷模式
        Mode_IRQ EQU 0x12 中斷模式
        Mode_SVC EQU 0x13 管理模式
        Mode_ABT EQU 0x17 中止模式
        Mode_UND EQU 0x1B 未定義模式
        Mode_SYS EQU 0x1F 系統模式
        參數的由來:這里各個模式的參數是由寄存器CPSR的模式位設置M[4:0]得來的,比如這里的用戶模式,CPSR的M[4:0]設置為10000就是0x10,同理其他.詳見嵌入式系統基礎教程>>P47頁,CPSR設置很關鍵!

        3:
        I_Bit EQU 0x80 ; when I bit is set, IRQ is disabled
        F_Bit EQU 0x40 ; when F bit is set, FIQ is disabled
        也和CPSR寄存器的設置有關,這里兩位是禁止/開啟快速中斷和一般中斷的設置.

        4: 各模式下定義的堆棧地址.
        UND_Stack_Size EQU 0x00000000
        SVC_Stack_Size EQU 0x00000100
        ABT_Stack_Size EQU 0x00000000
        FIQ_Stack_Size EQU 0x00000000
        IRQ_Stack_Size EQU 0x00000100
        USR_Stack_Size EQU 0x00000200
        設置堆棧大小
        Stack_Size EQU (UND_Stack_Size + SVC_Stack_Size + ABT_Stack_Size +
        FIQ_Stack_Size + IRQ_Stack_Size + USR_Stack_Size)
        AREA STACK, NOINIT, READWRITE, ALIGN=3
        Stack_Mem SPACE Stack_Size
        Stack_Top EQU Stack_Mem + Stack_Size
        堆棧大小的設置,各公司寫的代碼有所不同,但是不影響大局,可以借鑒一些你認為比較簡單的代碼,然后寫自己的堆棧地址和大小設置程序.

        5:堆的設置
        Heap_Size EQU 0x00000000
        AREA HEAP, NOINIT, READWRITE, ALIGN=3
        Heap_Mem SPACE Heap_Size
        AREA Init,CODE,READONLY,ALIGN=3 //指定后面的指令為8位對齊(2的3次方)
        align n
        它的含義就是使得下面的代碼按一定規則對齊,.align n 指令的對齊值有兩種方案,n 或 2^n ,各種平臺最初的匯編器一般都不是gas,采取方案1或2的都很多,gas的目標是取代原來的匯編器,必然要保持和原來匯編器的兼容,因此在gas中如何解釋 .align指令會顯得有些混亂,原因在于保持兼容。arm-linux是按照2^n的方案對齊的. 的.align 5就是2的5次方(32位)對齊,也就是4字節(32位)對齊.

        6: AREA RESET, CODE, READONLY
        ARM
        下面的是ARM的代碼,不是THUMB.


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 涟源市| 成武县| 将乐县| 海晏县| 翁牛特旗| 曲松县| 贡嘎县| 罗田县| 仁布县| 新宾| 营口市| 柘城县| 开平市| 堆龙德庆县| 宜丰县| 铅山县| 新密市| 厦门市| 灌云县| 万载县| 盱眙县| 开化县| 辛集市| 甘谷县| 若尔盖县| 驻马店市| 大城县| 察雅县| 丽水市| 望都县| 武隆县| 繁峙县| 阳春市| 抚宁县| 鄄城县| 惠来县| 灵武市| 阳原县| 孙吴县| 长葛市| 略阳县|