"嵌入式操作系统uC/OS-II的实现细节"
在嵌入式实时操作系统(uC/OS-II)中,任务切换是系统运行的核心部分,它涉及到CPU上下文的保存和恢复,确保任务间的平滑过渡。标题提及的"648改为200Hz-数字信号处理第二版陈后金主编"可能是指一个特定的示例或教程,其中648可能是误写,实际应该指的是系统时钟频率从18.20648Hz提升至200Hz的过程。
在µC/OS-II中,任务切换通常在中断服务函数OSIntCtxSw()中执行,这个函数是与特定编译器相关的,因此在系统移植后可能会成为问题的来源,特别是如果系统在运行一段时间后出现死机,可能就是由于OSIntCtxSw()中堆栈指针的错误配置导致的。堆栈指针在任务切换中起着关键作用,因为它保存了任务的状态,包括寄存器的值。
当中断发生并执行OSIntCtxSw()时,当前任务的现场被保存,然后调用用户可自定义的OSTaskSwHook()函数。OSTaskSwHook()提供了对当前任务(OSTCBCur)和即将运行的任务(OSTCBHighRdy)的OS_TCB(任务控制块)的访问,用户可以在该函数中执行自定义操作。为了提高效率,如果不使用这个钩子函数,可以在头文件中关闭相应的选项。
任务切换继续进行,OSTCBHighRdy的值被复制到OSTCBCur,表明当前任务已更新,同时OSPrioHighRdy的优先级也被复制到OSPrioCur。接着,OSIntCtxSw()通过从新任务的OS_TCB中恢复SS和SP寄存器的值,然后执行一系列指令,如POP DS, POP ES, POPA以及中断返回指令IRET,来恢复新任务的CPU环境,从而完成任务切换。在这个过程中,中断被禁用以防止任何干扰。
关于"9.04.04 OSTickISR()",这涉及到系统时钟中断服务例程。在实时系统中,时钟节拍频率应在10到100Hz之间,但在PC环境中,硬件默认的时钟频率是18.20648Hz。为了适应uC/OS-II,时钟中断被设置为200Hz。中断向量0x08被重定向到OSTickISR(),原来的中断服务仍保留,但调用频率更高,每54.93ms一次。
在系统初始化后,µC/OS-II需要控制时钟中断的发生时间,以确保在OSStart()启动多任务环境后才开始调用OSTickISR()。这涉及到修改中断向量表,例如通过PC_DOSSaveReturn()函数保存DOS下的时钟中断向量,然后在适当的时候将中断向量0x08指向OSTickISR(),并将时钟节拍频率调整到200Hz。
这部分内容深入探讨了uC/OS-II在PC环境下的任务切换机制和时钟中断管理,是理解嵌入式实时操作系统内部工作原理的关键。