停止和启动任务

时间:2019-01-15 20:51:22

标签: c scheduler freertos

所以。这是一个抽象的问题。
在学习FreeRTOS时,我陷入了一些问题。

作为背景,我试图使一个函数的led闪烁,并且关于它是在for(;;)内部还是外部而闪烁,这在某种程度上与任务仅在for内部运行这一事实并没有加在一起(;;)在初始化/第一次运行之后循环。

尽量清晰:

  

任务函数永远不应该返回,因此通常实现为连续循环。

任务定义为:

void vATaskFunction( void *pvParameters )
{
    for( ;; )
    {
        -- Task application code here. --
    }

    /* Tasks must not attempt to return from their implementing
    function or otherwise exit.  In newer FreeRTOS port
    attempting to do so will result in an configASSERT() being
    called if it is defined.  If it is necessary for a task to
    exit then have the task call vTaskDelete( NULL ) to ensure
    its exit is clean. */
    vTaskDelete( NULL );
}

知道了,我的问题是:

  • 如果任务是无限循环,那么调度程序如何将其挂起(切换到另一个任务)?
  • 局部变量中的当前值会怎样?
  • 切换回我们的任务时,任务是否像通常一样直接在for(;;)循环内跳转,或者正常地通过函数?

1 个答案:

答案 0 :(得分:2)

任务有它们自己的堆栈,因此保留了局部变量值。

RTOS的工作方式与“普通” OS-es完全不同。

如果只有一项优先级最高的任务(而其他许多优先级较低的任务)则必须将控制权交还给系统。当任务进入“挂起”或“阻止”状态时,会发生这种情况。否则,它将从不被抢占。 (当然会触发中断)。

例如:如果您启动任务 A B ,则任务 A 的优先级高于 B < / strong>,如果任务 A 不会通过进入“挂起”或“阻止”状态(例如,通过等待通知,信号灯,互斥或其他方式)将控制权交还给系统,则任务 A 将有100%的执行时间,任务 B 0%(零)

如果有多个任务具有相同的最高优先级,则会发生循环优先。无论如何,在嵌入式RTOS开发中这是非常不常见的情况。