移植ucosII到STM32F103ZE(四)
根據(jù)AN-1018.pdf 和移植詳解介紹的移植基礎知識,對OS-uCOSIIport 下的代碼解釋下。
并進行相關特性修改。
os_cpu.h
#ifdef
#define
#else
#define
#endif
typedef
typedef
typedef
typedef
typedef
typedef
typedef
typedef
typedef
typedef
typedef
因為 CM3 是32 位寬的,所以 OS_STK(堆棧的數(shù)據(jù)類型)被類型重定義為 unsigned int。
因為 CM3 的狀態(tài)寄存器(xPSR)是32位寬的,因此 OS_CPU_SR 被類型重定義為 unsigned int。
OS_CPU_SR 是在OS_CRITICAL_METHOD 方法 3 中保存 cpu 狀態(tài)寄存器用的。在 CM3 中,移植OS_ENTER_CRITICAL(),OS_EXIT_CRITICAL()選方法 3 是最合適的。
#define
#if
#endif
具體定義宏OS_ENTER_CRITICAL() 和OS_EXIT_CRITICAL()其中OS_CPU_SR_Save() 和OS_CPU_SR_Restore()是用匯編代碼寫的,代碼在 os_cpu_a.asm 中,到時再解釋。
#define
CM3 中,棧是由高地址向低地址增長的,因此 OS_STK_GROWTH定義為 1。
#define OS_TASK_SW()
定義任務切換宏,OSCtxSw()是用匯編代碼寫的,代碼在 os_cpu_a.asm 中,到時再解釋。
#if OS_CRITICAL_METHOD
#endif
void
void
void
void
void
void
INT32U
聲明幾個函數(shù),OS_CPU_PendSVHandler(void)要替換為 PendSV__Handler(void)。另外這里最后三個函數(shù)需要注釋掉,為什么呢?
答案就在啟動文件上,一般我們自己開發(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_SysTickHandler和OS_CPU_PendSVHandler 這兩個中斷向量就是在 vectors.s 中被設置的。
接下來就該處理 SysTick 中斷和啟動任務了。SysTick是 OS 的“心跳”,可稱為滴答時鐘,本質上來說就是一個定時器。
把 OS_CPU_C.C 文件中的 void OS_CPU_SysTickHandler (void)的內容代碼復制到 stm32f10x_it.c
文件中的 SysTick_Handler (void)函數(shù)內;
這樣子,替換后的 SysTick_Handler (void)函數(shù)在 stm32f10x_it.h 文件中聲明,在stm32f10x_it.c
中有具體代碼,在startup_stm32f100x_hd.s中有向量地址;同時需要在App文件中有對 SysTick的初始化函數(shù)(后面編寫App.c時需要初始化)。
整個過程中 ST 官方標準啟動文件啥也沒動,防止了誤修改。
OS_CPU_SysTickHandler()定義在 os_cpu_c.c 中,是 SysTick中斷的中斷處理函數(shù),而 stm32f10x_it.c 中已經(jīng)有該中斷函數(shù)的定義 SysTick_Handler()),這里也就不需要了。
OS_CPU_SysTickInit() 定義在os_cpu_c.c中,用于初始化SysTick定時器,它依賴于 OS_CPU_SysTickClkFreq(),而此函數(shù)我們自己會實現(xiàn),所以注釋掉。
評論