【STM32】FreeRTOS列表应用示例
生活随笔
收集整理的這篇文章主要介紹了
【STM32】FreeRTOS列表应用示例
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
00. 目錄
文章目錄
- 00. 目錄
- 01. 概述
- 02. 任務設計
- 03. 相關設置
- 04. 程序設計
- 05. 實驗結果
- 06. 附錄
- 07. 參考
01. 概述
掌握FreeRTOS中列表和列表項相關函數的使用。
02. 任務設計
3 個任務:start_task、task1_task 和task2_task,這三個任務的任務功能如下:
start_task:用來創建其他2 個任務。
task1_task:應用任務1,控制LED0 閃爍,用來提示系統正在運行。
task2_task: 列表和列表項操作任務,調用列表和列表項相關的API 函數,并且通過串口輸出相應的信息來觀察這些API 函數的運行過程。
需要用到KEY_UP 按鍵,用于控制任務的運行。
03. 相關設置
任務優先級和堆棧大小設置
//任務優先級 #define START_TASK_PRIO 1 //任務堆棧大小 #define START_STK_SIZE 128 //任務句柄 TaskHandle_t StartTask_Handler; //任務函數 void start_task(void *pvParameters);//任務優先級 #define TASK1_TASK_PRIO 2 //任務堆棧大小 #define TASK1_STK_SIZE 50 //任務句柄 TaskHandle_t Task1Task_Handler; //任務函數 void task1_task(void *pvParameters);//任務優先級 #define TASK2_TASK_PRIO 3 //任務堆棧大小 #define TASK2_STK_SIZE 50 //任務句柄 TaskHandle_t Task2Task_Handler; //任務函數 void task2_task(void *pvParameters);列表和列表項定義
//列表和列表項定義 List_t list; ListItem_t listItem1; ListItem_t listItem2; ListItem_t listItem3;04. 程序設計
main.c文件
#include "sys.h" #include "delay.h" #include "usart.h" #include "led.h" #include "key.h" #include "FreeRTOS.h" #include "task.h"//任務優先級 #define START_TASK_PRIO 1 //任務堆棧大小 #define START_STK_SIZE 128 //任務句柄 TaskHandle_t StartTask_Handler; //任務函數 void start_task(void *pvParameters);//任務優先級 #define TASK1_TASK_PRIO 2 //任務堆棧大小 #define TASK1_STK_SIZE 50 //任務句柄 TaskHandle_t Task1Task_Handler; //任務函數 void task1_task(void *pvParameters);//任務優先級 #define TASK2_TASK_PRIO 3 //任務堆棧大小 #define TASK2_STK_SIZE 50 //任務句柄 TaskHandle_t Task2Task_Handler; //任務函數 void task2_task(void *pvParameters);//列表和列表項定義 List_t list; ListItem_t listItem1; ListItem_t listItem2; ListItem_t listItem3;//主函數 int main(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//設置系統中斷優先級分組4delay_init(168); //初始化延時函數uart_init(115200); //初始化串口LED_Init(); //初始化LED端口KEY_Init(); //按鍵初始化//創建開始任務xTaskCreate((TaskFunction_t )start_task, //任務函數(const char* )"start_task", //任務名稱(uint16_t )START_STK_SIZE, //任務堆棧大小(void* )NULL, //傳遞給任務函數的參數(UBaseType_t )START_TASK_PRIO, //任務優先級(TaskHandle_t* )&StartTask_Handler); //任務句柄 vTaskStartScheduler(); //開啟任務調度 }//開始任務任務函數 void start_task(void *pvParameters) {taskENTER_CRITICAL(); //進入臨界區//創建TASK1任務xTaskCreate((TaskFunction_t )task1_task, (const char* )"task1_task", (uint16_t )TASK1_STK_SIZE, (void* )NULL, (UBaseType_t )TASK1_TASK_PRIO, (TaskHandle_t* )&Task1Task_Handler); //創建TASK2任務xTaskCreate((TaskFunction_t )task2_task, (const char* )"task2_task", (uint16_t )TASK2_STK_SIZE, (void* )NULL,(UBaseType_t )TASK2_TASK_PRIO,(TaskHandle_t* )&Task2Task_Handler); vTaskDelete(StartTask_Handler); //刪除開始任務taskEXIT_CRITICAL(); //退出臨界區 }//任務1 不停的閃爍表示系統正在正常運行 void task1_task(void *pvParameters) {while(1){LED0 = !LED0;//延時1秒 1000個時鐘節拍vTaskDelay(1000);} }//任務2 列表和列表項相關操作 void task2_task(void *pvParameters) {//第一步:初始化列表和列表項vListInitialise(&list);vListInitialiseItem(&listItem1);vListInitialiseItem(&listItem2);vListInitialiseItem(&listItem3);listItem1.xItemValue=40; //ListItem1列表項值為40listItem2.xItemValue=60; //ListItem2列表項值為60listItem3.xItemValue=50; //ListItem3列表項值為50//第二步:打印列表和其他列表項的地址printf("/*******************列表和列表項地址*******************/\r\n");printf("項目 地址 \r\n");printf("TestList %#x \r\n",(int)&list);printf("TestList->pxIndex %#x \r\n",(int)list.pxIndex);printf("TestList->xListEnd %#x \r\n",(int)(&list.xListEnd));printf("ListItem1 %#x \r\n",(int)&listItem1);printf("ListItem2 %#x \r\n",(int)&listItem2);printf("ListItem3 %#x \r\n",(int)&listItem3);printf("/************************結束**************************/\r\n");printf("按下KEY_UP鍵繼續!\r\n\r\n\r\n");while(Key_Scan()!=WK_UP_PRESS) delay_ms(10); //等待KEY_UP鍵按下//第三步:向列表TestList添加列表項ListItem1,并通過串口打印所有//列表項中成員變量pxNext和pxPrevious的值,通過這兩個值觀察列表//項在列表中的連接情況。vListInsert(&list,&listItem1); //插入列表項ListItem1printf("/******************添加列表項ListItem1*****************/\r\n");printf("項目 地址 \r\n");printf("TestList->xListEnd->pxNext %#x \r\n",(int)(list.xListEnd.pxNext));printf("ListItem1->pxNext %#x \r\n",(int)(listItem1.pxNext));printf("/*******************前后向連接分割線********************/\r\n");printf("TestList->xListEnd->pxPrevious %#x \r\n",(int)(list.xListEnd.pxPrevious));printf("ListItem1->pxPrevious %#x \r\n",(int)(listItem1.pxPrevious));printf("/************************結束**************************/\r\n");printf("按下KEY_UP鍵繼續!\r\n\r\n\r\n");while(Key_Scan()!=WK_UP_PRESS) delay_ms(10); //等待KEY_UP鍵按下 //第四步:向列表TestList添加列表項ListItem2,并通過串口打印所有//列表項中成員變量pxNext和pxPrevious的值,通過這兩個值觀察列表//項在列表中的連接情況。vListInsert(&list,&listItem2); //插入列表項ListItem2printf("/******************添加列表項ListItem2*****************/\r\n");printf("項目 地址 \r\n");printf("TestList->xListEnd->pxNext %#x \r\n",(int)(list.xListEnd.pxNext));printf("ListItem1->pxNext %#x \r\n",(int)(listItem1.pxNext));printf("ListItem2->pxNext %#x \r\n",(int)(listItem2.pxNext));printf("/*******************前后向連接分割線********************/\r\n");printf("TestList->xListEnd->pxPrevious %#x \r\n",(int)(list.xListEnd.pxPrevious));printf("ListItem1->pxPrevious %#x \r\n",(int)(listItem1.pxPrevious));printf("ListItem2->pxPrevious %#x \r\n",(int)(listItem2.pxPrevious));printf("/************************結束**************************/\r\n");printf("按下KEY_UP鍵繼續!\r\n\r\n\r\n");while(Key_Scan()!=WK_UP_PRESS) delay_ms(10); //等待KEY_UP鍵按下 //第五步:向列表TestList添加列表項ListItem3,并通過串口打印所有//列表項中成員變量pxNext和pxPrevious的值,通過這兩個值觀察列表//項在列表中的連接情況。vListInsert(&list,&listItem3); //插入列表項ListItem3printf("/******************添加列表項ListItem3*****************/\r\n");printf("項目 地址 \r\n");printf("TestList->xListEnd->pxNext %#x \r\n",(int)(list.xListEnd.pxNext));printf("ListItem1->pxNext %#x \r\n",(int)(listItem1.pxNext));printf("ListItem3->pxNext %#x \r\n",(int)(listItem3.pxNext));printf("ListItem2->pxNext %#x \r\n",(int)(listItem2.pxNext));printf("/*******************前后向連接分割線********************/\r\n");printf("TestList->xListEnd->pxPrevious %#x \r\n",(int)(list.xListEnd.pxPrevious));printf("ListItem1->pxPrevious %#x \r\n",(int)(listItem1.pxPrevious));printf("ListItem3->pxPrevious %#x \r\n",(int)(listItem3.pxPrevious));printf("ListItem2->pxPrevious %#x \r\n",(int)(listItem2.pxPrevious));printf("/************************結束**************************/\r\n");printf("按下KEY_UP鍵繼續!\r\n\r\n\r\n");while(Key_Scan()!=WK_UP_PRESS) delay_ms(10); //等待KEY_UP鍵按下 //第六步:刪除ListItem2,并通過串口打印所有列表項中成員變量pxNext和//pxPrevious的值,通過這兩個值觀察列表項在列表中的連接情況。uxListRemove(&listItem2); //刪除ListItem2printf("/******************刪除列表項ListItem2*****************/\r\n");printf("項目 地址 \r\n");printf("TestList->xListEnd->pxNext %#x \r\n",(int)(list.xListEnd.pxNext));printf("ListItem1->pxNext %#x \r\n",(int)(listItem1.pxNext));printf("ListItem3->pxNext %#x \r\n",(int)(listItem3.pxNext));printf("/*******************前后向連接分割線********************/\r\n");printf("TestList->xListEnd->pxPrevious %#x \r\n",(int)(list.xListEnd.pxPrevious));printf("ListItem1->pxPrevious %#x \r\n",(int)(listItem1.pxPrevious));printf("ListItem3->pxPrevious %#x \r\n",(int)(listItem3.pxPrevious));printf("/************************結束**************************/\r\n");printf("按下KEY_UP鍵繼續!\r\n\r\n\r\n");while(Key_Scan()!=WK_UP_PRESS) delay_ms(10); //等待KEY_UP鍵按下 //第七步:插入ListItem2,并通過串口打印所有列表項中成員變量pxNext和//pxPrevious的值,通過這兩個值觀察列表項在列表中的連接情況。list.pxIndex=list.pxIndex->pxNext; //pxIndex向后移一項,這樣pxIndex就會指向ListItem1。vListInsertEnd(&list,&listItem2); //列表末尾添加列表項ListItem2printf("/***************在末尾添加列表項ListItem2***************/\r\n");printf("項目 地址 \r\n");printf("TestList->pxIndex %#x \r\n",(int)list.pxIndex);printf("TestList->xListEnd->pxNext %#x \r\n",(int)(list.xListEnd.pxNext));printf("ListItem2->pxNext %#x \r\n",(int)(listItem2.pxNext));printf("ListItem1->pxNext %#x \r\n",(int)(listItem1.pxNext));printf("ListItem3->pxNext %#x \r\n",(int)(listItem3.pxNext));printf("/*******************前后向連接分割線********************/\r\n");printf("TestList->xListEnd->pxPrevious %#x \r\n",(int)(list.xListEnd.pxPrevious));printf("ListItem2->pxPrevious %#x \r\n",(int)(listItem2.pxPrevious));printf("ListItem1->pxPrevious %#x \r\n",(int)(listItem1.pxPrevious));printf("ListItem3->pxPrevious %#x \r\n",(int)(listItem3.pxPrevious));printf("/************************結束**************************/\r\n\r\n\r\n");while(1){LED1=!LED1;vTaskDelay(1000); //延時1s,也就是1000個時鐘節拍 }}05. 實驗結果
/*******************列表和列表項地址*******************/ 項目 地址 TestList 0x200000bc TestList->pxIndex 0x200000c4 TestList->xListEnd 0x200000c4 ListItem1 0x200000d0 ListItem2 0x200000e4 ListItem3 0x200000f8 /************************結束**************************/ 按下KEY_UP鍵繼續!/******************添加列表項ListItem1*****************/ 項目 地址 TestList->xListEnd->pxNext 0x200000d0 ListItem1->pxNext 0x200000c4 /*******************前后向連接分割線********************/ TestList->xListEnd->pxPrevious 0x200000d0 ListItem1->pxPrevious 0x200000c4 /************************結束**************************/ 按下KEY_UP鍵繼續!/******************添加列表項ListItem2*****************/ 項目 地址 TestList->xListEnd->pxNext 0x200000d0 ListItem1->pxNext 0x200000e4 ListItem2->pxNext 0x200000c4 /*******************前后向連接分割線********************/ TestList->xListEnd->pxPrevious 0x200000e4 ListItem1->pxPrevious 0x200000c4 ListItem2->pxPrevious 0x200000d0 /************************結束**************************/ 按下KEY_UP鍵繼續!/******************添加列表項ListItem3*****************/ 項目 地址 TestList->xListEnd->pxNext 0x200000d0 ListItem1->pxNext 0x200000f8 ListItem3->pxNext 0x200000e4 ListItem2->pxNext 0x200000c4 /*******************前后向連接分割線********************/ TestList->xListEnd->pxPrevious 0x200000e4 ListItem1->pxPrevious 0x200000c4 ListItem3->pxPrevious 0x200000d0 ListItem2->pxPrevious 0x200000f8 /************************結束**************************/ 按下KEY_UP鍵繼續!/******************刪除列表項ListItem2*****************/ 項目 地址 TestList->xListEnd->pxNext 0x200000d0 ListItem1->pxNext 0x200000f8 ListItem3->pxNext 0x200000c4 /*******************前后向連接分割線********************/ TestList->xListEnd->pxPrevious 0x200000f8 ListItem1->pxPrevious 0x200000c4 ListItem3->pxPrevious 0x200000d0 /************************結束**************************/ 按下KEY_UP鍵繼續!/***************在末尾添加列表項ListItem2***************/ 項目 地址 TestList->pxIndex 0x200000d0 TestList->xListEnd->pxNext 0x200000e4 ListItem2->pxNext 0x200000d0 ListItem1->pxNext 0x200000f8 ListItem3->pxNext 0x200000c4 /*******************前后向連接分割線********************/ TestList->xListEnd->pxPrevious 0x200000f8 ListItem2->pxPrevious 0x200000c4 ListItem1->pxPrevious 0x200000e4 ListItem3->pxPrevious 0x200000d0 /************************結束**************************/06. 附錄
6.1 【STM32】STM32系列教程匯總
網址:【STM32】STM32系列教程匯總
07. 參考
《FreeRTOS Reference Manual》
《Using the FreeRTOS Real Time Kernel -A Practical Guide》
《The Definitive Guide to ARM Cortex-M3 and Cortex-M4 Processors,3rd Edition》
總結
以上是生活随笔為你收集整理的【STM32】FreeRTOS列表应用示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【STM32】FreeRTOS列表和列表
- 下一篇: 【Tools】VNC Server 6.