该文件主要包括一些钩子函数,以及任务堆栈初始化函数,通常ucosII只会调用任务堆栈初始化函数OSTaskStkInit,其他的钩子函数留由用户扩展程序功能使用。
钩子函数主要用于系统初始化,与任务相关等。如系统初始化OSInitHookBegin(),创建任务时OSTaskCreateHook
一 系统滴答OS_CPU_SysTickHandler
由于我们使用ST库里面的SysTick系统滴答函数接口,因此一般屏蔽掉这里的systick相关的定义
OSInitHookbegin
这个函数被OSInit()开头调用
OSTaskStkInit:
初始化任务堆栈是为任务切换服务的。当中断发生,原来函数执行的地方(程序计数器PC,处理器状态寄存器及通用寄存器)被保存到栈里,然后开始取中断向量,跑到中断函数里执行。执行完,把栈中保存的原来函数执行信息恢复即可。OSTaskStkInit被任务创建函数调用,在开始时,在栈中做出该任务被中断的假象。因此OSTaskStkInit的工作就是在任务自己的栈中保存cpu所有的寄存器
函数有多个输入参数,返回堆栈指针
输入参数task:执行任务代码的指针
输入参数p_arg:用户输入参数数据块指针
输入参数ptos:栈顶指针,指向堆栈顶
输入参数opt:控制选型,本函数不使用
xPSR=0x01000000L,xPSR T位置1(24位),否则第一次执行任务Fault
PC指向任务入口
R14最低四位为E,主要目的是不让使用R14
函数在任务创建时初始化任务堆栈由于需要输入用户参数,因此寄存器R0用来传递输入用户参数p_arg,由于任务初始运行时,其对应的cpu寄存器值不重要,为了调试方便,移植时对堆栈中各个cpu寄存器赋予的初值为寄存器号。
CM3内核使用了一种满级递减的堆栈操作模式,即初始堆栈为高地址处,随着堆栈的使用,堆栈指针移向低地址处。Ptos指向任务堆栈的栈顶,而stk指向当前堆栈的使用位置处。