STM32學習記錄13 ucosII移植
1:os_cpu.h
我們需要對此文件進行修改:
1) void OS_CPU_PendSVHandler(void) 需替換成 void PendSV_Handler(void) 一般我們自己開發(fā)基于 stm32 芯片的軟件,都會使用標準外設庫 CMSIS 中提供的啟動文件,比如 startup_stm32f10x_hd.s,而 Micrium 官方?jīng)]有用 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,其中函數(shù)聲明在 OS_CPU_C.h 中,具體的中斷服務函數(shù)原型在OS_CPU_A.ASM 中,后面也將對其進行修改。 這樣子,替換后的 PendSV_Handler 函數(shù)在 OS_CPU_C.h 中有聲明,在 OS_CPU_A.ASM 中有具體的中斷服務函數(shù)代碼,與 startup_stm32f10x_hd.s 中的向量地址就對應上了。
2) 注釋掉最后三個關于 SysTick 服務函數(shù)
void OS_CPU_SysTickHandler(void);
void OS_CPU_SysTickInit(void);
INT32U OS_CPU_SysTickClkFreq(void);
其中,OS_CPU_SysTickHandler 函數(shù)在 ST 標準庫 stm32f10x_it.c 中已定義,此處不需要;
其中,OS_CPU_SysTickInit 定義在 os_cpu_c.c 中,依賴于 OS_CPU_SysTickClkFreq,用于初始化 SysTick 定時器,需注釋掉;其中,OS_CPU_SysTickClkFreq 定義在官方 EvalBoards 的 BSP.c中,需解除依賴,若需要,我們可以在 bsp.c 中實現(xiàn)。
2: stm32f10x_it.c
由于1.2的原因,需要修改
SysTick 作為 OS 的“心跳”,可稱為滴答時鐘,本質(zhì)上來說就是一個定時器,和 PendSV 中斷一樣,在 startup_stm32f10x_hd.s 中 SysTick 的中斷向量名為 SysTick_Handler,且因為 ST標準庫已經(jīng)有相關庫函數(shù),所以我們只需作如下修改:
打開 os_cpu_c.c 文件,找到 void OS_CPU_SysTickHandler(void)的內(nèi)容代碼
OS_CPU_SR cpu_sr;
OS_ENTER_CRITICAL();
OSIntNesting++;
OS_EXIT_CRITICAL();
OSTimeTick();
OSIntExit();
復制到 stm32f10x_it.c 文件中的 SysTick_Handler (void)函數(shù)內(nèi);
void SysTick_Handler(void)
{
OS_CPU_SR cpu_sr;
OS_ENTER_CRITICAL();
OSIntNesting++;
OS_EXIT_CRITICAL();
OSTimeTick();
OSIntExit();
}
并且在文件頭部添加:#include
由于1.1的原因,OS_CPU_PendSVHandler 中斷服務函數(shù)的原型在此文件中,我們需要用PendSV_Handler 將其替換,以實現(xiàn)在 startup_stm32f10x_hd.s 中的中斷向量的匹配。
1) 注釋掉 EXPORT OS_CPU_PendSVHandler,并修改成 EXPORT PendSV_Handler,
2) 找到 OS_CPU_PendSVHandler 程序原型,并重命名為 PendSV_Handler
這樣 PendSV_Handler 中斷服務函數(shù)就成功建立了,同時,我們需要注釋掉 stm32f10x_it.h 和stm32f10x_it.c 中的相關 PendSV_Handler 的聲明和定義,以防止沖突。
4:os_cpu_c.c
由于1.2做一下修改:
1) 把最后 OS_CPU_SysTickHandler(), OS_CPU_SysTickInit()這兩個函數(shù)的內(nèi)容代碼注釋掉;
2) 禁用以下宏定義,因為他們涉及到上一步注釋的 Systick 服務函數(shù)
#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
此文件為配置內(nèi)核的頭文件,在這個文件,我們可以禁用信號量、互斥信號量、郵箱、隊列、信號量集、定時器、內(nèi)存管理,調(diào)試模式:
#define OS_FLAG_EN 0 //禁用信號量集
#define OS_MBOX_EN 0 //禁用郵箱
#define OS_MEM_EN 0 //禁用內(nèi)存管理
#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 //禁用調(diào)試
也可以禁用應用軟件的鉤子函數(shù)和多重事件控制
#define OS_APP_HOOKS_EN 0
#define OS_EVENT_MULTI_EN 0
這些所做的修改主要是把一些功能給去掉,減少內(nèi)核大小,也利于編譯調(diào)試。等用到的時候,再開啟相應的功能。
評論