新聞中心

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

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

        作者: 時間:2016-11-10 來源:網絡 收藏
        準備工作:
        1.到micrium官網下載最新的 OS在stm32上的移植資料。下載地址為:http://micrium.com/download/Micrium-ARM-OS-II-Cortex-M3.exe

        2.平臺搭建:
        a.將1下載得到的文件解壓得到micrium文件夾,并在MicriumSoftware OS-II下用UV4創建一個 OS工程,配置CPU為STM32F101C8

        b.建立如圖1所示的工程目錄結構。其中APP層用于放置應用程序, OS用于放置所有 OS與處理器無關的源碼,PORT用于放置移植 OS需要改動的文件,而BSP則用于放置系統的驅動程序,LIB為系統調用的庫支持。該目錄組織依據來源于micrium公布的 OS移植文檔,圖2是該移植文檔的系統軟件結構圖供參考。

        圖1 OS的目錄結構

        圖2 OS系統軟件結構
        c.工程建立完畢以后將MicriumSoftware OS-IISource目錄下的所有文件(包括h文件)添加到 OS組,將MicriumSoftware OS-IIPortsARM-Cortex-M3GenericRealView目錄下的所有文件添加到PORT組

        d.完成以上工作后進行一次編譯,我們可以發現出現錯誤提示
        .Sourceos_core.c(26): error: #5: cannot open source input file " os_ii.h": No s h file or directory
        該問題是包含文件路徑引起的, os_ii.h文件實際上存在于MicriumSoftware OS-IISource目錄下。因此我們需要在工程設置中的C/C++選項卡手動增加頭文件路徑,針對以上錯誤我們應該增加的頭文件路徑未.Source

        e.再次編譯發生錯誤
        .Source os_ii.h(44): error: #5: cannot open source input file "app_cfg.h": No s h file or directory
        這個問題應該不是原生 OS導致的,是micrium移植系統的時候修改了源文件,在其中增加了一些配置選項,這個配置選項保存在app_cfg.h中,但是micrium發布移植文件包的時候該文件又沒有包含在內,因此需要我們自己寫一個配置文件。本文為了方便就不細致研究文件內容,直接從micrium的開發板STM3210B-EVAL源碼包中拷貝該文件放置于工程目錄下的APP文件夾中,并設置相應的包含路徑。

        f.再次編譯發生錯誤
        .Source os_ii.h(45): error: #5: cannot open source input file "os_cfg.h": No s h file or directory
        在micrium的移植文件包中也沒有這個文件,但是在目錄MicriumSoftware OS-IISource下存在一個文件名為os_cfg_r.h的文件,將該文件名后的r去掉解決。

        g.再次編譯發生錯誤
        .Source os_ii.h(46): error: #5: cannot open source input file "os_cpu.h": No s h file or directory
        該文件實際上存在于MicriumSoftware OS-IIPortsARM-Cortex-M3GenericRealView目錄下,因此可以通過修改文件包含路徑解決。

        h.再次編譯發生錯誤
        .OUTPUT OSII.sct(7): error: L6236E: No section matches selector - no section to be FIRST/LAST.
        點擊該錯誤提示出現以下內容:
        ; *************************************************************
        ; *** Scatter-Loading Description File generated by uVision ***
        ; *************************************************************

        LR_IROM1 0x08000000 0x00010000 { ; load region size_region
        ER_IROM1 0x08000000 0x00010000 { ; load address = execution address
        *.o (RESET, +First)
        *(InRoot$$Sections)
        .ANY (+RO)
        }
        RW_IRAM1 0x20000000 0x00002800 { ; RW data
        .ANY (+RW +ZI)
        }
        }
        實際上這個錯誤發生在連接階段,從點擊錯誤得到的信息看表示連接的時候找不到一個標號為RESET的段,而keil默認連接是從RESET段開始的,因此出現了這個錯誤。對于這個錯誤的解決方法我們可以通過e的方式,將開發板軟件包內的init.s文件拷貝到APP目錄,并添加到工程中,同時把init.s文件中第一個段改名由INIT為RESET解決。

        i.再次編譯發現在連接的時候很多以hook結尾的代碼找不到實體,但是有聲明。錯誤示例如下:
        .OUTPUT OSII.axf: Error: L6218E: Undefined symbol App_TCBInitHook (referred from os_cpu_c.o).
        這些函數實際上都是 OS為了方便用戶監視系統運行過程而保留的鉤子函數, OS內部的函數名實際上是OSTCBInitHook,micrium在移植過程中為了層次清晰,在 OS鉤子函數內部增加了相應的APP***HOOK調用,同時通過功能開關OS_APP_HOOKS_EN來控制是否啟用這些功能。我們當前的代碼除了 OS系統代碼,其他什么應用代碼都還沒有,因此編譯會出錯。這種情況下我們需要暫時關閉這個功能將在OS_CFG.h中的OS_APP_HOOKS_EN配置為0。

        j.再次編譯發現系統提示沒有main函數,增加一個main.c文件解決。

        k.再次編譯發生錯誤:
        .OUTPUT OSII.axf: Error: L6218E: Undefined symbol OS_CPU_SysTickClkFreq (referred from os_cpu_c.o).
        這個錯誤時系統找不到OS_CPU_SysTickClkFreq這個函數實體。查閱相關資料發現micrium增加這個函數的目的是獲取系統當前的時鐘頻率,于是我們在工程中的BSP組增加一個bsp.c文件,同時實現這個OS_CPU_SysTickClkFreq函數即可。未測試需要,本函數簡單寫為
        INT32U OS_CPU_SysTickClkFreq(void)
        {
        return 8000000;
        }

        l.再次編譯已經沒有錯誤發生,只有一個警告信息
        .OUTPUT OSII.axf: Warning: L6305W: Image does not have an entry point. (Not specified or not set d to multiple choices.)
        通過查閱資料,大致意思就是說keil不知道整個代碼的入口在哪兒,根據init.s中的代碼
        ENTRY
        ResetHndlr

        ;******************************************************************************
        ; SETUP STACK POINTERS
        ;******************************************************************************


        ;******************************************************************************
        ; MOVE TO MAIN
        ;******************************************************************************
        ldr r0, =__main
        bx r0 ; Save this in register for possible long jump ;

        ALIGN
        END
        可以看到我們的入口在標號為ResetHndlr的地方,因此我們通過指定入口解決該問題。指定入口的方法是在編譯器選項的linker頁增加命令
        --entry ResetHndlr

        至此第一步編譯算是完成了。



        關鍵詞: ucOS移植STM3

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 自贡市| 镇康县| 静乐县| 都兰县| 石嘴山市| 奉贤区| 仪陇县| 上蔡县| 天等县| 五华县| 柳江县| 广灵县| 城固县| 福泉市| 太白县| 龙州县| 梁山县| 塘沽区| 石泉县| 咸丰县| 新巴尔虎右旗| 赫章县| 平阴县| 凤台县| 保亭| 万安县| 堆龙德庆县| 秭归县| 台南市| 宁德市| 忻城县| 双辽市| 庆云县| 东兰县| 岐山县| 于田县| 榆中县| 南涧| 芮城县| 永泰县| 辽阳市|