微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ucosii在stm32上的移植详解3

ucosii在stm32上的移植详解3

时间:11-09 来源:互联网 点击:
移植详解1和2中主要讲了移植需要用到的基础知识,本文则对具体的移植过程进行介绍。

首先从micrium网站上下载官方移植版本(编译器使用ARM/Keil的,V2.86版本,V2.85有问题)。
下载地址:http://micrium.com/page/downloads/ports/st/stm32
解压缩后得到如下文件夹和文件:
Micrium\
AppNotes
Licensing
Software
ReadMe.pdf

AppNotes包含ucosii移植说明文件。这两个文件中我们仅需关心Micrium\AppNotes\AN1xxx-RTOS\AN1018-uCOS-II-Cortex-M3\AN-1018.pdf。因为这个文件对ucosii在CM3内核移植过程中需要修改的代码进行了说明。
Licensing包含ucosii使用许可证。
Software下有好几个文件夹,在本文的移植中仅需关心uCOS-II即可。
CPU: stm32标准外设库
EvalBoards: micrium官方评估板相关代码
uc-CPU: 基于micrium官方评估板的ucosii移植代码
uC-LCD:micrium官方评估板LCD驱动代码
uc-LIB: micrium官方的一个库代码
uCOS-II: ucosii源代码
uC-Probe: 和uC-Probe相关代码
ReadMe.pdf就不说了。

好了,官方的东西介绍完了,该我们自己建立工程着手移植了。关于建立工程,并使用stm32标准外设库在我之前的文章《stm32标准外设库使用详解》已有介绍,这里请大家下载其中模板代码(http://download.csdn.net/source/3448543),本文的移植是基于这个工程的。
建立文件夹template\src\ucosii, template\src\ucosii\src, template\src\ucosii\port;
把Micrium\Software\uCOS-II\Source下的文件拷贝至template\src\ucosii\src;
把Micrium\Software\uCOS-II\Ports\ARM-Cortex-M3\Generic\RealView下的文件拷贝至

template\src\ucosii\port;
ucosii\src下的代码是ucosii中无需修改部分,ucosii\port下的代码是移植时需要修改的。为防止对源码的误改动造成移植失败,可以把ucosii\src下的代码文件设为只读。
这里根据AN-1018.pdf和移植详解1、2中介绍的移植基础知识,对ucosii\port下的代码解释一下。

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);

void OS_CPU_SysTickHandler(void);
void OS_CPU_SysTickInit(void);
INT32U OS_CPU_SysTickClkFreq(void);

申明几个函数,这里要注意最后三个函数需要注释掉,为什么呢?
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 (Micrium\Software\EvalBoards)中,而本文移植中并未用到BSP.C,后面我们会自己实现,因此可以把它注释掉。

os_cpu_c.c
ucosii移植时需要我们写10个相当简单的C函数。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top