FreeRTOS系统学习-内核篇.01-数据结构---列表与列表项定义详解-链表节点插入实验

FreeRTOS基础(九):FreeRTOS的列表和列表项 列表是 FreeRTOS 中的一个数据结构,概念上和链表有点类似,列表被用来跟踪 FreeRTOS中的任务。任务处在不同的状态下,就挂载在不同的列表中(比如就绪列表、阻塞列表、挂起列表)。而列表项就是存放在列表中的项目,一个列表项就关联着一个任务,可以说:列表代表处于某种状态的任务的集合,列表项就代表处于当前状态下的某一个任务。如下图所示:列表相当于链表,列表项相当于节点,FreeRTOS 中的列表是一个双向循环链表。 阅读详情

为什么要学列表?

我们学习FreeRTOS为什么又扯到数据结构了??FreeRTOS作为一款嵌入式操作系统,我们学习必定要了解他的底层实现,和Windows、ios等系统一样 都是从底层搭建成的,底层是什么?数据结构和大量算法喽,只不过你没了解过其它系统罢了。RTOS相较于那些还是比较简单的,那么我们一块来学习一下 FreeRTOS系统内核吧。

在 FreeRTOS 中存在着大量的基础数据结构列表和列表项的操作,要想读懂 FreeRTOS的源码或者从 0 到 1开始实现 FreeRTOS,就必须弄懂列表和列表项的操作,其实也没那么难。

列表和列表项是直接从 FreeRTOS 源码的注释中的 list 和 list item 翻译过来的,其实就是对应我们 C 语言当中的链表和节点,在后续的讲解中,我们说的链表就是列表,节点就是列表项

链表

数据结构,对于大家计算机的学生都不陌生,第一次学习链表还是在C语言中,但日常使用并不多,再次复习一下,

链表作为 C 语言中一种基础的数据结构,在平时写程序的时候用的并不多,但在操作系统里面使用的非常多。链表就好比一个圆形的晾衣架,晾衣架上面有很多钩子,钩子首尾相连。链表也是,链表由节点组成,节点与节点之间首尾相连。晾衣架的钩子本身不能代表很多东西,但是钩子本身却可以挂很多东西。同样,链表也类似,链表的节点本身不能存储太多东西,或者说链表的节点本来就不是用来存储大量数据的,但是节点跟晾衣架的钩子一样,可以挂很多数据。

链表分为单向链表和双向链表,单向链表很少用,使用最多的还是双向链表

单向链表

  1. 链表的定义
    单向链表示意图具体见图。该链表中共有 n个节点,前一个节点都有一个箭头指向后一个节点,首尾相连,组成一个圈。
    在这里插入图片描述
    对于我们第一次学习数据结构里面的一些名词,链表,堆栈等都很抽象,毕竟都是计算机内存的东西,看不到,那这样给你说节点就是定义一个自定义类型的数据,自定义类型?结构体,类??c语言中肯定是结构体啦,这样是不是就绕过来了。

节点本身必须包含一个节点指针,用于指向后一个节点,除了这个节点指针是必须有的之外,节点本身还可以携带一些私有信息。
节点都是一个自定义类型的数据结构,在这个数据结构里面可以有单个的数据、数组、
指针数据和自定义的结构体数据类型等等信息,具体见代码清单

//节点结构体定义
 struct node
 {
   
   
 struct node *next; /* 指向链表的下一个节点 */
 char data1; /* 单个的数据 */
 unsigned char array[]; /* 数组 */
 unsigned long *prt /* 指针数据 */
 struct userstruct data2; /* 自定义结构体类型数据 */
 /* ...... */
 }

除了 struct node *next 这个节点指针之外,剩下的成员都可以理解为节点携带的数据,但是这种方法很少用。通常的做法是节点里面只包含一个用于指向下一个节点的指针。要通过链表存储的数据内嵌一个节点即可,这些要存储的数据通过这个内嵌的节点即可挂接到链表中,就好像晾衣架的钩子一样,把衣服挂接到晾衣架中。

//节点内嵌在一个数据结构中
/* 节点定义 */
struct node
 {
   
   
 struct node *next; /* 指向链表的下一个节点 */
 }

 struct userstruct
 {
   
   
 /* 在结构体中,内嵌一个节点指针,通过这个节点将数据挂接到链表 */
 struct node *next;
/* 各种各样......,要存储的数据 */
 }

示意图:
在这里插入图片描述

双向链表

双向链表与单向链表的区别就是节点中有两个节点指针,分别指向前后两个节点,其
它完全一样。有关双向链表的文字描述参考单向链表小节即可,有关双向链表的示意图具
体见图

在这里插入图片描述

FreeRTOS 中链表的实现

FreeRTOS 中与链表相关的操作均在 list.h 和 list.c 这两个文件中实现,list.h 第一次使用需要在 include 文件夹下面新建然后添加到工程组文件。

节点

 struct xLIST_ITEM
 {
   
   
 TickType_t xItemValue; /* 辅助值,用于帮助节点做顺序排列 */ (1)
 struct xLIST_ITEM * pxNext; /* 指向链表下一个节点 */ (2)
 struct xLIST_ITEM * pxPrevious; /* 指向链表前一个节点 */ (3)
 void * pvOwner; /* 指向拥有该节点的内核对象,通常是 TCB */(4)
void * pvContainer; /* 指向该节点所在的链表 */ (5)
 };
 typedef struct xLIST_ITEM ListItem_t; /* 节点数据类型重定义 */

xItemValue一个辅助值,用于帮助节点做顺序排列。该辅助值的数据类型为
TickType_t,在 FreeRTOS 中,凡是涉及到数据类型的地方,FreeRTOS 都会将标准的 C 数据类型用 typedef 重新取一个类型名。这些经过重定义的数据类型放在 portmacro.h
portmacro.h头文件是FreeRTOS中对类型重定义的地方。

1 #ifndef PORTMACRO_H
2 #define PORTMACRO_H
3 
4 #include "stdint.h"
5 #include "stddef.h"
6 
7 
8 /* 数据类型重定义 */
9 #define portCHAR char
10 #define portFLOAT float
11 #define portDOUBLE double
12 #define portLONG long
13 #define portSHORT short
14 #define portSTACK_TYPE uint32_t
15 #define portBASE_TYPE long
16 
17 typedef portSTACK_TYPE StackType_t;
18 typedef long BaseType_t;
19 typedef unsigned long UBaseType_t;
20 
21 #if( configUSE_16_BIT_TICKS == 1 ) (1) 
22 typedef uint16_t TickType_t;
23 #define portMAX_DELAY ( TickType_t ) 0
深入理解FreeRTOS_学习笔记(10.链表) 链表是FreeRTOS中使用次数相当多的,我们这一章主要就是链表项定义,插入,删除等一些操作,并且通过源码分析。如图所示,freertos具有非常多的链表宏操作freertos中对链表设定为双向链表,这是对数据结构中链表的深度理解,以及需要一定的C语言的代码能力。 阅读详情

相关推荐

FreeRTOS学习笔记——链表

在FreeRTOS中,使用了大量的宏定义,对代码精简有很大的帮助,链表相关带参宏定义如下示。/*************************************** 节点部分 *************************************************//* 设置节点的拥有者 */

m0_64880990的博客 1843

FreeRTOS的学习(四)——列表

最近因为疫情,已经在家一个星期多了,由于状态不佳,也是在最近重新拾起了FreeRTOS的学习,学习的过程着实路长且艰 ,不过待到多年后回首,一定会感谢自己现在的付出。 话不多说,这几天学了FreeRTOS的列表的组成和一些操作机制,对于数据结构(本科的时候学过,当时学的贼认真的一门课,虽然最后考试也才92,不过没到三年就忘的差不多了^-^)的内容需要重新学习,这个过程也是相对难熬的……...

LEOD的博客 1979

SD-WAN组网案例——数据中心

SD-WAN组网案例——数据中心

2301_78457663的博客 705

Apifox 自动化测试新增流程控制条件,复杂测试场景不再是问题

在 if 条件后的输入框填写请求接口得到的变量 viewed ,选择条件为「小于」,输入比较数值 10 ,并在 if 条件下添加「宠物下架处理」步骤。借助新增的自动化测试流程控制条件,测试人员就可以使用 Apifox 去实现更深层更多样的测试应用场景,帮助提升测试效率,减少复杂场景的测试操作。「查询新建宠物」、「修改宠物状态为已售出」和「查询宠物状态是否修改」步骤为当前在售宠物信息盘点的三个标准步骤,所以将这三个步骤合成一组。在循环中添加「查询在售宠物」和「修改宠物状态」步骤;

877

ROS2_Moveit2_Ur5e_Grasp项目详解(二):核心模块功能解析

本文深入解析了ROS2_Moveit2_Ur5e_Grasp项目的核心模块功能。重点阐述了OctoMap建图模块如何为机械臂提供实时三维环境感知,并详细介绍了Robotiq夹爪与MoveIt2的集成控制、UR5e的运动规划策略,以及视觉模块如何协同工作,最终实现从目标检测到动态抓取的完整闭环。

weixin_29254029的博客 109

基于Arduino与Velostat的智能鞋垫:DIY足底压力监测系统全解析

压力传感器是物联网和健康监测领域的基础元件,其核心原理是将物理压力转换为可测量的电信号。通过压阻效应,材料的电阻值随压力变化,从而实现压力感知。这项技术为低成本、定制化的健康监测方案提供了可能,尤其在运动分析和康复训练中具有重要价值。本文聚焦于利用Velostat压敏材料和Arduino平台,详细解析如何从传感器制作、信号调理到无线数据传输,构建一套完整的足底压力监测系统。文中深入探讨了传感器阵列构建、信号滤波等关键技术,并针对常见问题提供了实用的解决方案,为创客和开发者实现可穿戴健康监测设备提供了清晰的工

weixin_32818781的博客 399

从零开始:使用COLMAP与OpenMVS构建高精度三维Mesh模型

本文为零基础新手提供了使用COLMAP与OpenMVS构建高精度三维Mesh模型的完整实战指南。详细介绍了从环境配置、数据采集黄金法则,到COLMAP稀疏与稠密重建、OpenMVS网格生成与纹理映射的每一步操作,并分享了关键的避坑技巧与参数调优建议,帮助读者从二维照片中成功重建出属于自己的三维模型。

metal的博客 504

龙芯2K1000 OTG双模驱动深度解析

是Synopsys公司开发的USB 2.0 OTG控制器IP核,龙芯2K1000内置该IP,作为唯一的OTG控制器(PCI Dev4 Func0),物理基地址0x40000000。核心能力:同时支持Host主机模式(接U盘/键盘)、Device设备模式(虚拟串口ttyGS0)、OTG双模自动切换速率驱动路径:内核源码PMON:启用otg0设备树内核:开启HOSTPERIPHERALG_SERIAL启动参数脚本:sysfs角色切换+开机自启Host按以上配置,龙芯2K1000 DWC2 OTG可完美实现。

weixin_44932366的博客 374

六、Tool 工具系统:让大模型拥有“手脚“

我问你一个问题:大模型能不能告诉你"北京今天天气怎么样"?能——它能用非常流畅的中文回答你不能——它不知道这个答案因为它没有联网能力,也没有实时数据。它可能会自信地编一个"今天晴,25 度"给你——这就是幻觉。问题出在哪?大模型是一个"推理引擎",不是一个"执行引擎"。它知道天气 API 怎么调用,但不能真的发出 HTTP 请求。它知道 Python 代码怎么写,但不能真的运行代码。它知道数学公式,但做不了精确的大数计算。Tool 工具系统解决的,就是这个"最后一公里"问题。

牛肉胡辣汤 157

大模型测试人员完整学习体系(分层成长路线 + 知识框架 + 落地实操)

本文系统构建了大模型测试工程师的4级能力成长体系:L1(测试执行)-L2(专项测试)-L3(质量体系)-L4(行业标准),详细拆解了每个阶段的核心技能图谱。重点包括:入门层需掌握传统测试基础和大模型产品逻辑;进阶层需精通Prompt用例设计、RAG测试、安全对齐、自动化评测等专项能力;高级层聚焦评测平台搭建与质量体系建设;专家层深入算法对齐与行业标准制定。文章配套提供了分阶段技术工具栈、3-12个月学习路径及5类实战项目建议,形成了一套完整的大模型测试人才能力培养框架。

SmallBull的博客 453

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

上一篇: FreeRTOS系统学习第一步:新建 FreeRTOS 工程—软件仿真
下一篇: 进程的概念、特点详细介绍及Linux系统中进程控制
Execution_
博客等级 码龄5年 1605粉丝 47原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值