新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 移植ucosII到STM32F103ZE(四)

        移植ucosII到STM32F103ZE(四)

        作者: 時間:2016-11-25 來源:網絡 收藏
        a) 根據stm32f103芯片對系統文件進行修改
        根據AN-1018.pdf 和移植詳解介紹的移植基礎知識,對OS-uCOSIIport 下的代碼解釋下。
        并進行相關特性修改。
        os_cpu.h
        #ifdef OS_CPU_GLOBALS
        #define OS_CPU_EXT
        #else
        #define OS_CPU_EXT extern
        #endif

        typedef unsigned char BOOLEAN;
        typedef unsigned char INT8U;
        typedef signed char INT8S;
        typedef unsigned short INT16U;
        typedef signed short INT16S;
        typedef unsigned int INT32U;
        typedef signed int INT32S;
        typedef float FP32;
        typedef double FP64; //上面重定義,增加代碼可移植性
        typedef unsigned int OS_STK;
        typedef unsigned int OS_CPU_SR;
        因為 CM3 是32 位寬的,所以 OS_STK(堆棧的數據類型)被類型重定義為 unsigned int。
        因為 CM3 的狀態寄存器(xPSR)是32位寬的,因此 OS_CPU_SR 被類型重定義為 unsigned int。
        OS_CPU_SR 是在OS_CRITICAL_METHOD 方法 3 中保存 cpu 狀態寄存器用的。在 CM3 中,移植OS_ENTER_CRITICAL(),OS_EXIT_CRITICAL()選方法 3 是最合適的。
        #define OS_CRITICAL_METHOD 3

        #if OS_CRITICAL_METHOD 3
        #define OS_ENTER_CRITICAL() {cpu_sr = OS_CPU_SR_Save();}
        #define OS_EXIT_CRITICAL() {OS_CPU_SR_Restore(cpu_sr);}
        #endif
        具體定義宏OS_ENTER_CRITICAL() 和OS_EXIT_CRITICAL()其中OS_CPU_SR_Save() 和OS_CPU_SR_Restore()是用匯編代碼寫的,代碼在 os_cpu_a.asm 中,到時再解釋。
        #define OS_STK_GROWTH 1
        CM3 中,棧是由高地址向低地址增長的,因此 OS_STK_GROWTH定義為 1。
        #define OS_TASK_SW() OSCtxSw()
        定義任務切換宏,OSCtxSw()是用匯編代碼寫的,代碼在 os_cpu_a.asm 中,到時再解釋。
        #if OS_CRITICAL_METHOD 3
        OS_CPU_SR OS_CPU_SR_Save(void);
        void OS_CPU_SR_Restore(OS_CPU_SR cpu_sr);
        #endif

        void OSCtxSw(void);
        void OSIntCtxSw(void);
        void OSStartHighRdy(void);
        void OS_CPU_PendSVHandler(void); //PendSV 中斷服務程序

        void OS_CPU_SysTickHandler(void); //SysTick 中斷服務程序
        void OS_CPU_SysTickInit(void);
        INT32U OS_CPU_SysTickClkFreq(void);

        聲明幾個函數,OS_CPU_PendSVHandler(void)要替換為 PendSV__Handler(void)。另外這里最后三個函數需要注釋掉,為什么呢?




        答案就在啟動文件上,一般我們自己開發基于 stm32 芯片的軟件,都會使用標準外設庫 CMSIS 中提供的啟動文件,比如 startup_stm32f10x_hd.s,而 Micrium官方沒有用 ST 的標準啟動文件,自寫了啟動文件,而且分開寫成了兩個.s 文件,即 init.s,vectors.s
        (MicriumSoftwareEvalBoardsSTSTM3210B-EVALRVMDK)。init.s 負責進入 main(),vectors.s設置中斷向量。OS_CPU_SysTickHandler和OS_CPU_PendSVHandler 這兩個中斷向量就是在 vectors.s 中被設置的。
        使用標準的 startup_stm32f10x_hd.s 作為啟動文件的,那該怎么來匹配呢?事實上在 startup_stm32f10x_hd.s 文件中 PendSV 中斷向量名為 PendSV_Handler,所以只需用PendSV_Handler 替換掉OS_CPU_C.h和 OS_CPU_A.ASM 中的OS_CPU_PendSVHandler。
        這樣,替換后的void PendSV_Handler(void)函數在OS_CPU_C.h 中有聲明,在OS_CPU_A.ASM 中有具體的中斷服務函數代碼,在startup_stm32f10x_hd.s中有向量地址,匹配完畢,Ok。
        接下來就該處理 SysTick 中斷和啟動任務了。SysTick是 OS 的“心跳”,可稱為滴答時鐘,本質上來說就是一個定時器。
        同樣,在 startup_stm32f10x_hd.s 文件中 SysTick 的中斷向量名為 SysTick_Handler,我們本可按照上法繼續炮制,但因為 ST 標準庫已經有相關庫函數,所以我們按照如下法子修改:
        把 OS_CPU_C.C 文件中的 void OS_CPU_SysTickHandler (void)的內容代碼復制到 stm32f10x_it.c
        文件中的 SysTick_Handler (void)函數內;


        并且在文件頭部添加:#include




        這樣子,替換后的 SysTick_Handler (void)函數在 stm32f10x_it.h 文件中聲明,在stm32f10x_it.c
        中有具體代碼,在startup_stm32f100x_hd.s中有向量地址;同時需要在App文件中有對 SysTick的初始化函數(后面編寫App.c時需要初始化)。
        整個過程中 ST 官方標準啟動文件啥也沒動,防止了誤修改。
        OS_CPU_SysTickHandler()定義在 os_cpu_c.c 中,是 SysTick中斷的中斷處理函數,而 stm32f10x_it.c 中已經有該中斷函數的定義 SysTick_Handler()),這里也就不需要了。
        OS_CPU_SysTickInit() 定義在os_cpu_c.c中,用于初始化SysTick定時器,它依賴于 OS_CPU_SysTickClkFreq(),而此函數我們自己會實現,所以注釋掉。
        OS_CPU_SysTickClkFreq()定義在 BSP.C (MicriumSoftwareEvalBoards)中,而本文移植中并未用到BSP.C,后面我們會自己實現,因此也將它注釋掉,解除我們和 Micrium 官方bsp 的依賴關系。

        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 成安县| 津南区| 湄潭县| 梁山县| 崇左市| 额济纳旗| 绥宁县| 遂川县| 班玛县| 东丰县| 兴宁市| 新竹县| 黄浦区| 海安县| 明溪县| 乐陵市| 灵山县| 桃源县| 崇州市| 信丰县| 宜丰县| 金平| 阳山县| 邵武市| 阿坝| 浮梁县| 都安| 常山县| 滨海县| 山阴县| 遵义县| 江阴市| 仁布县| 青冈县| 香格里拉县| 冷水江市| 西乌珠穆沁旗| 宜兰县| 麻阳| 准格尔旗| 邵阳市|