UCOS-II OSStartHighRdy函数移植

UCOS-II启动多任务环境的函数是OSStart();用户在调用OSStart()前,必须已经建立了一个或多个任务。OSStart()最终调用OSStartHighRdy()运行多任务启动前优先级最高的任务。OSStartHighRdy()代码是用汇编写的,在文件OS_CPU_A.S中。

函数如下:

clip_image002

代码分析如下:

1:进入系统模式,并关闭IRQ,FIQ中断

2:调用OSTaskSwHook(),这是钩子函数,一般为空,用户可以视需要自己添加内容。也可以不调用。

3、LDR R4, =OSRunning的LDR是伪指令,‘=’是LDR作为伪指令和标准指令的区别。

这条指令的作用是把变量OSRunning的地址送给R4。OSRunning是UCOS系统己经启动的一个标识,它在调用UCOS中的OSStart时被置为1。

4、OS_EXT OS_TCB *OSTCBHighRdy;

OSTCBHighRdy是一个指针,指向最高优先级任务的任务控制块,任务控制块的第一个内容是任务的堆栈指针,所以OSTCBHighRdy地址存的值也就是任务控制块的堆栈指针。

LDR R4, =OSTCBHighRdy

LDR R4, [R4]

LDR SP, [R4]

这3条指令是把最高优先级任务的堆栈指针送到ARM的SP寄存器中

5、LDMFD SP!, {R4}

从任务堆栈中取出最后压入堆栈的CPSR的值,送到R4,!表示SP自动加4

MSR CPSR_cxsf, R4

c - control field mask byte (PSR[7:0])
x - extension field mask byte (PSR[15:8])
s - status field mask byte (PSR[23:16)
f - flags field mask byte (PSR[31:24]).

把R4的值保存到CPSR中。

6、LDMFD SP!, {R0-R12, LR, PC}

把堆栈的数据送到R0-R12,LR,PC,系统开始执行最高优先级任务。

© 版权声明
THE END
喜欢就支持以下吧
点赞0
分享
评论 抢沙发