a)
依据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)。别的这儿最终三个函数需求注释掉,为什么呢?
答案就在发动文件上,一般咱们自己开发根据 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 中被设置的。
接下来就该处理 SysTick 中止和发动使命了。SysTick是 OS 的“心跳”,可称为滴答时钟,本质上来说便是一个定时器。
把 OS_CPU_C.C 文件中的 void OS_CPU_SysTickHandler (void)的内容代码复制到 stm32f10x_it.c
文件中的 SysTick_Handler (void)函数内;
这姿态,替换后的 SysTick_Handler (void)函数在 stm32f10x_it.h 文件中声明,在stm32f10x_it.c
中有详细代码,在startup_stm32f100x_hd.s中有向量地址;一起需求在App文件中有对 SysTick的初始化函数(后边编写App.c时需求初始化)。
整个过程中 ST 官方规范发动文件啥也没动,避免了误修正。
OS_CPU_SysTickHandler()界说在 os_cpu_c.c 中,是 SysTick中止的中止处理函数,而 stm32f10x_it.c 中已经有该中止函数的界说 SysTick_Handler()),这儿也就不需求了。
OS_CPU_SysTickInit() 界说在os_cpu_c.c中,用于初始化SysTick定时器,它依靠于 OS_CPU_SysTickClkFreq(),而此函数咱们自己会完成,所以注释掉。