当前位置: 首页 > news >正文

1897_野火FreeRTOS教程阅读笔记_链表

1897_野火FreeRTOS教程阅读笔记_链表

全部学习汇总: g_FreeRTOS: FreeRTOS学习笔记 (gitee.com)

之前我自己通过直接啃代码的方式对FreeRTOS也算是有了一点理解了,这次趁着些许闲暇翻看一下野火的FreeRTOS教程。一者算是一种复习;二者可能对自己理解上的偏差进行纠正;三者应该可以学到一些自己没有解读出来的内容。

我个人曾经喜欢用TAB,至少喜欢TAB操作。但是,最近几年把这个习惯彻底改掉了,主要以4个空格为主。梳理的这个观点也是我自己决心改成如此的一个很重要的原因。

书中有一段关于裸机以及带有多任务操作系统的一段描述,我是直接跳过了。关于这部分,很多教程中都会讲一下,但是所涉及到的内容应该是大同小异。虽然,不同的人介绍的时候可能选择不同的类比模型,但是无非还是前后台以及OS在原理概念上的差异。直接面对设计,弄懂根本原因更好。

链表是学习FreeRTOS的基础,其实这也是很多软件设计的基础。单向链表可以理解为只能够判断自己的后继,无法直接判断自己的前驱的链表设计。而双向链表则可以直接判断自己的前驱以及后继。从实用性角度来说,显然双向链表的设计要好很多。我印象中看过一篇文章中提过,双向链表是高德纳老爷子发明的,不知道是否真是如此。

这个是FreeRTOS的链表节点的数据结构定义,主要包含如下几个要素:

  • xItemValue,这个如果只是了解链表概念的话可以先不去了解,并不是一个链表必然要有一个数据信息。
  • 前驱
  • 后继
  • 节点内核对象,我觉得书中这个描述非常好,更加明确了一下这个主要是针对内核本身设计的。节点本身只是一组管理信息,包含了一系列的映射关系。真正需要处理的对象是需要这种映射关系去寻找的。
  • 从属于哪一个链表。

这是岔出去的一个话题点。关于tick的数据宽度,FreeRTOS支持16bit和32bit。不过,对于常用的32bit MCU来说的话,似乎没有什么理由得“让步”使用16bit。

对于链表节点的初始化,只是让这个节点与系统中的链表回到一种正交的关系。因此,只需要标记该节点暂时不属于任何链表即可。在插入一个链表的时候,明确这部分从属信息,进而明确前驱以及后继的关系。当然,对于FreeRTOS来说,还有一个更重要的信息需要在节点插入链表的时候明确,那就是所映射的内核管理对象。。

根节点没有采用通用的节点数据结构,算是有自己的独到思考吧。在根节点上,记录了链表的节点数目、遍历所用的指针以及链表的结束节点。

关于根节点的初始化,我觉得示意图可能还不如文字描述来的简洁。这个初始化,把指针指向了最后一个节点,然后把节点数目设置为一个无效值。对于结束的节点来说,前驱和后继全都设置为本身。节点的数目,由于没有有效的数据存在设置为0。

这样的模型其实是很好理解的,但是从表达内容上来说,我觉得似乎不够精简。在理解这一套设计的作为目的的时候,可以现以理解为主。

相关文章:

  • Mac 安装 Homebrew
  • [蓝桥杯 2022 省 A] 选数异或 题解 含源码
  • Ubuntu 命令与脚本
  • Msql-数据库死锁
  • RabbitMQ详解
  • jsp课程管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目
  • 机器学习的整个流程
  • Visual Studio 2022中创建的C++项目无法使用万能头<bits/stdc++.h>解决方案
  • LabVIEW双光子荧光显微成像系统开发
  • ChatGPT辅助编程,一次有益的尝试
  • Ubuntu文件系统结构
  • 【第三十五节】idea项目的创建以及setting和Project Structure的设置
  • 大语言模型微调数据集(2)
  • 水题中的稀奇古怪trick合集
  • 【VTKExamples::PolyData】第二十三期 InterpolateMeshOnGrid
  • JavaScript 如何正确处理 Unicode 编码问题!
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 【React系列】如何构建React应用程序
  • avalon2.2的VM生成过程
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • Git初体验
  • jquery ajax学习笔记
  • Laravel 中的一个后期静态绑定
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • Swoft 源码剖析 - 代码自动更新机制
  • TypeScript实现数据结构(一)栈,队列,链表
  • Vue ES6 Jade Scss Webpack Gulp
  • 闭包,sync使用细节
  • 大快搜索数据爬虫技术实例安装教学篇
  • 汉诺塔算法
  • linux 淘宝开源监控工具tsar
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • # 透过事物看本质的能力怎么培养?
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (转)【Hibernate总结系列】使用举例
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)Scala的“=”符号简介
  • .form文件_一篇文章学会文件上传
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .Net 应用中使用dot trace进行性能诊断
  • .net和jar包windows服务部署
  • .NET性能优化(文摘)
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • [ C++ ] STL---string类的使用指南
  • [1159]adb判断手机屏幕状态并点亮屏幕
  • [2023-年度总结]凡是过往,皆为序章
  • [AI]文心一言爆火的同时,ChatGPT带来了这么多的开源项目你了解吗
  • [AIGC] Spring Interceptor 拦截器详解