新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 移植ucosII到STM32F103ZE(四)

移植ucosII到STM32F103ZE(四)

作者: 時(shí)間:2016-11-25 來源:網(wǎng)絡(luò) 收藏
a) 根據(jù)stm32f103芯片對(duì)系統(tǒng)文件進(jìn)行修改
根據(jù)AN-1018.pdf 和移植詳解介紹的移植基礎(chǔ)知識(shí),對(duì)OS-uCOSIIport 下的代碼解釋下。
并進(jìn)行相關(guān)特性修改。
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;
因?yàn)?CM3 是32 位寬的,所以 OS_STK(堆棧的數(shù)據(jù)類型)被類型重定義為 unsigned int。
因?yàn)?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 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 中,到時(shí)再解釋。
#define OS_STK_GROWTH 1
CM3 中,棧是由高地址向低地址增長的,因此 OS_STK_GROWTH定義為 1。
#define OS_TASK_SW() OSCtxSw()
定義任務(wù)切換宏,OSCtxSw()是用匯編代碼寫的,代碼在 os_cpu_a.asm 中,到時(shí)再解釋。
#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 中斷服務(wù)程序

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

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




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


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




這樣子,替換后的 SysTick_Handler (void)函數(shù)在 stm32f10x_it.h 文件中聲明,在stm32f10x_it.c
中有具體代碼,在startup_stm32f100x_hd.s中有向量地址;同時(shí)需要在App文件中有對(duì) SysTick的初始化函數(shù)(后面編寫App.c時(shí)需要初始化)。
整個(gè)過程中 ST 官方標(biāo)準(zhǔn)啟動(dòng)文件啥也沒動(dòng),防止了誤修改。
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定時(shí)器,它依賴于 OS_CPU_SysTickClkFreq(),而此函數(shù)我們自己會(huì)實(shí)現(xiàn),所以注釋掉。
OS_CPU_SysTickClkFreq()定義在 BSP.C (MicriumSoftwareEvalBoards)中,而本文移植中并未用到BSP.C,后面我們會(huì)自己實(shí)現(xiàn),因此也將它注釋掉,解除我們和 Micrium 官方bsp 的依賴關(guān)系。

上一頁 1 2 下一頁

關(guān)鍵詞: 移植ucosIISTM32F103Z

評(píng)論


技術(shù)專區(qū)

關(guān)閉