你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32 FreeRTOS列表应用示例

[复制链接]
STMCU小助手 发布时间:2022-6-18 17:00
01. 概述
掌握FreeRTOS中列表和列表项相关函数的使用。

02. 任务设计
3 个任务:start_task、task1_task 和task2_task,这三个任务的任务功能如下:

start_task:用来创建其他2 个任务。

task1_task:应用任务1,控制LED0 闪烁,用来提示系统正在运行。

task2_task: 列表和列表项操作任务,调用列表和列表项相关的API 函数,并且通过串口输出相应的信息来观察这些API 函数的运行过程。

需要用到KEY_UP 按键,用于控制任务的运行。

03. 相关设置
任务优先级和堆栈大小设置

  1. //任务优先级
  2. #define START_TASK_PRIO                1
  3. //任务堆栈大小        
  4. #define START_STK_SIZE                 128  
  5. //任务句柄
  6. TaskHandle_t StartTask_Handler;
  7. //任务函数
  8. void start_task(void *pvParameters);

  9. //任务优先级
  10. #define TASK1_TASK_PRIO                2
  11. //任务堆栈大小        
  12. #define TASK1_STK_SIZE                 50  
  13. //任务句柄
  14. TaskHandle_t Task1Task_Handler;
  15. //任务函数
  16. void task1_task(void *pvParameters);

  17. //任务优先级
  18. #define TASK2_TASK_PRIO                3
  19. //任务堆栈大小        
  20. #define TASK2_STK_SIZE                 50  
  21. //任务句柄
  22. TaskHandle_t Task2Task_Handler;
  23. //任务函数
  24. void task2_task(void *pvParameters);
复制代码

列表和列表项定义

  1. //列表和列表项定义
  2. List_t list;
  3. ListItem_t listItem1;
  4. ListItem_t listItem2;
  5. ListItem_t listItem3;
复制代码

04. 程序设计
main.c文件

  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "led.h"
  5. #include "key.h"
  6. #include "FreeRTOS.h"
  7. #include "task.h"


  8. //任务优先级
  9. #define START_TASK_PRIO                1
  10. //任务堆栈大小        
  11. #define START_STK_SIZE                 128  
  12. //任务句柄
  13. TaskHandle_t StartTask_Handler;
  14. //任务函数
  15. void start_task(void *pvParameters);

  16. //任务优先级
  17. #define TASK1_TASK_PRIO                2
  18. //任务堆栈大小        
  19. #define TASK1_STK_SIZE                 50  
  20. //任务句柄
  21. TaskHandle_t Task1Task_Handler;
  22. //任务函数
  23. void task1_task(void *pvParameters);

  24. //任务优先级
  25. #define TASK2_TASK_PRIO                3
  26. //任务堆栈大小        
  27. #define TASK2_STK_SIZE                 50  
  28. //任务句柄
  29. TaskHandle_t Task2Task_Handler;
  30. //任务函数
  31. void task2_task(void *pvParameters);

  32. //列表和列表项定义
  33. List_t list;
  34. ListItem_t listItem1;
  35. ListItem_t listItem2;
  36. ListItem_t listItem3;


  37. //主函数
  38. int main(void)
  39. {
  40.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
  41.         delay_init(168);                //初始化延时函数
  42.         uart_init(115200);             //初始化串口
  43.         LED_Init();                        //初始化LED端口
  44.         KEY_Init();                          //按键初始化
  45.         
  46.         //创建开始任务
  47.     xTaskCreate((TaskFunction_t )start_task,            //任务函数
  48.                 (const char*    )"start_task",          //任务名称
  49.                 (uint16_t       )START_STK_SIZE,        //任务堆栈大小
  50.                 (void*          )NULL,                  //传递给任务函数的参数
  51.                 (UBaseType_t    )START_TASK_PRIO,       //任务优先级
  52.                 (TaskHandle_t*  )&StartTask_Handler);   //任务句柄              
  53.     vTaskStartScheduler();          //开启任务调度
  54. }

  55. //开始任务任务函数
  56. void start_task(void *pvParameters)
  57. {
  58.     taskENTER_CRITICAL();           //进入临界区
  59.         
  60.     //创建TASK1任务
  61.     xTaskCreate((TaskFunction_t )task1_task,            
  62.                 (const char*    )"task1_task",           
  63.                 (uint16_t       )TASK1_STK_SIZE,
  64.                 (void*          )NULL,                                
  65.                 (UBaseType_t    )TASK1_TASK_PRIO,        
  66.                 (TaskHandle_t*  )&Task1Task_Handler);   
  67.     //创建TASK2任务
  68.     xTaskCreate((TaskFunction_t )task2_task,     
  69.                 (const char*    )"task2_task",   
  70.                 (uint16_t       )TASK2_STK_SIZE,
  71.                 (void*          )NULL,
  72.                 (UBaseType_t    )TASK2_TASK_PRIO,
  73.                 (TaskHandle_t*  )&Task2Task_Handler);        

  74.     vTaskDelete(StartTask_Handler); //删除开始任务
  75.                                 
  76.     taskEXIT_CRITICAL();            //退出临界区
  77. }

  78. //任务1  不停的闪烁表示系统正在正常运行
  79. void task1_task(void *pvParameters)
  80. {
  81.         while(1)
  82.         {

  83.                 LED0 = !LED0;
  84.                
  85.                 //延时1秒 1000个时钟节拍
  86.                 vTaskDelay(1000);
  87.         }
  88. }

  89. //任务2  列表和列表项相关操作
  90. void task2_task(void *pvParameters)
  91. {
  92.         
  93.         //第一步:初始化列表和列表项
  94.         vListInitialise(&list);
  95.         vListInitialiseItem(&listItem1);
  96.         vListInitialiseItem(&listItem2);
  97.         vListInitialiseItem(&listItem3);
  98.         
  99.         listItem1.xItemValue=40;                        //ListItem1列表项值为40
  100.         listItem2.xItemValue=60;                        //ListItem2列表项值为60
  101.         listItem3.xItemValue=50;                        //ListItem3列表项值为50
  102.         
  103.         //第二步:打印列表和其他列表项的地址
  104.         printf("/*******************列表和列表项地址*******************/\r\n");
  105.         printf("项目                              地址                                    \r\n");
  106.         printf("TestList                          %#x                                        \r\n",(int)&list);
  107.         printf("TestList->pxIndex                 %#x                                        \r\n",(int)list.pxIndex);
  108.         printf("TestList->xListEnd                %#x                                        \r\n",(int)(&list.xListEnd));
  109.         printf("ListItem1                         %#x                                        \r\n",(int)&listItem1);
  110.         printf("ListItem2                         %#x                                        \r\n",(int)&listItem2);
  111.         printf("ListItem3                         %#x                                        \r\n",(int)&listItem3);
  112.         printf("/************************结束**************************/\r\n");
  113.         printf("按下KEY_UP键继续!\r\n\r\n\r\n");
  114.         while(Key_Scan()!=WK_UP_PRESS) delay_ms(10);                                        //等待KEY_UP键按下
  115.         
  116.         
  117.         //第三步:向列表TestList添加列表项ListItem1,并通过串口打印所有
  118.         //列表项中成员变量pxNext和pxPrevious的值,通过这两个值观察列表
  119.         //项在列表中的连接情况。
  120.         vListInsert(&list,&listItem1);                //插入列表项ListItem1
  121.         printf("/******************添加列表项ListItem1*****************/\r\n");
  122.         printf("项目                              地址                                    \r\n");
  123.         printf("TestList->xListEnd->pxNext        %#x                                        \r\n",(int)(list.xListEnd.pxNext));
  124.         printf("ListItem1->pxNext                 %#x                                        \r\n",(int)(listItem1.pxNext));
  125.         printf("/*******************前后向连接分割线********************/\r\n");
  126.         printf("TestList->xListEnd->pxPrevious    %#x                                        \r\n",(int)(list.xListEnd.pxPrevious));
  127.         printf("ListItem1->pxPrevious             %#x                                        \r\n",(int)(listItem1.pxPrevious));
  128.         printf("/************************结束**************************/\r\n");
  129.         printf("按下KEY_UP键继续!\r\n\r\n\r\n");
  130.         while(Key_Scan()!=WK_UP_PRESS) delay_ms(10);                                        //等待KEY_UP键按下        
  131.         
  132.         
  133.         //第四步:向列表TestList添加列表项ListItem2,并通过串口打印所有
  134.         //列表项中成员变量pxNext和pxPrevious的值,通过这两个值观察列表
  135.         //项在列表中的连接情况。
  136.         vListInsert(&list,&listItem2);        //插入列表项ListItem2
  137.         printf("/******************添加列表项ListItem2*****************/\r\n");
  138.         printf("项目                              地址                                    \r\n");
  139.         printf("TestList->xListEnd->pxNext        %#x                                        \r\n",(int)(list.xListEnd.pxNext));
  140.         printf("ListItem1->pxNext                 %#x                                        \r\n",(int)(listItem1.pxNext));
  141.         printf("ListItem2->pxNext                 %#x                                        \r\n",(int)(listItem2.pxNext));
  142.         printf("/*******************前后向连接分割线********************/\r\n");
  143.         printf("TestList->xListEnd->pxPrevious    %#x                                        \r\n",(int)(list.xListEnd.pxPrevious));
  144.         printf("ListItem1->pxPrevious             %#x                                        \r\n",(int)(listItem1.pxPrevious));
  145.         printf("ListItem2->pxPrevious             %#x                                        \r\n",(int)(listItem2.pxPrevious));
  146.         printf("/************************结束**************************/\r\n");
  147.         printf("按下KEY_UP键继续!\r\n\r\n\r\n");
  148.         while(Key_Scan()!=WK_UP_PRESS) delay_ms(10);                                        //等待KEY_UP键按下        
  149.         
  150.         //第五步:向列表TestList添加列表项ListItem3,并通过串口打印所有
  151.         //列表项中成员变量pxNext和pxPrevious的值,通过这两个值观察列表
  152.         //项在列表中的连接情况。
  153.         vListInsert(&list,&listItem3);        //插入列表项ListItem3
  154.         printf("/******************添加列表项ListItem3*****************/\r\n");
  155.         printf("项目                              地址                                    \r\n");
  156.         printf("TestList->xListEnd->pxNext        %#x                                        \r\n",(int)(list.xListEnd.pxNext));
  157.         printf("ListItem1->pxNext                 %#x                                        \r\n",(int)(listItem1.pxNext));
  158.         printf("ListItem3->pxNext                 %#x                                        \r\n",(int)(listItem3.pxNext));
  159.         printf("ListItem2->pxNext                 %#x                                        \r\n",(int)(listItem2.pxNext));
  160.         printf("/*******************前后向连接分割线********************/\r\n");
  161.         printf("TestList->xListEnd->pxPrevious    %#x                                        \r\n",(int)(list.xListEnd.pxPrevious));
  162.         printf("ListItem1->pxPrevious             %#x                                        \r\n",(int)(listItem1.pxPrevious));
  163.         printf("ListItem3->pxPrevious             %#x                                        \r\n",(int)(listItem3.pxPrevious));
  164.         printf("ListItem2->pxPrevious             %#x                                        \r\n",(int)(listItem2.pxPrevious));
  165.         printf("/************************结束**************************/\r\n");
  166.         printf("按下KEY_UP键继续!\r\n\r\n\r\n");
  167.         while(Key_Scan()!=WK_UP_PRESS) delay_ms(10);                                        //等待KEY_UP键按下        
  168.         

  169.         //第六步:删除ListItem2,并通过串口打印所有列表项中成员变量pxNext和
  170.         //pxPrevious的值,通过这两个值观察列表项在列表中的连接情况。
  171.         uxListRemove(&listItem2);                                                //删除ListItem2
  172.         printf("/******************删除列表项ListItem2*****************/\r\n");
  173.         printf("项目                              地址                                    \r\n");
  174.         printf("TestList->xListEnd->pxNext        %#x                                        \r\n",(int)(list.xListEnd.pxNext));
  175.         printf("ListItem1->pxNext                 %#x                                        \r\n",(int)(listItem1.pxNext));
  176.         printf("ListItem3->pxNext                 %#x                                        \r\n",(int)(listItem3.pxNext));
  177.         printf("/*******************前后向连接分割线********************/\r\n");
  178.         printf("TestList->xListEnd->pxPrevious    %#x                                        \r\n",(int)(list.xListEnd.pxPrevious));
  179.         printf("ListItem1->pxPrevious             %#x                                        \r\n",(int)(listItem1.pxPrevious));
  180.         printf("ListItem3->pxPrevious             %#x                                        \r\n",(int)(listItem3.pxPrevious));
  181.         printf("/************************结束**************************/\r\n");
  182.         printf("按下KEY_UP键继续!\r\n\r\n\r\n");
  183.         while(Key_Scan()!=WK_UP_PRESS) delay_ms(10);                                        //等待KEY_UP键按下        
  184.         
  185.         //第七步:插入ListItem2,并通过串口打印所有列表项中成员变量pxNext和
  186.         //pxPrevious的值,通过这两个值观察列表项在列表中的连接情况。
  187.         list.pxIndex=list.pxIndex->pxNext;                        //pxIndex向后移一项,这样pxIndex就会指向ListItem1。
  188.         vListInsertEnd(&list,&listItem2);                                //列表末尾添加列表项ListItem2
  189.         printf("/***************在末尾添加列表项ListItem2***************/\r\n");
  190.         printf("项目                              地址                                    \r\n");
  191.         printf("TestList->pxIndex                 %#x                                        \r\n",(int)list.pxIndex);
  192.         printf("TestList->xListEnd->pxNext        %#x                                        \r\n",(int)(list.xListEnd.pxNext));
  193.         printf("ListItem2->pxNext                 %#x                                        \r\n",(int)(listItem2.pxNext));
  194.         printf("ListItem1->pxNext                 %#x                                        \r\n",(int)(listItem1.pxNext));
  195.         printf("ListItem3->pxNext                 %#x                                        \r\n",(int)(listItem3.pxNext));
  196.         printf("/*******************前后向连接分割线********************/\r\n");
  197.         printf("TestList->xListEnd->pxPrevious    %#x                                        \r\n",(int)(list.xListEnd.pxPrevious));
  198.         printf("ListItem2->pxPrevious             %#x                                        \r\n",(int)(listItem2.pxPrevious));
  199.         printf("ListItem1->pxPrevious             %#x                                        \r\n",(int)(listItem1.pxPrevious));
  200.         printf("ListItem3->pxPrevious             %#x                                        \r\n",(int)(listItem3.pxPrevious));
  201.         printf("/************************结束**************************/\r\n\r\n\r\n");
  202.         while(1)
  203.         {
  204.                 LED1=!LED1;
  205.         vTaskDelay(1000);                           //延时1s,也就是1000个时钟节拍        
  206.         }
  207.         
  208. }
复制代码

05. 实验结果

  1. /*******************列表和列表项地址*******************/
  2. 项目                              地址                                    
  3. TestList                          0x200000bc                                       
  4. TestList->pxIndex                 0x200000c4                                       
  5. TestList->xListEnd                0x200000c4                                       
  6. ListItem1                         0x200000d0                                       
  7. ListItem2                         0x200000e4                                       
  8. ListItem3                         0x200000f8                                       
  9. /************************结束**************************/
  10. 按下KEY_UP键继续!


  11. /******************添加列表项ListItem1*****************/
  12. 项目                              地址                                    
  13. TestList->xListEnd->pxNext        0x200000d0                                       
  14. ListItem1->pxNext                 0x200000c4                                       
  15. /*******************前后向连接分割线********************/
  16. TestList->xListEnd->pxPrevious    0x200000d0                                       
  17. ListItem1->pxPrevious             0x200000c4                                       
  18. /************************结束**************************/
  19. 按下KEY_UP键继续!


  20. /******************添加列表项ListItem2*****************/
  21. 项目                              地址                                    
  22. TestList->xListEnd->pxNext        0x200000d0                                       
  23. ListItem1->pxNext                 0x200000e4                                       
  24. ListItem2->pxNext                 0x200000c4                                       
  25. /*******************前后向连接分割线********************/
  26. TestList->xListEnd->pxPrevious    0x200000e4                                       
  27. ListItem1->pxPrevious             0x200000c4                                       
  28. ListItem2->pxPrevious             0x200000d0                                       
  29. /************************结束**************************/
  30. 按下KEY_UP键继续!


  31. /******************添加列表项ListItem3*****************/
  32. 项目                              地址                                    
  33. TestList->xListEnd->pxNext        0x200000d0                                       
  34. ListItem1->pxNext                 0x200000f8                                       
  35. ListItem3->pxNext                 0x200000e4                                       
  36. ListItem2->pxNext                 0x200000c4                                       
  37. /*******************前后向连接分割线********************/
  38. TestList->xListEnd->pxPrevious    0x200000e4                                       
  39. ListItem1->pxPrevious             0x200000c4                                       
  40. ListItem3->pxPrevious             0x200000d0                                       
  41. ListItem2->pxPrevious             0x200000f8                                       
  42. /************************结束**************************/
  43. 按下KEY_UP键继续!


  44. /******************删除列表项ListItem2*****************/
  45. 项目                              地址                                    
  46. TestList->xListEnd->pxNext        0x200000d0                                       
  47. ListItem1->pxNext                 0x200000f8                                       
  48. ListItem3->pxNext                 0x200000c4                                       
  49. /*******************前后向连接分割线********************/
  50. TestList->xListEnd->pxPrevious    0x200000f8                                       
  51. ListItem1->pxPrevious             0x200000c4                                       
  52. ListItem3->pxPrevious             0x200000d0                                       
  53. /************************结束**************************/
  54. 按下KEY_UP键继续!


  55. /***************在末尾添加列表项ListItem2***************/
  56. 项目                              地址                                    
  57. TestList->pxIndex                 0x200000d0                                       
  58. TestList->xListEnd->pxNext        0x200000e4                                       
  59. ListItem2->pxNext                 0x200000d0                                       
  60. ListItem1->pxNext                 0x200000f8                                       
  61. ListItem3->pxNext                 0x200000c4                                       
  62. /*******************前后向连接分割线********************/
  63. TestList->xListEnd->pxPrevious    0x200000f8                                       
  64. ListItem2->pxPrevious             0x200000c4                                       
  65. ListItem1->pxPrevious             0x200000e4                                       
  66. ListItem3->pxPrevious             0x200000d0                                       
  67. /************************结束**************************/
复制代码


收藏 评论0 发布时间:2022-6-18 17:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版