在OSTaskSwHook()中,用户可以访问这两个任务的OS_TCB。如果不使用对外接口函数,请在头文件中把相应的开关选项关闭,加快任务切换的速度。 程序清单L 9.4 OSCtxSw(). _OSCtxSw PROC FAR (1) ; PUSHA ; 保存当前任务环境 (2) PUSH ES (3) PUSH DS (4) ; MOV AX, SEG _OSTCBCur ; 载入DS MOV DS, AX...
在uC/OS-II中, 就绪任务的栈结构总是看起来跟刚刚发生过中断一样, 所有微处理器的寄存器都保存在栈中。 换句话说, uC/OS-II运行就绪态的任务所要做的一切, 只是恢复所有的CPU寄存器并运行中断返回指令。 为了做任务切换, 运行OS_TASK_SW(),人为模仿了一次中断。 多数微处理器有软中断指令或者陷阱指令TRAP来...
在uC/OS-II中, 就绪任务的栈结构总是看起来跟刚刚发生过中断一样, 所有微处理器的寄存器都保存在栈中。 换句话说, uC/OS-II运行就绪态的任务所要做的一切, 只是恢复所有的CPU寄存器并运行中断返回指令。 为了做任务切换, 运行OS_TASK_SW(),人为模仿了一次中断。 多数微处理器有软中断指令或者陷阱指令TRAP来...
任务切换OS_TASK_SW()的代码 Void OSCtxSw(void) { 将R1,R2,R3及R4推入当前堆栈; OSTCBCurOSTCBStkPtr = SP; OSTCBCur = OSTCBHighRdy; SP = OSTCBHighRdy OSTCBSTKPtr; 将R4,R3,R2及R1从新堆栈中弹出; 执行中断返回指令; } C/OS-II的任务管理...
IRET; //中断返回,使PC指向切换后的任务。} 那么由什么来引发中断的,这就是宏 OS_TASK_SW()...
OS_TASK_SW()函数用于实现任务级别的任务切换。根据前面介绍的MPC5604B异常向量表,采用位于中断向量表偏移地址为0x0080(IVOR8)的系统调用(system call)异常来实现该函数,程序如下: #define OS_TASK_SW() asm(“se_sc”); 2.3 实现OSTaskInit()函数 ...
最后宏调用OS_TASK_SW()来完成实际上的任务切换[L3.8(6)]。 任务切换很简单,由以下两步完成,将被挂起任务的微处理器寄存器推入堆栈,然后将较高优先级的任务的寄存器值从栈中恢复到寄存器中。在μC/OS-Ⅱ中,就绪任务的栈结构总是看起来跟刚刚发生过中断一样,所有微处理器的寄存器都保存在栈中。换句话说,μ...
OS_Sched(); /* Find next task to run! */ } } OS_Sched()函数完成任务级的调度,该函数完成了前一个任务CPU寄存器的入栈和后一个任务CPU寄存器的出栈,并且在最后做了一次“模拟”中断返回的操作,这个操作是由OS_TASK_SW()函数里完成的。 void OS_Sched (void) ...
(3)基于软件的栈溢出检测 任务切换时会调用一个钩子函数:OSTaskSwHook(),这允许程序员在任务切换时扩展一些功能。所以,如果处理器没有硬件栈指针溢出检测的机制的话,可以通过在钩子函数中添加些代码来模拟出这个机制。由于软件实现没有硬件监测来的及时,.StkLimitPtr设置时需要留下更多空间。 (4)统计剩余栈空间 ...
L(3)(4)(5)通过一种叫优先级位图法的方式找到优先级最高的任务的TCB指针,优先级位图法实现细节参见《嵌入式操作系统》2.4.2节。最核心的就是L(7)这个OS_TASK_SW(),真正的任务上下文切换就发生在这里面,里面是纯ARM汇编代码,与CPU硬件直接相关,在详细讲解之前还需要从CPU角度理解一个任务是什么样子。