FreeRTOS 中的 task 优先级 及 实际测试验证

官方文章在这里:https://www.freertos.org/taskandcr.html

Task 可以理解为 线程 ,线程当然就是优先级(priority)的概念,如果两个线程,有不同的优先级,当然就是优先级高的优先执行(占用CPU资源)。 那问题来了, 是怎么 占用 呢?

如果一个线程A在运行过程中,另一个优先级更高的线程B启动了(进入 Ready 状态),则B会立即执行(进入 Running 状态),A则立马会停止(进入 Ready 状态)

现在做一个测试程序来验证一下,

测试环境:ESP32-WROOM-32E/IDF v4.3

代码如下:2个线程,task2 高(priority=2) task1 低(priority = 1)


void my_delay(int val)
{
    for (int k = 0; k < 10; ++k)
    {
        int i = 0;
        for (; i < 100; ++i)
            for (int j = 0; j < 10000; ++j)
                ;

        printf("in dealy... %d\n", val);
    }
}

void task(void * pvParameters)
{
    int flag = *(int*)pvParameters;

    while (true)
    {
        int tick = XTHAL_GET_CCOUNT();
        printf("%d:task%d running...\n", tick,flag);
        my_delay(flag);

        printf("%d:task%d running...DONE.%d\n", tick, flag,XTHAL_GET_CCOUNT());

        vTaskDelay(2000 / portTICK_PERIOD_MS);//SLEEP 2秒钟
    }
}


void app_main(void)
{
    /* Print chip information */
    esp_chip_info_t chip_info;
    esp_chip_info(&chip_info);
    printf("This is %s chip with %d CPU core(s), WiFi%s%s, ",
           CONFIG_IDF_TARGET,
           chip_info.cores,
           (chip_info.features & 
<think>好的,用户想了解如何在STM32 CubeMX中自动生成FreeRTOS任务优先级配置表的方法或教程。首先,我需要回忆CubeMX的使用流程,特别是与FreeRTOS相关的配置部分。 根据引用内容,FreeRTOS的任务优先级数值越大优先级越高,而STM32的中断优先级数值越小越高。用户可能需要明确这两者的区别,避免配置错误。CubeMX中配置任务优先级通常是在任务创建时手动设置,但用户希望自动生成配置表,这可能涉及到导出配置或生成文档的功能。 接下来,我需要检查CubeMX是否有生成配置表的功能。通常CubeMX生成代码后,会在工程文件中包含FreeRTOS的配置文件,比如FreeRTOSConfig.h,其中定义了任务优先级和其他参数。用户可能需要从这里提取信息制作表格。 另外,引用中提到CubeMX结合FreeRTOS源码解析,可能涉及通过CubeMX界面配置任务优先级,并生成初始化代码。虽然CubeMX本身可能不直接生成表格,但用户可以通过生成的代码或使用脚本提取相关配置信息,整理成表格。 可能的步骤包括:在CubeMX中配置任务优先级,生成代码,然后从生成的代码中提取任务名称和优先级,手动或使用工具生成表格。此外,是否有第三方工具或插件可以自动化这个过程?需要验证是否有相关教程或社区资源。 还需要考虑用户的实际需求,他们可能希望有一个清晰的优先级列表,以便管理多个任务,避免优先级冲突。因此,回答应指导用户如何在CubeMX中配置优先级,并建议导出方法,比如查看生成的代码或使用文档工具。 最后,确保引用正确,特别是关于优先级数值的差异,提醒用户注意任务和中断优先级的区别,避免配置错误导致系统异常。</think>### STM32 CubeMX中FreeRTOS任务优先级配置表生成方法 在STM32CubeMX中配置FreeRTOS任务优先级时,虽然没有直接生成"优先级配置表"的图形化工具,但可以通过以下步骤实现配置信息的整理与导出: --- #### **步骤1:通过CubeMX界面配置任务优先级** 1. 在CubeMX的 **Middleware > FREERTOS** 中,选择`Tasks and Queues`标签; 2. 为每个任务设置名称(Task Name)和优先级Priority)。FreeRTOS任务优先级数值越大,优先级越高(与中断优先级相反)[^1][^2]; 3. 示例配置: - Task1: Priority=3 - Task2: Priority=2 - Idle Task: Priority=0(系统默认,不可修改) --- #### **步骤2:生成代码后提取优先级信息** CubeMX生成代码后,任务优先级会体现在以下两个文件中: 1. **`FreeRTOSConfig.h`**:定义系统最大优先级 ```c #define configMAX_PRIORITIES (7) // 优先级范围:0~6 ``` 2. **`freertos.c`**:任务初始化代码 ```c osThreadDef(Task1, StartTask1, osPriorityHigh, 0, 128); // Priority=3(osPriorityHigh对应数值) osThreadDef(Task2, StartTask2, osPriorityNormal, 0, 128); // Priority=2 ``` 可通过脚本或手动提取任务名称和优先级生成表格。 --- #### **步骤3:使用文档工具生成表格** 推荐方法: 1. **Doxygen注释**:在任务函数前添加注释,利用文档生成工具提取优先级; ```c /** * @brief Task1 - 优先级3 */ void StartTask1(void const * argument) {...} ``` 2. **Excel/文本处理工具**:从代码中复制任务定义,使用正则表达式提取任务名和优先级。 --- #### **关键注意事项** 1. FreeRTOS任务优先级与STM32中断优先级方向相反:任务数值越大优先级越高,中断数值越小优先级越高[^1]; 2. 确保任务优先级不超过`configMAX_PRIORITIES - 1`; 3. 空闲任务(Idle Task)固定为优先级0,不可占用。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值