0%

FreeRTOS 和一些感悟

这是我在 2012 年刚刚使用 FreeRTOS 时写的笔记,转眼八年过去了。

用“WWH”方法分析FreeRTOS中的链表

What?FreeRTOS的链表结构是什么样的?

img

如上图所示,FreeRTOS的链表由list item和list组成。

List item有4个指针, 分别指向前,后,owner和container。

List只有3个指针,分别指向前,后和index。

Why? 这样的结构有什么用处?

List item:

前,后指针用来插入和移出某个链表。

owner指针用来寻找其属于的TCB。

container指针用来寻找其所在的链表。

List:

前,后指针用来寻找前后的list item,方便查找有序链表的表头。

Index用来遍历链表,实现同一优先级的任务时间片调度机制。

链表的insert和insert end

img

感悟:学习最忌讳一开始就一头扎进去。古人云:不是庐山真面目,只缘身在此山中。如果揪住一个细节不放,很容易陷入困境,应该跳出来看全局,看框架,然后再分步细细分析。

经常会看一段代码,看完后好像懂了,但如果问自己,这段代码作什么用的?什么时候会用到?却是一脸茫然,这是个很不好的习惯。

Start scheduler,面向对象分析法

经典的程序分析方法是面向过程,也就是所谓的“流程图“,这样的方法很详细,但往往让人眼花头晕,经常是看完后好像懂了,但是一问,又是一脸茫然,陷入繁文细节中,只记得一个个if else。

如下图所示,是面向对象分析法,将程序中操作的对象一个个抽象出来,这样一看就一目了然,知道这段程序是对什么操作,有什么用处。

程序 = 对象 + 对象

img

Create task

img

RTOS = scheduler + ITC + timer + tasks

img

简单的来说,RTOS就是实现任务调度和通信的软件。

感悟:面向对象思想就是, 一切都由“对象”和“操作”组成。对象是实体,操作是动作。

用面向对象的思想来看,

函数 = 变量 + … + 变量。语句是“操作”。

任务 = 函数 + 栈 + TCB。

RTOS = Scheduler + Task + ITC + Timer

RTOS是一种系统设计思想(就好比面向对象是一种思想),而不是一门技术。

感悟:程序是对实体的抽象,是为了实现某种事物,所以在写程序或者看程序时,要用面向对象的方法。

比如实现LED闪烁的一个函数,可以把它看作LED闪烁器。实现按键处理的函数,将其看作键盘。

扩展思考:人类创作的一切东西,都是来自于真实生活,都是有实体对象的,电子界也是如此,比如以前学习I2C协议,用面向对象法就是,起始检测器,传输器,ACK器,结束检测器,这也更符合实际的实现电路。

img

嵌入式系统 = 线程 + 事件 + 硬件,如下图

img

重新定义RTOS:

RTOS = 任务管理器 + 任务

任务管理器 = 调度器 + 通信器 + 定时器

任务 = 任务函数 + 任务栈 + 任务控制块

为什么要用RTOS,原因有两点:

一. 有些应用需要硬实时性,而传统的前后台系统无法实现,必须用RTOS。

二. 有些应用只需软实时,用前后台系统也可以实现,但是依然推荐RTOS,因为其两大优点 -> 模块性和规范性。

模块性: 独立,易维护和易扩展。

规范性: 系统模型统一 -> 硬件产生事件,事件驱动线程,线程控制硬件,线程之间互相通信。

感悟:诺基亚920光荣退居二线了,筹备着新机,预算定在千元内,细细甄选后相中了魅蓝note2,799元,性价比极高,准备定下,忽然想到,既然换就换一个好的,能用个两三年,于是放弃魅蓝note2,左挑右选后看中乐1,1499元的价格,性能堪比旗舰,敲定,付money,一天后,又发现魅族MX5,1799元,比乐1多了指纹识别,全金属机身,2070万相机,激光对焦,CPU也更好,但价钱上只多了300元,心动,不如多花点钱买这个?想退款重买,又忽然发现了小米note,1999元,号称安卓机皇,性能怪兽,屏幕更大,价格上只比MX5多了200元,哇,就它了。

忽然想起来,本来我要花的钱是799元,为何最后变成了1999元?

“反正才多了几百元,但是性能强大了这么多,还是很值的。”

就是这个心理,让我的预算一而再的向上翻。

(未完待续)

做一个WIFI智能插座,嵌入式工程师会觉得难,因为他要考虑硬件选型, 画原理图,画PCB,测试天线,继电器性能,然后要考虑底层驱动编写,TCP/IP协议栈移植,RTOS移植,稳定性测试等等。

但是软件工程师会说,啊,很简单啊,WIFI模块+控制模块就OK了。

软件工程师已经在不知觉中使用了面向对象的思考方法。

而嵌入式工程师正在用面向过程的方法思考同样的问题。

面向对象是简单易解的,因为它是最直观的。

坚持原创技术分享,您的支持将鼓励我继续创作!