新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > ucOS學習筆記(5)——一步一步移植ucOS到STM32

        ucOS學習筆記(5)——一步一步移植ucOS到STM32

        作者: 時間:2016-11-10 來源:網(wǎng)絡 收藏
        這兩天看了下keil的編譯連接相關文檔得到以下一些信息:

        1.關于AREA--AREA是arm匯編中的段標志,它代表一個段的開始。所謂段是指一個獨立的,被命名的,不可分割一組代碼或者數(shù)據(jù),一個單獨的代碼段是一個應用功能的最小單元。原文如下“sectionsare independent, named, indivisible seqnces of code or data. A single code section is the minimum required to prod? an application”。
        2.關于ENTRY--ENDTRY英文原意是入口的意思,在匯編語言中它代表了一個代碼段中被執(zhí)行的第一條指令的位置。如果代碼中有C語言代碼,C的初始化庫就已經(jīng)包含了entry,一般這個entry就是main函數(shù)的入口,轉(zhuǎn)換為標識符就是__main所在的位置。在一個文件中如果包含了多個ENTRY連接過程將報錯。這也就解釋了學習筆記4中編譯報錯的問題。知道原因我們可以直接去掉init.s中的ENTRY,再編譯就直接OK了。

        OS學習筆記(4)中已經(jīng)可以完成編譯了,但這個代碼是無法正常運行的。因為一般的ARM代碼都由四個部分組成,第一部分為初始化代碼,包括堆棧初始化等操作,第二部分是中斷向量表,第三部分是函數(shù)主體,這一部分一般是用C或者C++寫成,最后一部分為中斷代碼。前邊的移植編譯工作基本上把第一部分,第三部分做了,還有中斷向量表和中斷函數(shù)沒有完成。于是接下來的工作就是將這兩部分代碼添加到工程中。

        添加中斷向量表
        按照之前的習慣我們直接找到ST開發(fā)板源碼包中的中斷向量文件vectors.s添加進當前工程,編譯發(fā)生以下錯誤:
        1..OUTPUT OSII.axf: Error: L6218E: Undefined symbol OSPendSV (referred from vectors.o).
        沒有找到OSPendSV,這個函數(shù)是用于任務切換時保存堆棧相關數(shù)據(jù)的,該函數(shù)實際上已經(jīng)在os_cpu_a.asm中被micrium實現(xiàn)了。只是名字變?yōu)榱薕S_CPU_PendSVHandler,因此我們只需要將vectors.s中的這個OS_CPU_PendSV改為OS_CPU_PendSVHandler就可以了。

        2..OUTPUT OSII.axf: Error: L6218E: Undefined symbol Tmr_TickISR_Handler (referred from vectors.o).
        這個錯誤表示沒有找到system tick函數(shù),而這個函數(shù)實際上夜市在os_cpu_c.c中被micrium實現(xiàn)了,名字是OS_CPU_SysTickHandler。現(xiàn)在只需要將Tmr_TickISR_Handler改為OS_CPU_SysTickHandler即可。

        3..OUTPUT OSII.axf: Error: L6218E: Undefined symbol Image$$ARM_LIB_STACK$$ZI$$Limit (referred from vectors.o).
        這個問題是表明連接器找不到ARM_LIB_STACK這個段造成的,由于micrium在移植 OS到STM32平臺的時候自己寫了分散加載文件,在分散加載文件中增加了一個ARM_LIB_STACK段,而我們沒有使用它的分散加載文件導致找不到該段。micrium的分散加載文件如下:
        LR_IROM1 0x08000000 0x00020000 ;; Load region
        {
        ER_IROM1 0x08000000 0x08020000
        {
        vectors.o (VECT, +First)
        init.o (INIT)
        * (+RO)
        }

        RW_IRAM1 0x20000000 0x00004C00
        {
        * (+RW,+ZI)
        } ;; The following declarations select the "two region model" ;
        ;; A default __user_initial_stackheap() will be used ;
        ARM_LIB_HEAP 0x20004700 EMPTY 0x00000200 {}
        ARM_LIB_STACK 0x20004B00 EMPTY -0x00000200 {}
        }
        解決這個問題的方法是借助ST官方給的例程,參考前端的棧初始化代碼,將以下代碼拷貝到vectors.s的頂部就可以了。
        Stack_Size EQU 0x00000800

        AREA STACK, NOINIT, READWRITE, ALIGN=3
        Stack_Mem SPACE Stack_Size

        __initial_sp
        ; If you need to use external SRAM mounted on STM3210E-EVAL board as data memory
        ; and internal SRAM for Stack, uncomment the following line and comment the line above
        ;__initial_sp EQU 0x20000000 + Stack_Size ; "Use MicroLIB" must be checked in
        ; the Project->Options->Target window

        ; Amount of memory (in bytes) allocated for Heap
        ; Tailor this val to your application needs
        ;// Heap Configuration
        ;// Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
        ;//


        Heap_Size EQU 0x00000200

        AREA HEAP, NOINIT, READWRITE, ALIGN=3
        __heap_base
        Heap_Mem SPACE Heap_Size
        __heap_limit
        然后去掉原文中的IMPORT l Image$$ARM_LIB_STACK$$ZI$$Limitl I,同時將下邊的l Image$$ARM_LIB_STACK$$ZI$$Limitl I改為__initial_sp即可。

        至此,所有關于STM32的 OS移植基本完成,下一步就是寫板級支持包bsp.c,并完成系統(tǒng)測試代碼編寫。

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

        http://blog.163.com/tianyake@yeah/blog/static/7493314120114924056775/



        關鍵詞: ucOS移植STM3

        評論


        技術專區(qū)

        關閉
        主站蜘蛛池模板: 麻栗坡县| 商南县| 台中县| 仁化县| 汉川市| 思南县| 文安县| 元氏县| 荃湾区| 乐昌市| 南澳县| 旬阳县| 黄龙县| 阿巴嘎旗| 瑞昌市| 和硕县| 游戏| 兰考县| 安泽县| 卢龙县| 洪洞县| 湟中县| 牙克石市| 景东| 酒泉市| 平南县| 广南县| 高密市| 盘山县| 和政县| 德清县| 新源县| 新建县| 庆城县| 天台县| 葵青区| 辽中县| 乃东县| 元江| 泊头市| 巴林左旗|