移植ucosII到STM32F103ZE(四)
a)
根据stm32f103芯片对系统文件进行修改
根据AN-1018.pdf 和移植详解介绍的移植基础知识,对OS-uCOSIIport 下的代码解释下。
并进行相关特性修改。
os_cpu.h
#ifdef
OS_CPU_GLOBALS
#defineOS_CPU_EXT
#else
#defineOS_CPU_EXT
extern
#endif
typedefunsigned
char
BOOLEAN;
typedefunsigned
char
INT8U;
typedefsigned
char
INT8S;
typedefunsigned
short
INT16U;
typedefsigned
short
INT16S;
typedefunsigned
int
INT32U;
typedefsigned
int
INT32S;
typedeffloat
FP32;
typedefdouble FP64;
//上面重定义,增加代码可移植性
typedefunsigned
int
OS_STK;
typedefunsigned
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 是最合适的。
#defineOS_CRITICAL_METHOD
3
#ifOS_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 中,到时再解释。
#defineOS_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。
根据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(堆栈的数据类型)被类型重定义为 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
#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
声明几个函数,OS_CPU_PendSVHandler(void)要替换为 PendSV__Handler(void)。另外这里最后三个函数需要注释掉,为什么呢?
![](http://m.amcfsurvey.com/editerupload/fetch/20161101/321492_1_0.jpg)
答案就在启动文件上,一般我们自己开发基于 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 中被设置的。