[软件资料] freertos关闭任务调度

[复制链接]
864|10
 楼主| forgot 发表于 2024-8-23 13:48 | 显示全部楼层 |阅读模式
#include "FreeRTOS.h"
#include "task.h"

/* 关闭任务调度 */
void disable_task_scheduling()
{
    vTaskSuspendAll();  // 关闭调度器

    /* 在这里执行需要原子操作的代码,例如修改全局变量 */

    /* 重新启用调度器 */
    xTaskResumeAll();
}

/* 示例任务 */
void example_task(void *pvParameter)
{
    for(;;)
    {
        vTaskDelay(1000);  // 延时1000个tick

        /* 调用关闭任务调度的函数 */
        disable_task_scheduling();
    }
}


磨砂 发表于 2025-9-4 17:55 | 显示全部楼层
调用[size=0.875]vTaskSuspendAll()函数会暂停所有任务的切换,使当前正在运行的任务持续执行直至遇到[size=0.875]xTaskResumeAll()为止

晓伍 发表于 2025-9-4 20:18 | 显示全部楼层
[size=0.875]vTaskSuspendAll()[size=0.875]xTaskResumeAll()之间不能调用任何可能引发任务切换的API
八层楼 发表于 2025-9-5 08:39 | 显示全部楼层
每次调用[size=0.875]vTaskSuspendAll()后必须通过[size=0.875]xTaskResumeAll()恢复调度
观海 发表于 2025-9-5 10:45 | 显示全部楼层
关闭任务调度仅阻止任务间的上下文切换,不涉及中断
guanjiaer 发表于 2025-9-5 13:08 | 显示全部楼层
由于不阻塞中断处理,调度锁对系统实时性的干扰较小,适合短周期的关键操作
heimaojingzhang 发表于 2025-9-5 15:39 | 显示全部楼层
static void vTaskExample(void *pvParameters) {
    while (1) {
        vTaskSuspendAll();          // 关闭任务调度
        // 执行不允许被打断的操作(如更新显示器缓冲区)
        xTaskResumeAll();           // 恢复任务调度
        vTaskDelay(pdMS_TO_TICKS(500)); // 模拟其他工作负载
    }
}


keaibukelian 发表于 2025-9-5 17:58 | 显示全部楼层
长时间持有调度锁可能导致低优先级任务饥饿
paotangsan 发表于 2025-9-5 20:17 | 显示全部楼层
虽然调度锁不抑制中断,但在中断服务程序中使用会话管理函数仍需谨慎,因其可能间接触发任务切换逻辑
renzheshengui 发表于 2025-9-6 07:37 | 显示全部楼层
确保屏幕刷新过程不受其他任务干扰,完成后立即恢复调度以维持多任务协作
wowu 发表于 2025-9-6 09:57 | 显示全部楼层
FreeRTOS提供的[size=0.875]vTaskSuspendAll()/[size=0.875]xTaskResumeAll()组合是实现任务调度临时禁用的标准方法,适用于需要短时间独占CPU的场景
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2112

主题

14683

帖子

59

粉丝
快速回复 在线客服 返回列表 返回顶部