gentleman 发表于 2024-3-9 10:26:02

FreeRTOS for STC32G12K128内核代码解读(二)任务调度(下)

本帖最后由 gentleman 于 2024-3-9 16:05 编辑

FreeRTOS for STC32G12K128内核代码解读(二)任务调度(下)

    原计划,这一期 讲挂起任务
    考虑到和 阻塞任务有很高的相似度
    再发一期 就有点水了
    这期不读源码,总结一下完整的任务调度 (含阻塞)
         详细内容去对应的那一期查看
    图
      

   图2
   


   这期我们自己写一个例程
1. 任务函数
   portTASK_FUNCTION( vTaskA, pvParameters )
{

    UNUSED( pvParameters );
    while(1)
    {
      printf("运行任务A\r\n");               //实际项目不建议这样使用共享资源,此处仅为方便观察
      vTaskDelay(100);
    }
    vTaskDelete(NULL);
}

portTASK_FUNCTION( vTaskB, pvParameters )
{

    UNUSED( pvParameters );
    while(1)
    {
      printf("运行任务B\r\n");             //实际项目不建议这样使用共享资源,此处仅为方便观察
      vTaskDelay(500);
    }
    vTaskDelete(NULL);
}

portTASK_FUNCTION( vTaskC, pvParameters )
{

    UNUSED( pvParameters );
    while(1)
    {
      printf("运行任务C\r\n");            //实际项目不建议这样使用共享资源,此处仅为方便观察
      vTaskDelay(1000);
    }
    vTaskDelete(NULL);
}
portTASK_FUNCTION( vTaskD, pvParameters )
{

    UNUSED( pvParameters );
    while(1)
    {
      printf("运行任务D\r\n");            //实际项目不建议这样使用共享资源,此处仅为方便观察
      vTaskDelay(1000);
    }
    vTaskDelete(NULL);
}

4个任务 A 延时100B 500 CD 1000


2.建立任务 再main中

    xTaskCreate(vTaskA,"TaskA",128,NULL,1,NULL);
    xTaskCreate(vTaskB,"TaskB",128,NULL,2,NULL);
    xTaskCreate(vTaskC,"TaskC",128,NULL,2,NULL);
    xTaskCreate(vTaskD,"TaskD",128,NULL,2,NULL);


让BCD 优先级2
      A 优先级1


3.运行过程分析

建立任务后当前任务会指向任务D (不懂的去看之前的内容)
            
            所以D会先运行
            
   D运行   D运行到vTaskDelay(1000); 进入阻塞状态
            
             把D 放到了 阻塞链表
            
             这时 当前任务指向了B (不懂的还是去看之前的内容 :)
   B运行   B 阻塞
             B 移入阻塞链表
             当前任务指向C
   C运行   C 阻塞
             C 移入阻塞链表
             当前任务指向低优先级的A
   A运行   A 阻塞
             A 移入阻塞链表
   空闲任务运行
   
   100ms到了 A 退出阻塞 ,被移回 就绪链表【1】
               A 时此时优先级最高的任务
               当前任务指向A
   运行A    A阻塞
   运行空闲
   
   。。。
   
   500ms    B退出阻塞,被移回就绪链表【2】
            B的优先级更高,所以不管A是否就绪
            当前任务都会指向B
   B运行    B阻塞
            B 移入阻塞链表
   恢复B退出阻塞前的状态
   继续运行A 或者空闲
   。。。
   1000ms   虽然C D 同为1000ms
            但C后移入阻塞链表的
            C在D 的后一项
            所以 D先退出阻塞
            先运行D


   。。。

   以上就是 包含阻塞任务的整体任务调度分析
   例程见附件
   










gentleman 发表于 2024-3-9 10:30:39

本帖最后由 gentleman 于 2024-3-11 11:42 编辑

目录
1.任务创建(上)    FreeRTOS内核代码解读(一)任务建立(上) - FreeRTOS/实时操作系统/文件系统/嵌入式系统软件,TFT-GUI/uGFX - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)
2. 任务建立(下)FreeRTOS for STC32G12K128内核代码解读(一)任务建立(下) - FreeRTOS/实时操作系统/文件系统/嵌入式系统软件,TFT-GUI/uGFX - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)
3. 任务调度 (上)   FreeRTOS for STC32G12K128内核代码解读(二)任务调度(上) - FreeRTOS/实时操作系统/文件系统/嵌入式系统软件,TFT-GUI/uGFX - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)
4.任务调度(中) FreeRTOS for STC32G12K128内核代码解读(二)任务调度(中) - FreeRTOS/实时操作系统/文件系统/嵌入式系统软件,TFT-GUI/uGFX - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)

5.任务调度(中下)FreeRTOS for STC32G12K128内核代码解读(二)任务调度(中下) - FreeRTOS/实时操作系统/文件系统/嵌入式系统软件,TFT-GUI/uGFX - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)

6.任务调度 (下)FreeRTOS for STC32G12K128内核代码解读(二)任务调度(下) - FreeRTOS/实时操作系统/文件系统/嵌入式系统软件,TFT-GUI/uGFX - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)

下一期 :FreeRTOS for STC32G12K128内核代码解读(三)队列(1) - FreeRTOS/实时操作系统/文件系统/嵌入式系统软件,TFT-GUI/uGFX - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)


gentleman 发表于 2024-3-9 10:32:39

咫尺天涯 发表于 2024-3-27 15:13:27

跟着学习
页: [1]
查看完整版本: FreeRTOS for STC32G12K128内核代码解读(二)任务调度(下)