月度归档:2017年11月

Lpc1768移植UCOS-II(三)

三、移植OS_CPU_A.ASM

1、移植OS_CPU_SR_Save() OS_CPU_SR_Restore()

clip_image002

OS_CPU_SR_Save()保存当前的开关中断状态到R0,使用R0是因为编译器一般用R0传递参数。然后关中断。

Bx LR

从被OS_CPU_SR_Save()函数中断的程序处继续执行。进入临界段。

OS_CPU_SR_Restore()恢复R0中保存的开关状态,

Bx LR

从被OS_CPU_SR_Restore()函数中断的程序处继续执行。退出临界段。

这里使用的是PRIMASK,PRIMASK用于除能在 NMI和硬 fault之外的所有异常。

FAULTMASK能关闭所有异常和硬fault。

这里使用PRIMASK而不是FAULTMASK,是因为出现硬fault,必须要去处理,硬fault不能被关掉。

继续阅读

Lpc1768移植UCOS-II(二)

二、移植OS_CPU_C.C

1、头文件包含,

clip_image002

ucos_ii.h中包含了头文件os_cpu.h,os_cpu.h中有一段代码如下:

clip_image004

在OS_CPU_C.C中定义宏OS_CPU_GLOBALS,表示在编译OS_CPU_C.C时,定义os_cpu.h中的全局变量,其它C文件在引用os_cpu.h时不能定义OS_CPU_GLOBALS,编译时只是声明全局变量。

2、定义SYSTICK相关寄存器

clip_image006

3、钩子函数定义

void OSInitHookBegin (void)

void OSInitHookEnd (void)

void OSTaskCreateHook (OS_TCB *ptcb)

void OSTaskDelHook (OS_TCB *ptcb)

void OSTaskIdleHook (void)

void OSTaskReturnHook (OS_TCB *ptcb)

void OSTaskStatHook (void)

void OSTaskSwHook (void)

void OSTCBInitHook (OS_TCB *ptcb)

void OSTimeTickHook (void)

这些钩子函数必须定义,但可以是空函数。

clip_image008

在OSInitHookBegin()中把定义的CPU异常堆栈清零,并把栈顶赋给OS_CPU_ExceptStkBase。

继续阅读

Lpc1768移植UCOS-II(一)

UCOS-II在不同芯片上的移植,和处理器相关的文件有

OS_CPU.H

OS_CPU_A.ASM

OS_CPU_C.C

这几个文件的一些函数或代码要根据芯片和编译器的特效来修改。

UCOS_II的配置文件

OS_CFG.H

这个文件的内容要根据实际的使用情况来修改。

一, 移植OS_CPU.H

1、数据类型移植:

clip_image002

2、定义临界段模式为3

clip_image004

3、定义堆栈为递减模式

clip_image006

4、定义一个宏

clip_image008

宏OS_TASK_SW()用来实现从低优先级任务切换到高优先级任务。在UCOS-ii核心代码中调用。汇编函数OSCtxSw()在OS_CPU_A.ASM中定义。

5、MSP主堆栈定义

clip_image010

clip_image012

操作系统启用后,MSP变为OS_CPU_ExceptStkBase的值,不是复位时取的堆栈值,这个堆栈的初始化是在OSInit()中的OSInitHookBegin()进行的。

6、函数声明:

clip_image014

这些函数分别在OS_CPU_A.ASM和OS_CPU_C.C中定义。注意SysTick_Handler()就是SYSTICK的中断处理函数,要和startup_LPC17xx.s中的中断向量表定义的SYSTICK中断函数名称对应起来。