在看《嵌入式实时操作系统UCOS-II(第2版)》时,文中说OSStartHighRdy()函数的功能是运行最高优先级的就绪任务,用户需要将所有的处理器寄存器安顺序从任务堆栈中恢复出来,并执行中断返回;但是我在看nios的移植代码时发现许多与原文要求不同的地方。
下面是nios关于OSStartHighRdy()的代码部分:
/*********************************************************************************************************
* START THE HIGHEST PRIORITY TASK
* void OSStartHighRdy(void)
*
* Note(s): 1) Upon entry,
* OSTCBCur points to the OS_TCB of the task to suspend
* OSTCBHighRdy points to the OS_TCB of the task to resume
*
*********************************************************************************************************/
.global OSStartHighRdy
OSStartHighRdy:
/*
* disable interrupts so that the scheduler doesn't run while
* we're initialising this task.
*/
rdctl r18, status
subi r17, zero, 2 /* r17 = 0xfffffffe */
and r18, r18, r17
wrctl status, r18
/*
* Call the user definable OSTaskSWHook()
*/
call OSTaskSwHook
/*
* set OSRunning = TRUE.
*/
movi r18, 1 /* set r18 to the value 'TRUE' */
stb r18, %gprel(OSRunning)(gp) /* save this to OSRunning */
#if defined(ALT_STACK_CHECK) && (OS_TASK_CREATE_EXT_EN == 0)
mov et, zero /* Don't check stack limits */
stw et, %gprel(alt_stack_limit_value)(gp)
#endif
/*
* start execution of the new task.
*/
br 9b
这个代码首先没有将堆栈内容恢复到寄存器的步骤,其次有一个不太明白的地方就是最后一句 br 9b;按照资料上说,应该是执行中断返回的功能,但是9b是根据什么确定的呢?
|