1. 准备源代码
在官网或者其他地方找到源代码,我所用版本为以前下载的版本号V2.51。源码有16个文件,其中体系结构无关的
OS_CORE.C OS_MBOX.C OS_FLAG..C
OS_SEM.C OS_Q.C OS_MUTEX.C
OS_TASK.C OS_TIME.C OS_MEM.C
uCOS_II.C (没用到) OS_CONFIG.H uCOS_II.H
INCLUDE.H
与体系结构相关的文件有三个
OS_CPU.H OS_CPU_A.S OS_CPU_C.C
二.选取开发环境ADS 1.2。(编译器的选择要考虑是否可以生成可重入性代码)
三.修改和体系结构有关的文件。主要有OS_CPU.H OS_CPU_A.S OS_CPU_C.C
1.修改OS_CPU.H OS_CPU.H
主要是定义了一些和具体CPU相关的常量,预编译器相关的数据类型。其中需要修改的有:
OS_CRITICAL_METHOD=3
这是关中断的方式,在这里选择OS_ENTER_CRITICAL(),而OS_ENTER_CRITICAL() 等价于(cpu_sr = OSCPUSaveSR()),这个函数在OS_CPU_A.S中,需要自己写。
#define OS_STK_GROWTH 1
这是栈生长方向,ADS1.2开发环境arm920t的堆栈生长方向为递减的也就是说从高地址向低地址方向生长,而且是满栈型的,就是栈指针指向有效的数据。
2.修改OS_CPU_C.C
OS_CPU_C.C主要定义了OSTaskStkInit()这个函数和其他一些hook扩展函数。Hook扩展函数不用修改,保持空。OSTaskStkInit()是堆栈初始化函数,用在建立任务的函数OSTaskCreate()中,初始化任务的栈,在arm920t中需要在栈中保存的寄存器和数据为
$task;
LR (R14)
R12
R11
R10
R9
R8
R7
R6
R5
R4
R3
R2
R1
R0 : (argument)
CPSR (最后栈指针指到这里,这是栈的顶部,也就是最小的地址)
所以堆栈初始化代码为下,可以看出任务堆栈不能小于16*4 byte,否则栈会溢出。
OS_STK *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt)
{
INT32U *stk;
opt = opt; /* 'opt' is not used, prevent warning */
stk = (INT32U *)ptos; /* Load stack pointer */
*(stk) = (OS_STK)task; /* Entry Point */
*(--stk) = (INT32U)0; /* LR (R14) */
*(--stk) = (INT32U)0; /* R12 */
*(--stk) = (INT32U)0; /* R11 */
*(--stk) = (INT32U)0; /* R10 */
*(--stk) = (INT32U)0; /* R9 */
*(--stk) = (INT32U)0; /* R8 */
*(--stk) = (INT32U)0; /* R7 */
*(--stk) = (INT32U)0; /* R6 */
*(--stk) = (INT32U)0; /* R5 */
*(--stk) = (INT32U)0; /* R4 */
*(--stk) = (INT32U)0; /* R3 */
*(--stk) = (INT32U)0; /* R2 */
*(--stk) = (INT32U)0; /* R1 */
*(--stk) = (INT32U)pdata; /* R0 : argument */
*(--stk) = (INT32U)0x00000013L; /* CPSR */
-
return ((OS_STK *)stk);