您的位置 首页 汽车

移植ucosII到STM32F103ZE(四)

a)根据stm32f103芯片对系统文件进行修改根据AN-1018pdf和移植详解介绍的移植基础知识,对OS-uCOSIIport下的代码解释下。并进行相关

a) 依据stm32f103芯片对体系文件进行修正
依据AN-1018.pdf 和移植详解介绍的移植基础知识,对OS-uCOSIIport 下的代码解说下。
并进行相关特性修正。
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;
由于 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 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 中,届时再解说。
#define OS_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。
这样,替换后的void PendSV_Handler(void)函数在OS_CPU_C.h 中有声明,在OS_CPU_A.ASM 中有详细的中止服务函数代码,在startup_stm32f10x_hd.s中有向量地址,匹配结束,Ok。
接下来就该处理 SysTick 中止和发动使命了。SysTick是 OS 的“心跳”,可称为滴答时钟,本质上来说便是一个定时器。
相同,在 startup_stm32f10x_hd.s 文件中 SysTick 的中止向量名为 SysTick_Handler,咱们本可依照上法持续编造,但由于 ST 规范库已经有相关库函数,所以咱们依照如下法子修正:
把 OS_CPU_C.C 文件中的 void OS_CPU_SysTickHandler (void)的内容代码复制到 stm32f10x_it.c
文件中的 SysTick_Handler (void)函数内;

并且在文件头部增加:#include


这姿态,替换后的 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(),而此函数咱们自己会完成,所以注释掉。
OS_CPU_SysTickClkFreq()界说在 BSP.C (MicriumSoftwareEvalBoards)中,而本文移植中并未用到BSP.C,后边咱们会自己完成,因而也将它注释掉,免除咱们和 Micrium 官方bsp 的依靠联系。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/259592.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部