【问题标题】:How does the FreeRTOS kernel suspend a task on Arduino UNO?FreeRTOS 内核如何暂停 Arduino UNO 上的任务?
【发布时间】:2019-09-14 10:20:51
【问题描述】:

有一个FreeRTOS library for Arduino,据称甚至可以在 UNO 上运行。

我试图了解多任务操作系统如何在如此有限的硬件上运行的内部工作原理。我了解任务调度/切换的原理,但内核实际上是如何暂停一个任务以执行另一个任务?它如何中断(然后恢复)当前正在执行的代码?

我的猜测是一个调度的ISR(定时器)直接修改栈来改变指令指针,但是如果这样做的话,需要在切换任务前先复制栈和寄存器,然后恢复当前任务的栈/registers 在恢复执行之前。我不清楚它会如何做到这一点。

FreeRTOS 内核能否在例如Serial.println() 函数调用(或任何不包括cli() 的调用)中间切换任务?如果可以,它是如何做到的?

感谢您的澄清。

【问题讨论】:

    标签: arduino multitasking freertos


    【解决方案1】:

    我的猜测是一个调度的ISR(定时器)直接修改栈来改变指令指针,但是如果这样做的话,需要在切换任务前先复制栈和寄存器,然后恢复当前任务的栈/registers 在恢复执行之前。我不清楚它会如何做到这一点。

    你的猜测是正确的。如果您查看 port.c,您会看到,FreeRTOS makros portSAVE_CONTEXTportRESTORE_CONTEXT 分别是 pushs pops 当前运行任务的所有寄存器以执行任务切换。此外,看门狗定时器中断用于运行调度程序。

    只要启用并触发此看门狗定时器,任务切换就可以随时发生。所以在Serial.println这样的任何函数调用期间也可能发生切换。这意味着如果您从多个任务中调用此函数,您迟早会损坏串行流的输出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-12
      • 1970-01-01
      • 1970-01-01
      • 2016-08-26
      • 2020-03-19
      • 1970-01-01
      相关资源
      最近更新 更多