设为首页 加入收藏

TOP

移植uCOS-II到Cortex-M3平台
2014-11-24 03:19:55 来源: 作者: 【 】 浏览:1
Tags:移植 uCOS-II Cortex-M3 平台

本文的目的是希望读者能够通过本文的内容掌握移植uCOS-II 的规范方法。如果只是需要移植文件,可以直接去Micriμm的官网上下载。


移植uCOS-II,主要的移植工作是编写如下三个文件:


OS_CPU.H


OS_CPU_C.C


OS_CPU_A.ASM


下面就按照这三个文件的顺序来介绍。本文以STM32F107+RealView Compiler 开发环境为例。如果使用的其他的开发环境,个别代码可能需要做些小修改。




OS_CPU.H 的第一部分是定义了一个宏OS_CPU_EXT。这一部分暂时可以先不去管。


#ifdef OS_CPU_GLOBALS


#define OS_CPU_EXT


#else


#define OS_CPU_EXT extern


#endif


接下来是一系列的类型定义。这一部分的移植需参考RealView Compiler Reference Guide的如下章节:


RealView Compiler Reference Guide->C and C++ Implementation Details->Basic data types


从这里可以得到如下信息。


根据上面的信息,形成下面的代码:


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;


上面代码中OS_STK 表示堆栈出栈、入栈的基本数据长度。我们知道Cortex-M3 的所有堆栈操作都是以字为单位的,所以这里为 unsigned int 型。OS_CPU_SR 对应的是程序状态寄存器PSRs,自然也是unsigned int 型。


然后是关于临界区的处理,一般来说我们都喜欢使用第三种方法来实现临界区,这里也不例外。这里多说几句,第一种直接开关中断的实现临界区的方法很少采用,因为这种方法可能将原本关闭了的中断意外的打开。第二种方法是最高效的实现方法,但是这种方法调整了堆栈指针,对于需要利用堆栈指针间接寻址局部变量的系统并不适用。(x86通常采用第二种方法,因为它有单独的寄存器来做局部变量的寻址)第三种方法最保险,虽然效率比第二种方法略低一点。


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


#if OS_CRITICAL_METHOD == 3
OS_CPU_SR OS_CPU_SR_Save(void);
void OS_CPU_SR_Restore(OS_CPU_SR cpu_sr);
#endif


这两个函数可以用汇编(OS_CPU_A.ASM)来编写:


EXPORT OS_CPU_SR_Save
  EXPORT OS_CPU_SR_Restore
OS_CPU_SR_Save
MRS R0, PRIMASK ; Set prio int mask to mask all (except faults)
CPSID I
BX LR


OS_CPU_SR_Restore
MSR PRIMASK, R0
  BX LR


也可以通过C代码(OS_CPU_C.C)中插入汇编的方式来实现:


__asm OS_CPU_SR OS_CPU_SR_Save(void)
{
MRS R0, PRIMASK ; Set prio int mask to mask all (except faults)
CPSID I
BX LR
}
__asm void OS_CPU_SR_Restore(OS_CPU_SR cpu_sr)
{
MSR PRIMASK, R0
BX LR
}


上面的代码利用的RealView Compiler 的特殊功能(Embedded assembler),如需进一步的信息,可以参考RealView Compiler Reference GuideUsing the Inline and Embedded Assemblers这一章的内容。


然后是堆栈增长方向,ARM Cortex-M3 的堆栈是倒生的:


#define OS_STK_GROWTH 1


任务切换,OSCtxSw()OS_CPU_A.ASM中定义:


#define OS_TASK_SW() OSCtxSw()


最后是一些函数原型声明:


void OSCtxSw(void);
void OSIntCtxSw(void);
void OSStartHighRdy(void);
void OS_CPU_PendSVHandler(void);
void OS_CPU_SysTickHandler(void);


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇arm6410按键驱动程序 下一篇使用hello-gl2建立ndk-gdb环境(有..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C语言中如何将结构体 (2025-12-24 22:20:09)
·纯C语言结构体成员变 (2025-12-24 22:20:06)
·C语言中,指针函数和 (2025-12-24 22:20:03)
·哈希表 - 菜鸟教程 (2025-12-24 20:18:55)
·MySQL存储引擎InnoDB (2025-12-24 20:18:53)