rtos - RTOS如何完成从中断的任务切换

标签 rtos freertos

假设有两个任务正在运行TASK_A和TASK_B。当TASK_A运行时,发生中断,需要将上下文切换到TASK_B。

在ISR内时,不应直接跳过TASK_B,因为它仍在ISR中并且尚未返回(例如:未执行RETI)。如果通常从ISR返回,它将照常返回TASK_A的最后一个程序计数器。因此,RTOS必须脱离ISR,并且一旦脱离ISR,就必须进行上下文切换到TASK_B。 RTOS退出ISR后如何立即获得控制权,而不是返回TASK_A。

如果从RTOS功能进行切换(例如在解锁互斥锁时),则可以通过备份寄存器进行直接切换。

RTOS如何处理这种情况

如果这是一个笼统的问题,请原谅我...

最佳答案

ISR必须以允许上下文切换的方式来实现。通常,在ISR结束时,将调用一个RTOS函数,以检查并执行上下文切换。

发生中断时,CPU保存其上下文并跳转到ISR。保存上下文的方式因CPU系列而异。 ISR完成后,应调用一个特殊的RTOS例程,该例程允许在ISR之后进行上下文切换。如果有更高优先级的任务准备运行,则此例程将执行上下文切换。它将采用CPU保存的中断前上下文并将其保存在TASK_A中。然后,它将获取已保存的TASK_B上下文并将其还原到CPU中,这样,当调用中断结束指令时,执行将返回TASK_B的上下文。

所有这些细节都非常依赖于CPU和RTOS。

关于rtos - RTOS如何完成从中断的任务切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28486242/

相关文章:

embedded - vxWorks "kernel shell"和 "host shell"有什么不同?

c++ - FreeRTOS(和其他 RTOS'es)也是一个框架吗

c - 首选 : Suspend all tasks OR mutex when accessing shared resource ? [freeRTOS]

c - 类型转换为非类型定义的结构

c - Linux内核中的udp_deliver api在哪里?

cortex-m - freertos vTaskDelete(NULL) 没有可用内存

c++ - FreeRTOS STM32 链接器堆栈大小与任务堆栈大小

c - 如何在 FreeRTOS 上模拟堆栈溢出

裸板上的 C++ 嵌入式系统

embedded - vxWorks 如何处理具有相同优先级的两个任务?