news 2026/6/15 19:21:21

Freertos前置:裸机系统和多任务系统

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Freertos前置:裸机系统和多任务系统

1. 裸机系统

常见的裸机系统有轮询系统和前后台系统,如下。

1.1 轮询系统

有嵌入式基础的小伙伴们都知道,我们在用keil编程的时候会写一个死循环,一方面可以让系统停住,另一方面可以往里面写代码让单片机不断地多次轮番执行其中代码。这其实就是轮询系统。

轮询系统就是在裸机编程的时候,先初始化好相关硬件,然后让主程序在一个死循环里不断循环,按顺序的完成多个任务(轮询响应任务,轮询处理任务)。这种系统通常只适用于只需要顺序执行且不需要外部事件驱动就能完成的事情。轮询系统的示例代码如下:

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

轮询系统适用于LED翻转,串口输出,液晶显示等等。但是当其中加入按键操作等需要检测外部信号的事件,用来模拟紧急报警,那么这个系统的实时响应能力就不那么好了。比如在DoSomething2()执行的时候,突然有一个按键按下,需要DoSomething1()响应,那这个事件就会丢失。

1.2 前后台系统

前后台系统是在轮询系统的基础上加入了中断。外部事件的响应在中断里面完成,具体的事件处理还是回到轮询系统中完成。这里,中断称为“前台”(中断响应),轮询称为“后台”(main函数中的死循环)。示例代码如下:

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

代码主要包括一个main函数和三个中断响应函数ISR123。

在顺序执行后台程序的过程中,如果有中断事件来临,则对应中断事件标志位置位,打断后台程序正常运行,转而执行中断服务程序。

在前后台程序中,事件的响应和处理分开了,响应在前台,处理在后台(实时中断响应,轮询处理任务)。相比轮询系统,前后台系统确保了事件不会丢失。并且,中断具有可嵌套性,可以在中断里面再写一个中断,这可以提高系统的实时响应能力。

2. 多任务系统

相比前后台系统,多任务系统的响应也是在中断中完成的(实时响应事件,实时处理事件),不同的是,事件的处理是在任务中完成的。这里,任务和中断一样,具有优先级,优先级高的任务会被优先执行。

1intflag1 = 0;
2intflag2 = 0;
3intflag3 = 0;
4
5intmain(void)
6{
7/*硬件相关初始化*/
8HardWareInit();
9
10/* OS初始化*/
11RTOSInit();
12
13/* OS启动,开始多任务调度,不再返回*/
14RTOSStart();
15}
16
17voidISR1(void)
18{
19/*置位标志位*/
20flag1 = 1;
21}
22
23voidISR2(void)
24{
25/*置位标志位*/
26flag2 = 2;
27}
28
29voidISR3(void)
30{
31/*置位标志位*/
32flag3 = 1;
33}
34
35voidDoSomething1(void)
36{
37/*无限循环,不能返回*/
38for(;;) {
39/*任务实体*/
40if(flag1) {
41
42}
43}
44}
45
46voidDoSomething2(void)
47{
48/*无限循环,不能返回*/
49for(;;) {
50/*任务实体*/
51if(flag2) {
52
53}
54}
55}
56
57voidDoSomething3(void)
58{
59/*无限循环,不能返回*/
60for(;;) {
61/*任务实体*/
62if(flag3) {
63
64}
65}
66}

多任务系统中,根据程序的功能,会把这个程序分割成一个一个独立的,无限循环且不能返回的小程序,也被称为“任务”。每个任务都独立互不干扰,且具备自身的优先级,并由操作系统统一调度管理。加入操作系统后我们在实际编程的时候不需要精心设计程序的执行流,不用担心各个模块之间的干扰。不好的一点就是这个操作系统带来的额外开销,也就是占用的FLASH和RAM。但现在FLASH和RAM越来越大,完全足够容纳RTOS这点额外开销。

3. 总结

可能我的说明还是不是很清楚,下面我放三个系统的示意图应该有助于理解:

轮询系统示意图:

前后台系统示意图:

多任务系统示意图:

最后,有一个很有助于区分这三个系统的表格:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 15:01:24

直播平台主播们的换妆功能是如何实现的?深入了解美颜SDK功能开发

当你在直播平台刷到一位主播,轻点屏幕就能在“清新裸妆”“元气桃花妆”“高级冷白皮”之间自由切换时,很多人会下意识以为: “这不就是个滤镜吗?” 但真正做过直播系统或音视频开发的人都知道——直播换妆,远不只是贴…

作者头像 李华
网站建设 2026/6/15 13:14:27

【FFmpeg使用指南】Part 2:滤镜图架构与信号处理

📚 写给开发者的音视频处理工程手册 🎯 目标:深入解析 FFmpeg 的核心引擎——滤镜图 (Filtergraph)。本章将从信号流(Signal Flow)的角度,阐述如何通过有向图(Directed Graph)结构实…

作者头像 李华
网站建设 2026/6/15 13:15:35

ByteDance研究突破:让AI训练像养花一样“循序渐进“成长

大型语言模型的训练一直是人工智能领域最昂贵的挑战之一。想象一下,每次训练一个像ChatGPT这样的AI模型,就像建造一座摩天大楼,需要投入数百万美元的计算资源和数月时间。这让很多研究团队望而却步。不过,来自字节跳动和北京大学的…

作者头像 李华
网站建设 2026/6/15 10:27:52

【开题答辩全过程】以 高校宿舍分配系统设计与实现为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人,语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

作者头像 李华
网站建设 2026/6/15 18:53:48

蓝桥杯JAVA--启蒙之路(十二)包装类型 JavaBean

一前言今天照常更新,不知是不是我的内容太水,还是形式不好,或者其他原因,最近的阅读量直线下降,我是欢迎大家提供建议的,但无论怎样,我会坚持的。二主要内容包装类型我们已经知道,Ja…

作者头像 李华