新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32學習記錄13 ucosII移植

        STM32學習記錄13 ucosII移植

        作者: 時間:2016-11-13 來源:網絡 收藏
        關于如何移植,建立工程的問題已經有很多文檔說明了,此處只是說明一下需要修改的文件及修改的原因。
        1:os_cpu.h
        我們需要對此文件進行修改:
        1) void OS_CPU_PendSVHandler(void) 需替換成 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_PendSVHandler 這個中斷向量就是在 vectors.s 中被設置的,且我們使用的是startup_stm32f10x_hd.s 作為啟動文件的,而在 startup_stm32f10x_hd.s 文件中,PendSV 的中斷向量名為 PendSV_Handler,所以只需用 PendSV_Handler 替換掉相應文件的OS_CPU_PendSVHandler,其中函數聲明在 OS_CPU_C.h 中,具體的中斷服務函數原型在OS_CPU_A.ASM 中,后面也將對其進行修改。 這樣子,替換后的 PendSV_Handler 函數在 OS_CPU_C.h 中有聲明,在 OS_CPU_A.ASM 中有具體的中斷服務函數代碼,與 startup_stm32f10x_hd.s 中的向量地址就對應上了。
        2) 注釋掉最后三個關于 SysTick 服務函數
        void OS_CPU_SysTickHandler(void);
        void OS_CPU_SysTickInit(void);
        INT32U OS_CPU_SysTickClkFreq(void);
        其中,OS_CPU_SysTickHandler 函數在 ST 標準庫 stm32f10x_it.c 中已定義,此處不需要;
        其中,OS_CPU_SysTickInit 定義在 os_cpu_c.c 中,依賴于 OS_CPU_SysTickClkFreq,用于初始化 SysTick 定時器,需注釋掉;其中,OS_CPU_SysTickClkFreq 定義在官方 EvalBoards 的 BSP.c中,需解除依賴,若需要,我們可以在 bsp.c 中實現。
        2: stm32f10x_it.c
        由于1.2的原因,需要修改
        SysTick 作為 OS 的“心跳”,可稱為滴答時鐘,本質上來說就是一個定時器,和 PendSV 中斷一樣,在 startup_stm32f10x_hd.s 中 SysTick 的中斷向量名為 SysTick_Handler,且因為 ST標準庫已經有相關庫函數,所以我們只需作如下修改:
        打開 os_cpu_c.c 文件,找到 void OS_CPU_SysTickHandler(void)的內容代碼
        OS_CPU_SR cpu_sr;
        OS_ENTER_CRITICAL();
        OSIntNesting++;
        OS_EXIT_CRITICAL();
        OSTimeTick();
        OSIntExit();
        復制到 stm32f10x_it.c 文件中的 SysTick_Handler (void)函數內;
        void SysTick_Handler(void)
        {
        OS_CPU_SR cpu_sr;
        OS_ENTER_CRITICAL();
        OSIntNesting++;
        OS_EXIT_CRITICAL();
        OSTimeTick();
        OSIntExit();
        }
        并且在文件頭部添加:#include
        3:os_cup_a.asm
        由于1.1的原因,OS_CPU_PendSVHandler 中斷服務函數的原型在此文件中,我們需要用PendSV_Handler 將其替換,以實現在 startup_stm32f10x_hd.s 中的中斷向量的匹配。
        1) 注釋掉 EXPORT OS_CPU_PendSVHandler,并修改成 EXPORT PendSV_Handler,
        2) 找到 OS_CPU_PendSVHandler 程序原型,并重命名為 PendSV_Handler
        這樣 PendSV_Handler 中斷服務函數就成功建立了,同時,我們需要注釋掉 stm32f10x_it.h 和stm32f10x_it.c 中的相關 PendSV_Handler 的聲明和定義,以防止沖突。
        4:os_cpu_c.c
        由于1.2做一下修改:
        1) 把最后 OS_CPU_SysTickHandler(), OS_CPU_SysTickInit()這兩個函數的內容代碼注釋掉;
        2) 禁用以下宏定義,因為他們涉及到上一步注釋的 Systick 服務函數
        #define OS_CPU_CM3_NVIC_ST_CTRL (*((volatile INT32U *)0xE000E010))
        #define OS_CPU_CM3_NVIC_ST_RELOAD (*((volatile INT32U *)0xE000E014))
        #define OS_CPU_CM3_NVIC_ST_CURRENT (*((volatile INT32U *)0xE000E018))
        #define OS_CPU_CM3_NVIC_ST_CAL (*((volatile INT32U *)0xE000E01C))
        #define OS_CPU_CM3_NVIC_ST_CTRL_COUNT 0x00010000
        #define OS_CPU_CM3_NVIC_ST_CTRL_CLK_SRC 0x00000004
        #define OS_CPU_CM3_NVIC_ST_CTRL_INTEN 0x00000002
        #define OS_CPU_CM3_NVIC_ST_CTRL_ENABLE 0x00000001
        5:os_cfg.h
        此文件為配置內核的頭文件,在這個文件,我們可以禁用信號量、互斥信號量、郵箱、隊列、信號量集、定時器、內存管理,調試模式:
        #define OS_FLAG_EN 0 //禁用信號量集
        #define OS_MBOX_EN 0 //禁用郵箱
        #define OS_MEM_EN 0 //禁用內存管理
        #define OS_MUTEX_EN 0 //禁用互斥信號量
        #define OS_Q_EN 0 //禁用隊列
        #define OS_SEM_EN 0 //禁用信號量
        #define OS_TMR_EN 0 //禁用定時器
        #define OS_DEBUG_EN 0 //禁用調試
        也可以禁用應用軟件的鉤子函數和多重事件控制
        #define OS_APP_HOOKS_EN 0
        #define OS_EVENT_MULTI_EN 0
        這些所做的修改主要是把一些功能給去掉,減少內核大小,也利于編譯調試。等用到的時候,再開啟相應的功能。



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 衡山县| 惠东县| 湖州市| 拉萨市| 香格里拉县| 黄陵县| 平顺县| 湘西| 龙南县| 乡城县| 基隆市| 临猗县| 黑龙江省| 舒城县| 宁津县| 始兴县| 鄱阳县| 延吉市| 敖汉旗| 淳化县| 益阳市| 青冈县| 秦安县| 凌云县| 枣阳市| 兴隆县| 西畴县| 茌平县| 斗六市| 无棣县| 乌鲁木齐县| 弥渡县| 宁武县| 封开县| 甘泉县| 兴海县| 台北市| 高碑店市| 邹城市| 秭归县| 禹城市|