> 文章列表 > 单片机编程中的裸机编程和多任务系统FreeRTOS系统详解,以及怎么学习FreeRTOS,看哪家的教程?(合集)

单片机编程中的裸机编程和多任务系统FreeRTOS系统详解,以及怎么学习FreeRTOS,看哪家的教程?(合集)

单片机编程中的裸机编程和多任务系统FreeRTOS系统详解,以及怎么学习FreeRTOS,看哪家的教程?(合集)

单片机编程中的裸机系统和多任务系统

学习了那么久的stm32还停留在裸机???

  • 单片机编程中的裸机系统和多任务系统
  • .1 裸机系统
    • 1.1轮询系统
    • 1.2 前后台系统
  • 2 多任务操作系统
  • 3 为什么要学习多任务操作系统??
  • 4 怎么学习FreeRTOS系统?
  • 5 初步认识一下RTOS

.1 裸机系统

裸机系统通常分成轮询系统和前后台系统,有关这两者的具体实现方式请看下面的讲解。

1.1轮询系统

轮询系统即是在裸机编程的时候,先初始化好相关的硬件,然后让主程序在一个死循环里面不断循环,顺序地做各种事情,大概的伪代码看下方代码块轮询系统是一种非常简单的软件结构,通常只适用于那些只需要顺序执行代码且不需要外部事件来驱动的就能完成的事情。在代码清单 中,如果只是实现 LED 翻转,串口输出,液晶显示等
这些操作,那么使用轮询系统将会非常完美。但是,如果加入了按键操作等需要检测外部信号的事件,用来模拟紧急报警,那么整个系统的实时响应能力就不会那么好了。假设DoSomething3 是按键扫描,当外部按键被按下,相当于一个警报,这个时候,需要立马响应,并做紧急处理,而这个时候程序刚好执行到 DoSomething1,要命的是 DoSomethingg1需要执行的时间比较久,久到按键释放之后都没有执行完毕,那么当执行到 DoSomething3的时候就会丢失掉一次事件。足见,轮询系统只适合顺序执行的功能代码,当有外部事件
驱动时,实时性就会降低。
代码清单轮询系统伪代码

1 int main(void)
2 {
3 /* 硬件相关初始化 */
4 HardWareInit();
5 
6 /* 无限循环 */
7 for (;;) {
8 /* 处理事情 1 */
9 DoSomething1();
10 
11 /* 处理事情 2 */
12 DoSomething2();
13 
14 /* 处理事情 3 */
15 DoSomething3();
16 }
17 }

1.2 前后台系统

相比轮询系统,前后台系统是在轮询系统的基础上加入了中断。外部事件的响应在中断里面完成,事件的处理还是回到轮询系统中完成,中断在这里我们称为前台,main 函数里面的无限循环我们称为后台,大概的伪代码见代码清单
代码清单 前后台系统伪代码

1 int flag1 = 0;
2 int flag2 = 0;
3 int flag3 = 0;
4 
5 int main(void)
6 {
7 /* 硬件相关初始化 */
8 HardWareInit();
9 
10 /* 无限循环 */
11 for (;;) {
12 if (flag1) {
13 /* 处理事情 1 */
14 DoSomething1();
15 }
16 
17 if (flag2) {
18 /* 处理事情 2 */
19 DoSomething2();
20 }
21 
22 if (flag3) {
23 /* 处理事情 3 */
24 DoSomething3();
25 }
26 }
27 }
28 
29 void ISR1(void)
30 {
31 /* 置位标志位 */
32 flag1 = 1;
33 /* 如果事件处理时间很短,则在中断里面处理
34 如果事件处理时间比较长,在回到前台处理 */
35 DoSomething1();
36 }
37 
38 void ISR2(void)
39 {
40 /* 置位标志位 */
41 flag2 = 1;
42 
43 /* 如果事件处理时间很短,则在中断里面处理
44 如果事件处理时间比较长,在回到前台处理 */
45 DoSomething2();
46 }
47 
48 void ISR3(void)
49 {
50 /* 置位标志位 */
51 flag3 = 1;53 /* 如果事件处理时间很短,则在中断里面处理
54 如果事件处理时间比较长,在回到前台处理 */
55 DoSomething3();
56 }

在顺序执行后台程序的时候,如果有中断来临,那么中断会打断后台程序的正常执行流,转而去执行中断服务程序,在中断服务程序里面标记事件,如果事件要处理的事情很简短,则可在中断服务程序里面处理,如果事件要处理的事情比较多,则返回到后台程序里面处理。虽然事件的响应和处理是分开了,但是事件的处理还是在后台里面顺序执行的,但相比轮询系统,前后台系统确保了事件不会丢失,再加上中断具有可嵌套的功能,这可以大大的提高程序的实时响应能力。在大多数的中小型项目中,前后台系统运用的好,堪称有操作系统的效果。只是有操作系统的效果哦。

2 多任务操作系统

、当我们进入嵌入式这个领域的时候,往往首先接触的都是单片机编程,单片机编程又首选 51 单片机来入门。这里面说的单片机编程通常都是指裸机编程,即不加入任何 RTOS(Real Time Operating System 实时操作系统)的程序。常用的 RTOS 有国外的FreeRTOS、μC/OS、RTX 和国内的 FreeRTOS、Huawei LiteOS 和 AliOS-Things 等,其中尤以国外开源且免费的 FreeRTOS 的市场占有率最高

3 为什么要学习多任务操作系统??

在裸机系统中,所有的程序基本都是自己写的,所有的操作都是在一个无限的大循环里面实现。现实生活中的很多中小型的电子产品用的都是裸机系统,而且也能够满足需求。
但是为什么还要学习 RTOS 编程,偏偏还要整个操作系统进来?
一是项目需要,随着产品要实现的功能越来越多,单纯的裸机系统已经不能够完美地解决问题,反而会使编程变得更加复杂,如果想降低编程的难度,我们可以考虑引入 RTOS 实现多任务管理,这是使用
RTOS 的最大优势。
二是学习的需要,必须学习更高级的东西,实现更好的职业规划,为将来走向人生巅峰迎娶白富美做准备,而不是一味的在裸机编程上面死磕。作为一个合格的嵌入式软件工程师,学习是永远不能停歇的事,时刻都得为将来准备。书到用时方恨少,
我希望机会来临时你不要有这种感觉

4 怎么学习FreeRTOS系统?

从网上搜集了大家常用的几种方法:
1.最简单的方法就是在别人移植好的系统)上,看看RTOS里面的API使用说明,然后
调用这些API实现自已想要的功能即可。
2.另一种就足深入的学习款RTOS,阅读RTQS的源码深究内核和每个组件的实现
方式,这个过程枯燥且痛苦。
3.从0到1实现内核,层层叠加,再看内核资源的实现
方式。
这里我谨代表个人学习过程分享一下血的教训:
刚开始我是跟着野火的教程开始学习FreeRTOS,至于为啥学习FreeRTOS,开源免费!野火的FreeRTOS倡导的是从0-1先从内核底层学起,我尝试了一段时间,发现到中期,根本看不懂,列表和任务的定义之类的函数,又看了原子的教程,但原子的教程大家都懂,不过我看过他家的 HAL库 和这个RTOS抛开他们的代码不说,其他的还是可以的,方式可以,更易懂。先跟着学习移植源码,慢慢刨析函数的底层。

5 初步认识一下RTOS

FreeRTOS由RichardBarry在03年发布,18年被亚马逊收购,改名AWS FreeRTOS。
FreeRTOS是一款免费的实时操作系统。
FreeRTOS 和 OpenRTOS 拥有的代码是一样的,但是可从官方获取到的服务却是不一
样的。FreeRTOS 号称免费,OpenRTOS号称收费,它们的具体区别见表格

单片机编程中的裸机编程和多任务系统FreeRTOS系统详解,以及怎么学习FreeRTOS,看哪家的教程?(合集)

SaveRTOS也是基于FreeRTOS,但是SaveRTOS为某些特定的领域做了安全相关的设
计,有关SaveRTOS获得的安全验证具体见表格
单片机编程中的裸机编程和多任务系统FreeRTOS系统详解,以及怎么学习FreeRTOS,看哪家的教程?(合集)
OPenRTOS:有官方服务,花钱买服务。
SaveRTOS:有安全服务,医疗汽车电子行业有保障。

操作系统允许多个任务同时运行,这个叫做多任务系统。实际上,一个处理器核心在某一时刻只能运行一个任务。操作系统中任务调度器的责任就是决定在某一时刻究竟运行的哪个任务。任务调度在各个任务之间的切换非常快,就给人们造成了同一时刻有多个任务同时运行的错觉。

某些操作系统给每个任务分配同样的运行时间,时间到了就轮到下一个任务,比如Unix操作系统,FreeRTOS操作系统则是由用户给每个任务分配一个任务优先级,任务调度器就可以根据此优先级来决定下一刻应该运行哪个任务。

FreeRTOS是RTOS系统中的一种,FreeRTOS十分的小巧,可以在资源有限的微控器中使用,当然FreeRTOS不仅仅局限于在微控器中使用,但从文件数中来说FreeRTOS要比uc/OS小的多。

接下来,我会从这个合集中,一点一点分享RTOS的学习经验和方法,以及写的笔记,供大家参考,我也是一点一点从小白成长的,大家加油!