Freertos任务优先级 任务堆栈大小 任务频率

在FreeRTOS中,任务的优先级、堆栈大小和任务频率是任务配置的核心参数。以下一些详细介绍:


1. 任务优先级

  • 规则:

    • 数值越大,优先级越高(例如,优先级5的任务会抢占优先级2的任务)。
    • 优先级范围:0configMAX_PRIORITIES - 1(在FreeRTOSConfig.h中定义,默认通常为525)。
    • 高优先级任务会抢占低优先级任务,同优先级任务按时间片轮转调度(需启用configUSE_TIME_SLICING)。
  • 注意事项:

    • 避免过多高优先级任务,否则低优先级任务可能无法运行。
    • 实时关键任务(如中断服务、传感器采集)应分配高优先级。
  • 示例

    xTaskCreate(taskFunction, "Task1", 128, NULL, 3, NULL); // 优先级3
    xTaskCreate(taskFunction, "Task2", 128, NULL, 1, NULL); // 优先级1
    

2. 任务堆栈大小

  • 单位与计算:

    • 堆栈以**字(word)**为单位(32位系统为4字节/字)。
    • 示例:xTaskCreate(..., 1024, ...)表示分配1024字(即4096字节)。
  • 确定方法:

    1. 估算:根据局部变量、函数调用深度、中断嵌套等估算。
    2. 测试:使用uxTaskGetStackHighWaterMark()检测最小剩余堆栈。
    3. 溢出检测:启用configCHECK_FOR_STACK_OVERFLOW以捕获溢出。
  • 示例

    void taskFunction(void *pvParameters) {
        UBaseType_t highWaterMark = uxTaskGetStackHighWaterMark(NULL);
        printf("最小剩余堆栈: %d 字\n", highWaterMark);
    }
    

3. 任务频率

  • 控制方法:

    • 阻塞延时:使用vTaskDelay()vTaskDelayUntil()
    • 定时器触发:使用软件定时器或硬件中断。
  • API对比:

    • vTaskDelay(pdMS_TO_TICKS(100)):相对延时(从调用点开始阻塞100ms)。
    • vTaskDelayUntil(&lastWakeTime, pdMS_TO_TICKS(100)):绝对延时(固定周期,减少累积误差)。
  • 注意事项:

    • 实际频率受任务执行时间、中断和高优先级任务影响。
    • 确保任务执行时间小于周期时长,否则可能导致系统延迟。
  • 示例(10Hz任务):

    void taskFunction(void *pvParameters) {
        TickType_t lastWakeTime = xTaskGetTickCount();
        while(1) {
            // 任务逻辑
            vTaskDelayUntil(&lastWakeTime, pdMS_TO_TICKS(100)); // 精确100ms周期
        }
    }
    

总结

参数说明
优先级数值越大优先级越高,范围由configMAX_PRIORITIES定义。
堆栈大小以字为单位,通过uxTaskGetStackHighWaterMark()优化。
频率使用vTaskDelayUntil()实现稳定周期,避免任务执行时间超限。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值