前言
一般来说,很多人学习嵌入式,学习单片机,都是从裸机编程开始的,从嵌入式领域的hello world
,也就是点灯;再到更加复杂多变的程序设计、功能实现,往往都是在一个大循环while()
中实现的
但是,随着开发的进行,往往会发现很多逻辑在裸机编程下是难以实现的;
- 一方面:伴随着技术的提升,对裸机编程不再满足,想要接触学习新的开发框架是很多的人的自然愿望
- 另一方面,功能需求 和 开发平台的改变,往往逼着你跳出舒适区,接触新的技能栈
RTOS呢,翻译过来就是实时操作系统;
- 和我们熟知的Windows、Linux不同的是,RTOS体量小,更适合于小型的嵌入式设备中;
- 同时,引入操作系统后,就引入了任务、任务管理等概念;便引入了一种全新的编程理念
- 在RTOS的基础上,我们既可以提升现有的开发栈,接触新的开发框架,如ESP-IDF、RT-Thread等;也可以对操作系统有更底层的理解,以此为基础,学习Linux等操作系统
我就结合自己的一点学习感悟,聊一聊,也是记录下自己的学习历程,希望能抛砖引玉,也能对大家有所启发。
裸机系统 与 多任务系统
裸机系统,又分为 轮询系统 和 前后台系统
- 轮询系统
轮询系统是一种非常简单的软件结构,通常只适用于那些只需要顺序执行代码且不需要外部事件来驱动的就能完成的事情
轮询系统只适合顺序执行的功能代码,当有外部事件驱动时,实时性就会降低
- 前后台系统
前后台系统是在轮询系统的基础上加入了中断。
外部事件的响应在中断里面完成,事件的处理还是回到轮询系统中完成;
中断在这里我们称为前台,main函数里面的无限循环我们称为后台
加入操作系统的调度后,引入了多任务系统
- 多任务系统
相比前后台系统,多任务系统的事件响应也是在中断中完成的,但是事件的处理是在任务中完成的。
在多任务系统中, 任务跟中断一样,也具有优先级,优先级高的任务会被优先执行
当一个紧急的事件在中断被标记之后,如果事件对应的任务的优先级足够高,就会立马得到响应。相比前后台系统,多任务系统的实时性又被提高了
相比前后台系统中后台顺序执行的程序主体,在多任务系统中,根据程序的功能,我们把这个程序主体分割成一个个独立的,无限循环且不能返回的小程序,这个小程序我们称之为任务。
每个任务都是独立的,互不干扰的,且具备自身的优先级,它由操作系统调度管理
- 注意:
加入操作系统后,我们在编程的时候不需要精心地去设计程序的执行流,不用担心每个功能模块之间是否存在干扰。加入了操作系统,我们的编程反而变得简单了。
整个系统随之带来的额外开销就是操作系统占据的那一丁点的 FLASH 和 RAM
与此相对的,要在操作系统的框架下“施展拳脚”,就不可避免的要去了解操作系统的运行机制、任务间通信机制等;这些“锤子”是我们未来应对“钉子”问题的得力助手,也是代码大厦的基石
谈谈学习思路
上面呢,已经提到了RTOS框架下的开发特点,和其与裸机编程相比的优点;那对于很多人来说,一开始切换思维到系统下的编程,还是有点困难的,尤其是直接跳到某个系统框架下进行程序设计,还是很迷茫的。
所以我从我个人的学习经历谈一谈我的学习、探索经验:
- 选择一本或几本看得下去的书籍
这里我推荐野火的《FreeRTOS内核实现与应用开发实战—基于STM32》
RTOS有很多种,如FreeRTOS 、RT-Tread等;其实选哪种不太重要,因为大差不差,熟悉了一种,其他的也很容易上手;
所以除非有特定开发框架要求,那就跟着教材所用平台来就可以
我选择看Free RTOS,因为ESP32开发框架ESP-IDF,内核就是Free RTOS
有人可能说,我喜欢看视频学习;野火应该是有对应视频的,推荐大家去B站上搜索看一下
- 对于底层内核实现及其源代码,初学了解即可
如果你看《FreeRTOS内核实现与应用开发实战—基于STM32》这本书,第一部分是从 0 到 1 教你写 FreeRTOS 内核
,这一部分作者从源码给你分析,任务列表切换、多优先级等等背后的实现;
说实话,如果你从来没接触过链表等数据结构;你可能看起来很吃力,这时候耗费大量精力在搞懂这部分内容,是事倍功半的!
由于卡在某个点上,缺乏正反馈,很容易被劝退!
我的经验是,这部分囫囵吞枣,记个大概原理,不必挨行代码吹毛求疵!
快速迭代到第二部分,RTOS任务的创建、组件的使用!
学习的过程,也是触类旁通的过程;
在使用中,慢慢体会背后的原理,回头再去看,心里也有了大致的脉络和更清晰的认识!
学习就是一个循环上升,不断迭代认知的过程
- 实践 + 笔记
这里的实践,是指将示例代码敲一遍,在实践和debug
过程中不断发现问题、解决问题、提升自我!
笔记很重要,推荐使用typora
笔记软件,在学习过程中不断记录、迭代;
记得及时回看,时看时新
进一步的,为了更好地贯彻在探索中进步,在实践中成长,我建议是找个项目跟着看一看,做一做,同时看一看RTOS的源码,找不到的函数搜一搜看一看!
- 找个开源项目,快速迭代!
现在开源环境这么好,多看B站、Github、Gitee,搜寻感兴趣、适合自己水平的开源项目,在调试和修改中加深理论上的认识,不断夯实基础 和 开发技能
- 看源码,有看不懂的API,就搜索下,不断认知
推荐使用VS Code 软件,将源代码文件夹用VS Code打开,可以很方便地组织文件和搜索(如搜索API、变量、结构体定义等)