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列表应用示例相关推荐

  1. 【STM32】FreeRTOS列表和列表项详解

    00. 目录 文章目录 00. 目录 01. 概述 02. 列表 03. 列表项 04. 列表相关宏 05. 列表相关函数 5.1 初始化列表 5.2 初始化列表项 5.3 列表项插入函数 5.4 列 ...

  2. 基于STM32+FreeRtos+ESP8266+MQTT连接阿里云

    基于STM32+FreeRtos+DHT12+ESP8266+MQTT连接阿里云 1.概述 2.实现步骤 2.1.MQTT.fx模拟器与阿里云通信 2.2.STM32与阿里云通信 3. 搭建云平台 3 ...

  3. STM32 FreeRTOS CMSIS—OS

    STM32 FreeRTOS CMSIS-OS 前言 1.关于 osThreadNew () 1.1 FreeRTOS线程与任务的关系 1.2 osThreadNew () 1.2.1 osThrea ...

  4. ajax怎样获得表头信息,layui.table动态获取表头和列表数据示例

    layui.table动态获取表头和列表数据示例 2020年07月14日 | 萬仟网IT编程 | 我要评论 ```javascript//表格layui.use('table', function() ...

  5. wxpython制作表格界面_Python wxPython库使用wx.ListBox创建列表框示例

    本文实例讲述了Python wxPython库使用wx.ListBox创建列表框.分享给大家供大家参考,具体如下: 如何创建一个列表框? 列表框是提供给用户选择的另一机制.选项被放置在一个矩形的窗口中 ...

  6. 【基于stm32 FreeRtos的智能台灯控制】

    基于stm32 FreeRtos的智能台灯控制 之前做了一个裸机版本的智能台灯,最近刚好复习一下FreeRto的一些基础知识,朋友发给了我一个功能需求刚好用来实践一下,需要的朋友可以自行下载. 完整工 ...

  7. python常用关键字意思_Python 关键字列表及示例

    本教程提供有关Python中使用的所有关键字的简要信息. 关键字是Python中的保留字.我们不能将关键字用作变量名,函数名或任何其他标识符. 这是Python编程中所有关键字的列表 上述关键字可能会 ...

  8. ajax的列表联动示例

    ajax的列表联动示例 1.  输入域: 请选择省: <select id="sel1" onchange="return choose(this);"& ...

  9. 【STM32】FreeRTOS 列表和列表项

    文章目录 main.c main.c

最新文章

  1. 2003系统服务器,雨林木风 windows server 2003企业版服务器系统
  2. 天云数据CEO雷涛:从软件到数件,AI生态如何建立自己的“Android”?| 量子位·视点分享回顾...
  3. visibility和display隐藏元素的区别
  4. SQL Server 2005高可用性之复制(http://tech.it168.com/db/s/2007-05-15/200705150909375.shtml)
  5. LYDSY模拟赛day2 Divisors
  6. Appointment detail page loading never ends in Zeiss
  7. 浅析linux下的条件变量
  8. Linux 设备驱动开发 —— platform 设备驱动
  9. RDD(弹性分布式数据集)
  10. Ajax通讯异常12002,前端MVC框架[02] 发送AJAX请求及建立连接池
  11. 95-847-044-源码-Netty-NettyClient创建
  12. 文字垂直居中(HTML、CSS)
  13. 荣耀7i android版本,华为荣耀7i有几个版本?荣耀7i不同版本配置介绍
  14. 将网页转换成pdf文档的方法
  15. pandas分组计算平均值_Pandas之分组计算
  16. 电脑进入安全模式怎么解除?
  17. SSH远程控制计算机
  18. 16S rRNArDNA测序分析
  19. 【杂记】各项异性滤波简介Anisotropic Filtering(AF)
  20. storyboard(故事版)新手教程 图文详解 1.创建一个无约束的导航栏加选项卡(tabbar)故事版

热门文章

  1. (连通图 模板题 无向图求桥)Critical Links -- UVA -- 796
  2. 对XMLHttpRequest异步请求的面向对象封装
  3. C语言学习之打印菱形
  4. adsl拨号无公网地址如何用ddns_【好玩的网络-第5期】分享自编ddns程序,17行代码轻松实现免费ddns,服务器或nas玩家的福音...
  5. 快速判断一个数是否是4的幂次方,若是,并判断出来是多少次方! .
  6. websocket实现单聊
  7. WebDriver API 元素定位(三)
  8. VMware如何进入安全模式
  9. thinkphp 第二节
  10. 8张图告诉你如何运营微信公众号