首页 > 解决方案 > 停止和启动任务

问题描述

所以。这是一个抽象的问题。
在学习 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 );
}

知道了,我的问题是:

标签: cschedulerfreertos

解决方案


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

RTOS 的工作方式与“普通”操作系统完全不同。

如果只有一项具有最高优先级的任务(以及许多其他具有较低优先级的任务),则必须将控制权交还给系统。它发生在任务进入暂停或阻塞状态时。否则它永远不会被抢占。(当然会触发中断)。

例如:如果您启动任务AB并且任务A的优先级高于B如果任务A不会通过进入 Suspended 或 Blocked 状态(例如通过等待通知,信号量、互斥量或其他)任务A将有 100% 的执行时间,而任务B将有0%(零)

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


推荐阅读