我正在为我的一个项目使用FreeRTOS,我正在阅读文档,有些东西我无法理解。我知道上下文切换是在触发滴答中断时发生的,所以调度程序执行它的工作,并卸载等待事件的任务,并选择处于就绪状态的更高优先级的任务。但是,当任务在滴答中断之前阻塞时会发生什么呢?文档似乎暗示立即发生上下文切换(例如,两个任务具有不同的优先级,每个任务调用vTaskDelay()来释放CPU时间片)。这是怎么发生的?我搜索了一下,但没有找到任何答案。
编辑在我的FreeRTOS端口(SAMD21 Cortex-M0+)使用portYIELD()宏,它只是请求SVCall异常,所以这是执行上下文切换的机制(除了运行在滴答中断上的调度程序之外)吗?
发布于 2017-01-27 17:40:12
有关于taskYIELD的文档。此函数可用于请求上下文切换,因此不需要等待滴答。上下文切换是一种特权操作,所以通常是通过软件中断来实现的。在你的例子中,PendSV和SVCall。
如果所有任务都被阻塞(例如被vTaskDelay阻塞),那么FreeRTOS正在运行空闲任务。vTaskDelay在内部使用portYIELD请求上下文切换,因为无法继续当前任务。
您还需要了解一些关于先发制人多任务的知识,才能在这种模式下理解FreeRTOS。
编辑2016-01-29:
taskYIELD/portYIELD。因此,您的当前任务将被阻塞,并且FreeRTOS将重新调度到最高优先级任务,该任务可以运行(也不会被阻塞),或者如果没有能够运行的任务,则重新调度到空闲任务。xQueueReceive可以有两种可能性。队列中有一些元素,所以它是POPed。队列中没有元素,因此任务被切换到阻塞状态,并为您调用FreeRTOS,因此FreeRTOS重新定位到另一个任务。xQueueSend可以有两种可能性。队列中没有空间,所以任务会被阻塞,直到有一些空间。至少有一个空闲元素,因此可以推送到队列中。从队列接收元素或将元素发送到队列可以唤醒其他更高优先级的任务,即执行oposite但当前被阻塞。FreeRTOS将立即重新安排时间。
这也可以通过中断处理程序来完成。您可以使用处理程序任务,即等待某个队列。从中断中,您将一些元素放到队列中。中断结束后,FreeRTOS将重新安排到该队列上等待的任务。在这项任务上有足够的高度优先地位是有充分先决条件的。这是有好处的,你没有在中断中做什么-只是一些清理和发送项目到队列-这是短期的操作。xTimerPendFunctionCallFromISR也可以处理中断,这也是处理中断的另一种方式。
也请阅读关于FreeRTOS基本原理的文章。关于它有几个章节,它是互文阅读。
发布于 2017-01-27 22:40:37
每当操作系统调用(如TaskDelay )或将项发送到队列或释放资源时,如果另一个其他任务已准备好运行,如果更高优先级的任务准备运行,则操作系统将抢占当前任务。基本上,准备运行的最高优先级任务都将运行。时间切片只在两个或两个以上具有同等和最高优先级的任务准备好运行时才会发生。
是的,中断正在运行。在皮层-m上,PENDSV中断执行上下文切换。
发布于 2017-01-28 00:10:29
当当前正在运行的任务阻塞时,您是否在询问要切换到另一个任务时必须做什么?或者你是在问如何执行上下文切换的机制?真的不清楚。
如果您在询问如何在一个任务阻塞时切换到另一个任务,那么答案是没有意义的,这就是RTOS为您做什么的基本原理。例如,如果调用vTaskDelay()或指定阻塞时间的xQueueReceive(),则任务进入阻塞状态。当任务被阻塞时,它无法运行,因此RTOS中的调度算法选择要运行的下一个任务并开始运行该任务。
https://stackoverflow.com/questions/41898581
复制相似问题