新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > uCOSii 在Coldfire MCF52235 上的移植

uCOSii 在Coldfire MCF52235 上的移植

作者:时间:2012-11-21来源:网络收藏

OS 定义了两个宏来关闭和使能中断: OS_ENT ER_CRITICAL( ) 和OS_EXIT _CRIT ICAL( ) 。C/ OS定义了三种方法来关闭和使能中断, 大多数情况下选择第三种方法。

# define OS_CRITICAL_METH OD # 3

# define OS_ENTER_CRITICAL( ) { cpu_sr = OS _CPU_

SR_Save( ) ; } / / 关中断

# def ineOS _ EXIT _ CRITICAL( ) { OS _ CPU _ SR_ Resto re

( cpu_sr) ; } / / 开中断

( 2) 任务层上下文切换。当C/ OS 调用OS _TASK_SW( ) 时发生任务层的上下文切换。因为上下

文切换是根据处理器的不同而不同的, 所以需要执行一个汇编的函数。在这种情况下, 用TRA P 指令来产

生一个异常, 用T RAP 指令的优点是能使它像发生了一次中断一样。这里用# 14 T RAP, 因为大多数情况

下, # 15 TRAP 被调试和监控程序保留了。# 14TRAP 定位于VBR+ 0x00B8, 然后跳转到相应的地址。

在这个向量处放置OSCtx Sw( ) 的地址。这个函数声明在OS_CPU_A. ASM 里。VBR 代表向量基址寄存器,

包含异常向量表的基址, 程序开始时被初始化为0x00000000, 但是在运行时可以改变。

# define OS_TASK_SW( ) asm( T RAP # 14; )

( 3) 堆栈的增长方向。 的堆栈增长方向是从高地址向低地址, 因此OS _ST K_GROWTH 置

为1。

# define OS_STK_GROWTH 1

2. 3. 2 OS_CPU _C. C 的

OS_CPU_C. C 里面包含10 个比较简单的C 语言函数, 一般来说C/ OS 只需要OST askStkInit ( ) 。其他函数是用来让用户在自己的程序里扩展操作系统功能的。如果需要使用这些函数, 需要在OS_CFG. H 里设置OS_CPU _HOOKS_EN 为1。堆栈的初始化: OSTaskStkInit ( ) 虽然是用C 语言编

写的, 但它是一个与CPU 硬件相关的函数。这个函数功能是初始化任务的堆栈, 由建立任务函数OSTask

Create( ) 或扩展地建立任务函数OSTaskCreateExit ( ) 调用。任务堆栈初始化的实质就是模拟一次中断, 使堆栈看起来就像刚发生过中断一样。任务堆栈中保存了任务代码的起始地址和一些CPU 寄存器的值, 一旦条件满足, 就可以执行该任务。初始化后的任务堆栈结构如图3所示。

image

2. 3. 3 OS_CPU_A. ASM 的

这个文件包含5 个相当简单的汇编函数, 因为一般不能用C 语言来保存和恢复寄存器。

( 1) OS_CPU_SR_Save( )

这个函数是通过保存中断屏蔽寄存器, 然后关闭中断来实现OS_CRITICAL_MET HOD # 3 的。当函数返回时, D0 包含了状态寄存器的内容, 里面包含当前的中断关闭状态。这个返回值被调用函数保存到变量

cpu_sr 中。

( 2) OS_CPU_SR_Restore( )

这个函数用来实现恢复中断屏蔽到调用OS _ENTER_CRITICAL( ) 之前的状态。也就是说调用OS_

ENTER_CRITICAL( ) 之前中断是关闭的, 那么在OS_EXIT_CRITICAL( ) 之后, 中断是关闭的。

( 3) OSStartHighRdy( )

这个函数被OSStar t ( ) 调用来运行优先级最高的任务。OSStar t ( ) 设置OSTCBHighRdy 指向优先级最高任务的OS _T CB。一旦从OSTaskSwHoo k( ) 返回,就把OSRunning 设为OS_T RU E, 它表明现在RT OS

将要运行。从最高优先级任务的OS_T CB 中恢复堆栈指针, 然后从任务堆栈里取出CPU 寄存器。最后执行

一个RET 指令, 这个指令可以从堆栈中弹出SR 和PC,现在的任务代码就开始执行。

( 4) OSCtx Sw( )

当一个任务不再运行时就会发生一个任务级的任务切换, 比如任务调用一个延迟10 个时钟节拍的函数。

这时, C/ OS 需要找出下一个最重要的任务准备去运行。OSCtx Sw ( ) 的功能是保存需要挂起的任务的CPU 寄存器和堆栈, 恢复需要运行任务的CPU 寄存器和堆栈。任务级上下文切换如图4 所示。

image

( 5) OSIntCtx Sw( )

当中断服务函数完成时, 调用OSIntEx it ( ) 函数去决定是否有一个更重要的任务比被中断的任务更需要执行。这种情况下, OSIntEx it( ) 决定运行哪个任务, 然后调用OSIntCtx Sw ( ) 。这种情况下, 中断服务程序已经保存了被中断任务的CPU 寄存器, 而需要做的只是去恢复新任务的CPU 寄存器。

2. 3. 4 OS_CPU _I. ASM 的编写

如果用到增强的乘法累加单元( eMAC) 模块, 在上下文切换和中断时就应该保存和恢复eMAC 寄存器。保

存和恢复eMAC 寄存器通过两个宏来实现[ 10] 。代码如下:

. macro OS_EM AC_SAVE

MOVE. L MACSR, D7

CLR. L D0

MOVE. L D0, M ACSR

MOVE. L ACC0, D0

MOVE. L ACC1, D1

MOVE. L ACC2, D2

MOVE. L ACC3, D3

MOVE. L ACCEXT01, D4

MOVE. L ACCEXT23, D5

MOVE. L MASK, D6

LEA 32( A7) , A7

MOVEM. L D0D7, ( A7)

. endm

. macro OS_EM AC_REST ORE

MOVEM. L ( A7) , D0D7

MOVE. L # 0, MACSR

MOVE. L D0, ACC0

MOVE. L D1, ACC1

MOVE. L D2, ACC2

MOVE. L D3, ACC3

MOVE. L D4, ACCEXT01

MOVE. L D5, ACCEXT23

MOVE. L D6, MASK

MOVE. L D7, MACSR

LEA 32( A7) , A7

. endm

2. 4 时钟节拍的产生

最后还需要编写利用片内定时器产生时钟节拍的中断服务程序。C/ OS要求微控制器提供一个简单的时钟, 用于任务的延时等功能。在此利用可编程中断定时器来产生时钟节拍中断。在定时器中断服务程序中调用OSTimeTick( ) 就产生了系统所需要的时钟节拍。C/OS中产生中断后的中断处理程序如下所示:

_BSP_TickISR:

MOVE. W # 0x2700, SR

LEA 60( A7) , A7



评论


相关推荐

技术专区

关闭