linux ucos3开发环境,移植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.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

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

Type

Size in bits

Natural alignment in bytes

char

8

1 (byte-aligned)

short

16

2 (halfword-aligned)

int

32

4 (word-aligned)

long

32

4 (word-aligned)

long long

64

8 (doubleword-aligned)

float

32

4 (word-aligned)

double

64

8 (doubleword-aligned)

long double

64

8 (doubleword-aligned)

All pointers

32

4 (word-aligned)

_Bool

8

1 (byte-aligned)

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

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 Guide中Using 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);0b1331709591d260c1c78e86d0c51c18.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值