UCOS-II OSStartHighRdy函数移植
UCOS-II启动多任务环境的函数是OSStart();用户在调用OSStart()前,必须已经建立了一个或多个任务。OSStart()最终调用OSStartHighRdy()运行多任务启动前优先级最高的任务。OSStartHighRdy()代码是用汇编写的,在文件OS_CPU_A.S中。
函数如下:
代码分析如下:
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,系统开始执行最高优先级任务。来源于http://www.dpj365.com/?p=108