【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列表和列表项详解
00. 目录 文章目录 00. 目录 01. 概述 02. 列表 03. 列表项 04. 列表相关宏 05. 列表相关函数 5.1 初始化列表 5.2 初始化列表项 5.3 列表项插入函数 5.4 列 ...
- 基于STM32+FreeRtos+ESP8266+MQTT连接阿里云
基于STM32+FreeRtos+DHT12+ESP8266+MQTT连接阿里云 1.概述 2.实现步骤 2.1.MQTT.fx模拟器与阿里云通信 2.2.STM32与阿里云通信 3. 搭建云平台 3 ...
- STM32 FreeRTOS CMSIS—OS
STM32 FreeRTOS CMSIS-OS 前言 1.关于 osThreadNew () 1.1 FreeRTOS线程与任务的关系 1.2 osThreadNew () 1.2.1 osThrea ...
- ajax怎样获得表头信息,layui.table动态获取表头和列表数据示例
layui.table动态获取表头和列表数据示例 2020年07月14日 | 萬仟网IT编程 | 我要评论 ```javascript//表格layui.use('table', function() ...
- wxpython制作表格界面_Python wxPython库使用wx.ListBox创建列表框示例
本文实例讲述了Python wxPython库使用wx.ListBox创建列表框.分享给大家供大家参考,具体如下: 如何创建一个列表框? 列表框是提供给用户选择的另一机制.选项被放置在一个矩形的窗口中 ...
- 【基于stm32 FreeRtos的智能台灯控制】
基于stm32 FreeRtos的智能台灯控制 之前做了一个裸机版本的智能台灯,最近刚好复习一下FreeRto的一些基础知识,朋友发给了我一个功能需求刚好用来实践一下,需要的朋友可以自行下载. 完整工 ...
- python常用关键字意思_Python 关键字列表及示例
本教程提供有关Python中使用的所有关键字的简要信息. 关键字是Python中的保留字.我们不能将关键字用作变量名,函数名或任何其他标识符. 这是Python编程中所有关键字的列表 上述关键字可能会 ...
- ajax的列表联动示例
ajax的列表联动示例 1. 输入域: 请选择省: <select id="sel1" onchange="return choose(this);"& ...
- 【STM32】FreeRTOS 列表和列表项
文章目录 main.c main.c
最新文章
- 2003系统服务器,雨林木风 windows server 2003企业版服务器系统
- 天云数据CEO雷涛:从软件到数件,AI生态如何建立自己的“Android”?| 量子位·视点分享回顾...
- visibility和display隐藏元素的区别
- SQL Server 2005高可用性之复制(http://tech.it168.com/db/s/2007-05-15/200705150909375.shtml)
- LYDSY模拟赛day2 Divisors
- Appointment detail page loading never ends in Zeiss
- 浅析linux下的条件变量
- Linux 设备驱动开发 —— platform 设备驱动
- RDD(弹性分布式数据集)
- Ajax通讯异常12002,前端MVC框架[02] 发送AJAX请求及建立连接池
- 95-847-044-源码-Netty-NettyClient创建
- 文字垂直居中(HTML、CSS)
- 荣耀7i android版本,华为荣耀7i有几个版本?荣耀7i不同版本配置介绍
- 将网页转换成pdf文档的方法
- pandas分组计算平均值_Pandas之分组计算
- 电脑进入安全模式怎么解除?
- SSH远程控制计算机
- 16S rRNArDNA测序分析
- 【杂记】各项异性滤波简介Anisotropic Filtering(AF)
- storyboard(故事版)新手教程 图文详解 1.创建一个无约束的导航栏加选项卡(tabbar)故事版
热门文章
- (连通图 模板题 无向图求桥)Critical Links -- UVA -- 796
- 对XMLHttpRequest异步请求的面向对象封装
- C语言学习之打印菱形
- adsl拨号无公网地址如何用ddns_【好玩的网络-第5期】分享自编ddns程序,17行代码轻松实现免费ddns,服务器或nas玩家的福音...
- 快速判断一个数是否是4的幂次方,若是,并判断出来是多少次方! .
- websocket实现单聊
- WebDriver API 元素定位(三)
- VMware如何进入安全模式
- thinkphp 第二节
- 8张图告诉你如何运营微信公众号