软中断的功能号包含在SWI指令中,程序通过读取该条指令的相应位段获得。由于ARM处理器具有两个指令集,其中指令的长度不同,SWI指令的功能号的位段也不同,所以,程序先判断在进入软中断前处理器是在什么指令集状态,通过读取指令,取得指令中的功能号;然后,程序用功能号与1比较,当功能号小于1时就是0了,就跳转到任务切换函数OS_TASK_SW()。当功能号等于1时,就跳转到第一次任务切换处,也就是_OSStartHigh Rdy。这两个功能不在C语言中实现,原因之一是因为它们需要明确的堆栈结构,这是C语言不能提供的;原因之二是两个任务切换程序本身是使用汇编编写,且同在os_cpu_asm这个文件中,使用汇编跳转十分方便。
其他功能由软件中断的C语言处理函数处理,它有两个参数,第一个就是功能号,存放在R0中,第二个是保存参数和返回值的指针,也就是堆栈中存储用户函数R0~R3的位置,实质就是当前堆栈指针的值,它存放在R1中。
2.OS_TASK_SW()和OSIntCtxSw()函数
OS_TASK_SW()函数是在μC/OS-II从低优先级任务切换到最高优先级任务时被调用的,它总是在任务级代码中被调用的。另一个OSIntExit()函数被用来在ISR中使得更高优先级任务处于就绪状态时,执行任务切换功能,它最终调用OSIntCtxSw()函数执行任务切换。OS_TASK_SW()是SWI软件中断的0号功能,通过调用OSIntCtxSw()函数实现。此时的堆栈结构如图6-3所示。同时,R3保存着SPSR。这样,如果中断调用OSIntCtxSw()时,需要相同的堆栈结构,R3也要保存SPSR,这需要中断服务程序保证。
图6-3 调用OSIntCtxSw()时的栈结构图(www.daowen.com)
OSIntCtxSw()的代码如下:
3.OSStartHighRdy()函数
μC/OS-II启动多任务环境的函数叫作OSStart(),用户在调用OSStart()之前,必须已经建立了一个或更多任务。OSStart()通过调用函数OSStartHighRdy()运行多任务启动前优先级最高的任务,它最终调用__OSStartHighRdy来实现的。__OSStartHighRdy的编写很简单,代码如下:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。