FreeRTOS列表和列表项
FreeRTOS中的列表和列表项类似于数据结构中的链表和节点;
相关的文件是list.c和list.h两个文件;
List_t列表结构体
具体定义如下:
/*
* Definition of the type of queue used by the scheduler.
*/
typedef struct xLIST
{
listFIRST_LIST_INTEGRITY_CHECK_VALUE
volatile UBaseType_t uxNumberOfItems;
ListItem_t * configLIST_VOLATILE pxIndex;
MiniListItem_t xListEnd;
listSECOND_LIST_INTEGRITY_CHECK_VALUE
} List_t;
在上述结构体中:
- listFIRST_LIST_INTEGRITY_CHECK_VALUE和listSECOND_LIST_INTEGRITY_CHECK_VALUE两个成员,是用来检查列表完整性的,如果使用需要将宏configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES设置为1,之后会将这两个成员分别用xListIntegrityValue1和xListIntegrityValue2替换,并且在初始化函数vListInitialise()中给这两个成员变量设置一个特殊的值,一般默认不使用;
- uxNumberOfItems是一个unsigned long类型的变量,用于记录列表中列表项的个数;
- pxIndex用来记录当前列表项索引值,用于遍历列表;
- xListEnd列表中最后一个列表项,用来表示列表结尾,该变量的类型是一个Mini列表项类型;
xLIST_ITEM列表项结构体
struct xLIST_ITEM
{
listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE
configLIST_VOLATILE TickType_t xItemValue;
struct xLIST_ITEM * configLIST_VOLATILE pxNext;
struct xLIST_ITEM * configLIST_VOLATILE pxPrevious;
void * pvOwner;
struct xLIST * configLIST_VOLATILE pxContainer;
listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE
};
typedef struct xLIST_ITEM ListItem_t;
在上述结构体中:
- 第一个成员和最后一个成员,用来检查列表项完整性的,与列表结构体中的作用类似;
- xItemValue为列表项值;
- pxNext指向下一个列表项和pxPrevious配合实现类似双向链表的功能;
- pvOwner记录该列表项的拥有者,通常是任务块;
- pxContainer记录此列表项归哪个列表;
xMINI_LIST_ITEM迷你列表项结构体
struct xMINI_LIST_ITEM
{
listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE
configLIST_VOLATILE TickType_t xItemValue;
struct xLIST_ITEM * configLIST_VOLATILE pxNext;
struct xLIST_ITEM * configLIST_VOLATILE pxPrevious;
};
typedef struct xMINI_LIST_ITEM MiniListItem_t;
迷你列表项和列表项结构体区别就是少了几个成员变量,之所以如此定义是因为有些情况下不需要列表项中的部分变量;
列表的初始化
列表是通过vListInitialise()函数初始化的,源码定义如下:
void vListInitialise( List_t * const pxList )
{
pxList->pxIndex = ( ListItem_t * ) &( pxList->xListEnd );
pxList->xListEnd.xItemValue = portMAX_DELAY;
pxList->xListEnd.pxNext = ( ListItem_t * ) &( pxList->xListEnd );
pxList->xListEnd.pxPrevious = ( ListItem_t * ) &( pxList->xListEnd );
pxList->uxNumberOfItems = ( UBaseType_t ) 0U;
listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList );
listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList );
}
对于listSET_LIST_INTEGRITY_CHECK_1_VALUE和listSET_LIST_INTEGRITY_CHECK_2_VALUE两项默认不使用,所以整个列表初始化之后的示意图如下:
由于目前还没有列表项所以uxNumberOfItems变量初始化为0;
pxIndex指向列表结构体xLIST中内嵌的xListEnd迷你列表项;
列表项xListEnd中成员变量xItemValue初始化为portMAX_DELAY,portMAX_DELAY是一个宏,定义在portmacro.h文件中,根据使用的MCU不同,对应的值也不同,定义如下:
#if( configUSE_16_BIT_TICKS == 1 )
#define portMAX_DELAY ( TickType_t ) 0xffff
#else
#define portMAX_DELAY ( TickType_t ) 0xffffffffUL
#endif
pxNext和pxPrevious都指向自身,也就是xListEnd;
列表项的初始化
void vListInitialiseItem( ListItem_t * const pxItem )
{
/* Make sure the list item is not recorded as being on a list. */
pxItem->pxContainer = NULL;
/* Write known values into the list item if
configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */
listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem );
listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem );
}
主要是将成员变量pxContainer指向NULL;
列表插入操作
列表插入函数有两个,分别是vListInsertEnd()和vListInsert()函数;
vListInsertEnd()函数是往列表的末尾添加列表项的,列表中的xListEnd成员变量表示末尾,那么该函数插入一个列表项是不是就是插入到xListEnd的前面或者后面?这个不一定;
所谓的末尾要根据列表的成员变量pxIndex来确定的;
pxIndex成员变量是用来遍历列表的,它所指向的列表项就是要遍历的开始列表项,也就是列表的头部,由于是个环形列表,所以新的列表项就应该插入到pxIndex所指向的列表项的前面,这才是真正意义上的尾部;
vListInsert()函数是向列表中插入一个列表项,插入的位置由列表项成员变量xItemValue决定
如果xItemValue的值是portMAX_DELAY,那么就直接将列表项插入到xListEnd的前面;
如果xItemValue的值不等于portMAX_DELAY,那么这个要插入的位置根据xItemValue的值按照升序的方式在列表中一个个找,直到最终确定位置插入列表项;
列表项的删除
列表项的删除是由函数uxListRemove()实现的,整个过程的操作如下:
- 从传入的要删除的列表项中读取成员变量pxContainer得到该列表项处于哪个列表中;
- 断开该列表项的前后“连接”,即删除;
- 如果列表的pxIndex正好指向要删除的列表项,那么在删除列表项以后重新给pxIndex找个新的指向,这个新的指向就是被删除列表项的前一个列表项;
- 将被删除的列表项的成员变量pxContainer指向NULL;
- 返回新列表当前的列表项数目;
列表的遍历
FreeRTOS提供了一个函数来完成列表的遍历,就是listGET_OWNER_OF_NEXT_ENTRY(),这个函数本质上是一个宏,没调用一次这个函数列表的pxIndex变量就会指向下一个列表项,并且通过pxTCB传出这个列表项的pvOwner变量值;
此函数用于从多个同优先级的就绪任务中查找下一个要运行的任务;
FreeRTOS列表和列表项的更多相关文章
- FreeRTOS-04列表和列表项
根据正点原子FreeRTOS视频整理 单片机:STM32F207VC FreeRTOS源码版本:v10.0.1 实验说明:1. 验证列表项的插入.末尾插入.删除操作备注: 末尾插入感觉不是末尾插入, ...
- React 点击删除列表中对应项(React 获取DOM中自定义属性)
点击删除按钮,删除列表中对应项本来是React比较基础的应用,可是应用情况变得复杂了以后,我还真想了一会儿才搞定. 简化一下应用场景:点击新增按钮,增加一条输入框,点击输入框旁边的按钮,删除该输入框( ...
- SharePoint REST API - 列表和列表项
博客地址:http://blog.csdn.net/FoxDave 本篇主要讲述如何用SharePoint REST操作列表和列表项.阅读本篇时请先了解前面讲述的REST介绍和基本操作. 废话不多 ...
- 跟我学SharePoint 2013视频培训课程——怎样创建列表和列表项(7)
课程简介 第7天,怎样在SharePoint 2013中创建列表和列表项 视频 SharePoint 2013 交流群 41032413
- MFC CListCtrl 将一个列表的选中项添加到另一个列表
MFC CListCtrl 将一个列表的选中项添加到另一个列表, 用VC6.0实现: 简单记录一下自己的学习历程, 和大家分享,如果对你有用,我很高兴. 1.新建一个基于对话框的工程(Dialog-B ...
- 使用jQuery 中的显示与隐藏动画效果实现折叠下拉菜单的收缩和展开,在页面的列表中有若干项,列表的每项中有一个二级列表,二级列表默认为隐藏状态。点击列表的项,切换二级列表的显示或隐藏状态
查看本章节 查看作业目录 需求说明: 使用jQuery 中的显示与隐藏动画效果实现折叠下拉菜单的收缩和展开,在页面的列表中有若干项,列表的每项中有一个二级列表,二级列表默认为隐藏状态.点击列表的项,切 ...
- HTML&CSS基础学习笔记1.14—有序列表及列表嵌套
我们上篇讲到了无序列表,那么今天就来看看有序列表和他们的组合嵌套使用吧. 有序列表 现在我们要做那堆杂事了,但是发现这么多杂事,先做哪个好呢?于是我们给这堆杂事弄个优先级排序,让我们能够按照顺序做下去 ...
- 《Python CookBook2》 第四章 Python技巧 - 若列表中某元素存在则返回之 && 在无须共享引用的条件下创建列表的列表
若列表中某元素存在则返回之 任务: 你有一个列表L,还有一个索引号i,若i是有效索引时,返回L[i],若不是,则返回默认值v 解决方案: 列表支持双向索引,所以i可以为负数 >>> ...
- Excel列表部分列表隐藏与取消隐藏
Excel列表部分列表隐藏与取消隐藏 2014-2-19 隐藏:选中需要隐藏的列(选中A.B.C....),右键单击所选部分,选择"隐藏"即可. 取消隐藏:从A选中至所见表格最后的 ...
随机推荐
- Pychar调用远程编译器的环境配置
版本:2019最新专业版
- .rpt 文件怎麽打開?Crystal Reports 打開.rpt失敗 ?
.rpt 是SAP Crystal Reports 製作出來的檔案的後綴名, 可以通過 SAP Crystal Reports Viewer 打開,也可以直接用記事本(notepad / Note ...
- ELK7.4.2安装教程
ELK简介 "ELK"是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch.Logstash 和 Kibana.Elasticsearch 是一个搜索和分析引擎 ...
- ThinkPHP如何在控制器中调用命令
前段时间因为业务需求,使用TP的command开发了几个模块,期间测试一下在控制器中调用命令的方式,发现一些问题记录一下 官方文档: <?php namespace app\index\cont ...
- nginx静态资源设置缓存的方法
nginx静态资源设置缓存的方法 直接加expires 30d; 就是就可以了 缓存时间30天完整如下 <pre> location / { root /home/www/wordpres ...
- CVE-2019-0708 RDP MSF漏洞利用
CVE-2019-0708 RDP MSF漏洞复现 漏洞环境 使用 VMware 安装Windows7 X64 模拟受害机 Windows7 X64下载链接:链接: https://pan.baidu ...
- 用css美化select框
先上代码: .selectData{ height: 0.42rem; position: absolute; right:.28rem; top:.30rem; //去边框 border: none ...
- python 手机App数据抓取实战一
前言 当前手机使用成为互联网主流,每天手机App产生大量数据,学习爬虫的人也不能只会爬取网页数据,我们需要学习如何从手机 APP 中获取数据,本文就以豆果美食为例,讲诉爬取手机App的流程 环境准备 ...
- Oracle查询部门工资最高员工的两种方法 1、MAX()函数 2、RANK()函数
本文以SCOTT用户下初始的EMP表为参考.代码可直接使用. 查询EMP表结构的语句如下,[代码1]: DESC EMP; EMP表结构如下:[结果1]: SQL> DESC EMP ...
- TZOJ2882: 美食节之感恩父母
#include<stdio.h> int main() { ],b[],i,j,max,m,t1,t2,t3; while(scanf("%d",&m),m) ...