新聞中心

        EEPW首頁 > 學習方法與實踐 > ARM初學寶典

        ARM初學寶典

        ——
        作者: 時間:2007-05-29 來源: 收藏
        一直都在聽說有多么好,有多神奇,有多難學。故學它時都興奮加恐懼。呵呵,我剛好用也有一段時間了。寫點東西給的初學者,希望能起到幫助作用。
        1,記住:ARM很簡單,就如從51轉換到PIC或者轉換到AVR一樣簡單。ARM的一個功能就如同掌握一個其他IC的使用一樣,如時鐘芯片,存在芯片,等等,甚至更簡單。所以ARM的那些功能就可以忽略了。
        2,和51系列相比,arm的寄存器不在存儲空間之內,而且不分數(shù)據(jù)、程序空間。記住它的分配圖.
        3,ARM有多種處理器模式,每個模式都有自己的獨立
           記住表格
           記住寄存器的使用
        4,ARM的中斷加強了,增加了軟件中斷,掌握swi
           可以把處理器模式及異常看成都是中斷的擴張,從這些方面去理解也許快些。
           swi是嵌入式系統(tǒng)中任務切換的一個關鍵指令。故先有個心里準備。用法:swi 立即數(shù)。執(zhí)行該執(zhí)行時,程序會跑到swi中斷處。立即數(shù)包含在該指令代碼中,如果要根據(jù)立即數(shù)執(zhí)行程序必須找出立即數(shù)。
        5,ARM的啟動程序及引導地址
           你編寫的代碼啟動時:ARM都是從0x00000000開始運行。
           實際芯片運行時:ARM啟動時,先根據(jù)硬件判斷是否進入ISP還是經(jīng)入程序運行。如進行程序運行,又會根據(jù)硬件判斷會從0x00000000內部 flash空間,還是外部flash空間0x80000000處運行(此時芯片會自動改變映射,也就是將0x80000000映射到 0x00000000)
           在ADS軟件上:ADS軟件會把ARM Linker-Layout-Place at beginning of image-Objiect/symbol中指明開始代碼的文件。
        Section中指明代碼開始的程序塊。一般習慣Objiect/symbol中填寫的時Startup.o。Section中填寫Start。因為大家一般會將開始程序放在Startup文件中的Start段。
           ADS軟件知道了我們程序的開始地方,還不知道這個程序的開始地方放到實際芯片的那個地址,所以我們還要為ADS軟件指明開始地址,ARM Linker-Option-Image entry point中指明就行了。
           這樣我們自己編寫的代碼、實際芯片、仿真器程序起始的關系就差不多明白了,然后記住下面中斷向量表的代碼。
        6,地址重新映射
           這是個新概念,但記住它的功能是存儲器映射用于改變從0x00000000開始的中斷向量的映射。記住1:是0x00000000開始的中斷向量的映射;記住2:為什么要這樣做是為了不管你這段程序放在芯片實際的那個可以開始放的地方,ARM內部都可以從0x00000000開始運行。
        7,匯編語言與c語言的混合編程
           如果你不會這個先最好了解一點概念
           匯編與c的參數(shù)傳遞是靠R0,R1這些寄存器傳遞的。
           函數(shù)的返回值也是靠R0。
           匯編中的標號與函數(shù)名相當
           c語言函數(shù)結束時實際上是匯編子程序的返回指令,故用匯編語言中用BL調用c的函數(shù)。否則就會返回出錯。
        8,匯編指令的記憶
           多了幾種尋址方式
           先記住基本指令然后進行擴展,在記指令的執(zhí)行條件,在搞懂特性符合的意義,如!,^等
        我先是記住了以下幾個指令:B,BX,BL,LDR,STR,LDM,STM,MOV,MRS,MSR,DCD,SWI,ADD,AND,CMP,MUL這些指令后,以后就邊用邊記。
        9,ARM初始化要干些什么
           ARM初始化靈活方式,很多功能都可以方便設置。故開始初始化的事情也是蠻的多,主要做那些呢
           開始的中斷向量表要做好吧。
           每個處理器模式都有自己的SP,你要指明每個SP的開始地址,進行堆棧的初始化。
           初始化外部總線控制
           設置存儲器加速模塊
           初始化時鐘,初始化VIC等等,當然有很多你不必管,先拷貝
           在網(wǎng)上找資料就行了。中斷向量表與初始化堆棧一般如下
        ;中斷向量表
        Reset
                LDR     PC, ResetAddr
                LDR     PC, UndefinedAddr
                LDR     PC, SWI_Addr
                LDR     PC, PrefetchAddr
                LDR     PC, DataAbortAddr
                DCD     0xb9205f80           ;ARM保留位,使向量表所有數(shù)據(jù)32位累加和為0,才能脫機運行。
                LDR     PC, [PC, #-0xff0]    ;
                LDR     PC, FIQ_Addr

        ResetAddr           DCD     ResetInit
        UndefinedAddr       DCD     Undefined
        SWI_Addr            DCD     SoftwareInterrupt
        PrefetchAddr        DCD     PrefetchAbort
        DataAbortAddr       DCD     DataAbort
        Nouse               DCD     0  ;
        IRQ_Addr            DCD     0  ;
        FIQ_Addr            DCD     FIQ_Handler

        ;未定義指令
        Undefined
                B       Undefined

        ;軟中斷
        SoftwareInterrupt
                B       SoftwareInterrupt

        ;取指令中止
        PrefetchAbort
                B       PrefetchAbort

        ;取數(shù)據(jù)中止
        DataAbort
                B       DataAbort

        ;快速中斷
        FIQ_Handler
                STMFD   SP!, {R0-R3, LR}
                BL      FIQ_Exception
                LDMFD   SP!, {R0-R3, LR}
                SUBS    PC,  LR,  #4

        ;初始化堆棧

        InitStack   
                MOV     R0, LR

        ;設置管理模式堆棧
                MSR     CPSR_c, #0xd3
                LDR     SP, StackSvc
        ;設置中斷模式堆棧
                MSR     CPSR_c, #0xd2
                LDR     SP, StackIrq
        ;設置快速中斷模式堆棧
                MSR     CPSR_c, #0xd1
                LDR     SP, StackFiq
        ;設置中止模式堆棧
                MSR     CPSR_c, #0xd7
                LDR     SP, StackAbt
        ;設置未定義模式堆棧
                MSR     CPSR_c, #0xdb
                LDR     SP, StackUnd
        ;設置系統(tǒng)模式堆棧
                MSR     CPSR_c, #0xdf
                LDR     SP, =StackUsr

                MOV     PC, R0

        StackSvc           DCD     SvcStackSpace + (SVC_STACK_LEGTH - 1)* 4  ;
        StackIrq           DCD     IrqStackSpace + (IRQ_STACK_LEGTH - 1)* 4
        StackFiq           DCD     FiqStackSpace + (FIQ_STACK_LEGTH - 1)* 4
        StackAbt           DCD     AbtStackSpace + (ABT_STACK_LEGTH - 1)* 4
        StackUnd           DCD     UndtStackSpace + (UND_STACK_LEGTH - 1)* 4

                AREA    MyStacks, DATA, NOINIT, ALIGN=2
        SvcStackSpace      SPACE   SVC_STACK_LEGTH * 4  ;管理模式堆棧空間
        IrqStackSpace      SPACE   IRQ_STACK_LEGTH * 4  ;中斷模式堆棧空間
        FiqStackSpace      SPACE   FIQ_STACK_LEGTH * 4  ;快速中斷模式堆棧空間
        AbtStackSpace      SPACE   ABT_STACK_LEGTH * 4  ;中止義模式堆棧空間
        UndtStackSpace     SPACE   UND_STACK_LEGTH * 4  ;未定義模式堆棧
        10,邊看書邊實踐,不斷培養(yǎng)自己對ARM的興趣,不斷取得點成績,別奢望一口吃成一個胖子,不斷的給自己帶來成功得快樂,我們都需要短期成績的刺激才能長久的堅持。
        11,做一個項目吧。否則永遠也不能說你學會了。
        12,本文給初學者指路用,背下本文,然后去看學習ARM的書籍,現(xiàn)在網(wǎng)上到處都有的ARM指令集,ARM的芯片資料,ARM應用系統(tǒng)開發(fā)詳解,ADS-EasyJTAG,本篇寶典將是你學習ARM的加速器。

        c語言相關文章:c語言教程




        關鍵詞: ARM

        評論


        相關推薦

        技術專區(qū)

        關閉
        主站蜘蛛池模板: 西充县| 都匀市| 温宿县| 密山市| 无棣县| 上栗县| 阿坝| 沙洋县| 二连浩特市| 皋兰县| 乌兰察布市| 同德县| 东乌| 阿尔山市| 横峰县| 高青县| 松溪县| 阜宁县| 隆化县| 无锡市| 天津市| 玛曲县| 罗平县| 唐河县| 建平县| 玉门市| 绵阳市| 吕梁市| 奎屯市| 蒙城县| 广西| 随州市| 西盟| 浦城县| 广宁县| 德惠市| 邵武市| 博罗县| 靖远县| 邯郸市| 壶关县|