首先到ucos的官网上下载ucosii的源码(实际上是很多已经移植好的目标板,寻找下你说需要的板子是否在其上),找到一个相似的板子的源码。我们的设备是开发板Help2416;采用的源码是Micrium-uCOS-II-V290,参考源码Micrium_STM32xxx_uCOS-II。在Micrium\AppNotes\AN1xxx-RTOS\AN1018-uCOS-II-Cortex-M3\这个路径下的AN-1018.pdf非常重要,这文档详细的介绍了文件夹结构,关系,以及移植的细节。下面我们来慢慢分析。
首先参考STM32工程建立Ports\arm2416\Generic\MDK路径,此路径主要存放移植相关的代码。新建
- OS_CPU.H
- OS_CPU_C.C
- OS_CPU_A.ASM
- OS_DBG.C //needless
OS_CPU.h中一般声明了常量,宏和基本类型定义。先按照AN1018.pdf中的步骤来一步一步制作:
先定义全局变量与外部定义符号
- #ifdef OS_CPU_GLOBALS
- #define OS_CPU_EXT
- #else
- #define OS_CPU_EXT extern
- #endif
这是一个很智能的宏,在一些必要函数前加上,宏的定义位置就取决于文件中是否定义了OS_CPU_GLOBALS.
2.定义了基本数据
- 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;
由于都是32位小端,基本上基本类型都没有什么可修改的,继续往下看。(在实际的工作中,需要按照目标CPU的位宽修改基本类型,以满足有/无符号及位宽。
1.设置临界区模式
这里我们用常用的模式3,具体为什么不用模式1, 模式2,还不是很清楚,求了解的大大告之:eagleqingluo@gmail.com。
这里的实质就是将CPSR暂存于cpu_sr这个unsigned long型的临时变量里面(内核使用到的时候已经自动添加了定义)。
- #define OS_CRITICAL_METHOD 3
- #define OS_ENTER_CRITICAL() { cpu_sr = OS_CPU_SR_Save();}
- #define OS_EXIT_CRITICAL() {OS_CPU_SR_Restore(cpu_sr);}
2.设置堆栈增长方向
1表示从高地址到低地址(实际上,除了个别8位单片机及特殊用途的芯片,大多数都是这样的)。 3.定义上下文切换函数
- #define OS_STK_GROWTH 1
OSCtxSw()稍后我们会在os_cpu_a.s中实现。
- #define OS_TASK_SW() OSCtxSw()
4.定义函数原型
- #if OS_CRITICAL_METHOD =