这个函数里主要是OSTaskStkInit()函数和一些钩子函数,需要关心的是OSTaskStkInit()和OSTaskSwHook()。
OSTaskStkInit()是任务堆栈初始化函数,它由任务建立函数OSTaskCreateExt()调用,用于初始化任务的堆栈,堆栈的结构初始化成看起来刚刚发生过中断一样,所有的寄存器都被入栈。
OSTaskStkInit()函数有四个参数,task,p_arg,ptos,opt,它们和建立任务所使用的参数是一致的,具体的介绍可以看前面的日志。函数返回堆栈指针所指的地址。
当我们使用OSTaskCreateExt()来建立任务时,就把上述四个参数传递给OSTaskStkInit()函数,初始化好堆栈,再返回给OSTaskCreateExt()堆栈指针,继续走下去。
注意看OSTaskStkInit()函数代码最后,使用R0来传递参数,这是符合ARM汇编的规范,使用R0来传递第一个参数。
OSTaskSwHook()函数用于扩展任务切换代码的功能,他被OSStartHighRdy(),OSCtxSw(),OSIntCtxSw()调用。OSTaskSwHook()可以直接访问全局变量OSTCBCur 和OSTCBHighRdy。OSTCBCur 指向被切换出去的任务OS_TCB,而OSTCBHighRdy 指向新任务OS_TCB。注意在调用OSTaskSwHook()期间中断一直是被禁止的。
|
|