avenlee2023 2024-03-15 14:00 采纳率: 3.8%
浏览 69

ESP32 freertos任务调度

ESP32 +VSCODE+IDF环境,学习Freertos,创建两个基础任务(打印信息+延时),打印信息的时候,为什么不是一条接一条,而是每隔一段时间打出一大段,是哪里不对还是设置到什么地方吗,另外下载的时候有“W (176) spi_flash: Detected size(16384k) larger than the size in the binary image header(2048k). Using the size in the binary image header.”这个提示,是什么意思跟怎么处理呢?


```c
static void Poll_task(void *arg)
{
    while(1)
    {
        printf("Task_poll");
        vTaskDelay( 100 / portTICK_PERIOD_MS);
    }
}
static void Cnt_task(void *arg)
{
     while(1)
    {
        printf("Task_cnt");
        vTaskDelay( 100 / portTICK_PERIOD_MS);
    }
}
void app_main()
{ 
    xTaskCreate(Cnt_task, "Sys_Cnt_Task", 1024*2, NULL, configMAX_PRIORITIES-1, NULL);
    xTaskCreate(Poll_task, "Sys_Poll_Task", 1024*2, NULL, configMAX_PRIORITIES-2, NULL);
}

```

  • 写回答

3条回答 默认 最新

  • 檀越@新空间 2024-03-15 14:00
    关注

    avenlee2023 下午好🌅🌅🌅
    本答案参考ChatGPT-3.5

    在你的代码中,两个任务都有使用延时函数vTaskDelay()。vTaskDelay()函数会使任务挂起一段时间,让其他任务有机会执行。这就导致了当一个任务在执行时,它会一直打印一大段信息,而此时其他任务被暂时挂起了。所以你看到的是一大段一大段的打印信息。

    要实现任务之间轮流打印信息的效果,你可以调整任务的优先级,让两个任务的优先级相同,并设置为较低的优先级。这样,两个任务将以轮流执行的方式运行,你会看到每个任务都会打印一小段信息,然后切换到另一个任务。

    此外,关于SPI Flash的警告信息,是由于检测到的Flash大小大于二进制图像头中的大小。这个警告信息并不影响代码的功能,只是提示实际使用的Flash大小与预期大小不一致。你可以忽略这个警告信息,不需要进行处理。

    解决方案:

    1. 调整任务的优先级,将两个任务设置为相同的优先级,并设置为较低的优先级。
    2. 忽略SPI Flash警告信息。

    修改后的代码如下:

    static void Poll_task(void *arg) {
        while(1) {
            printf("Task_poll\n");
            vTaskDelay(100 / portTICK_PERIOD_MS);
        }
    }
    
    static void Cnt_task(void *arg) {
        while(1) {
            printf("Task_cnt\n");
            vTaskDelay(100 / portTICK_PERIOD_MS);
        }
    }
    
    void app_main() {
        xTaskCreate(Cnt_task, "Sys_Cnt_Task", 1024*2, NULL, 2, NULL);
        xTaskCreate(Poll_task, "Sys_Poll_Task", 1024*2, NULL, 2, NULL);
    }
    

    注意:上述代码将两个任务的优先级都设置为2。你也可以根据需要调整优先级的值。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月15日