news 2026/5/15 6:31:44

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/5/14 2:22:21

中老年线上学习发展:兴趣岛“内容+服务+空间”融合赋能下的体验升级

从早期通过新媒体传播兴趣知识的探索者,到确立“线上与线下融合的成人兴趣学习平台”的定位,兴趣岛完成了一次从内容提供者到深度服务生态构建者的战略演进。截至目前,兴趣岛App注册用户已突破5000万,是中国中老年第一大兴趣学习平…

作者头像 李华
网站建设 2026/5/14 3:20:26

通义发布Qwen3-Coder-Next:面向自主Coding Agents的开源权重模型

通义实验室宣布正式推出 Qwen3-Coder-Next。作为基于 Qwen3-Next 构建的最新一代开源权重模型,它专为驱动下一代自主 Coding Agents 而设计,旨在以极高的效率规划并执行复杂的、长时程的编程任务。Sorry, your browser doesnt support embedded videos. …

作者头像 李华
网站建设 2026/5/10 21:04:56

模拟太阳光条件下太空光伏电池的光电性能测量

三结砷化镓(GaInP/InGaAs/Ge)光伏电池具备 300~1800nm 宽光谱响应、超 30% 光电转换效率及优异抗辐照性,是航天器在轨运行的核心电源。其光电性能需在 AM0标准条件下标定,以匹配太空环境的太阳辐照特性。地面太阳光模拟器法可控性…

作者头像 李华
网站建设 2026/5/8 8:56:54

基于Spring boot的农产品销售小程序毕业论文+PPT(附源代码+演示视频)

文章目录一、项目简介1.1 运行视频1.2 🚀 项目技术栈1.3 ✅ 环境要求说明1.4 包含的文件列表前台运行截图后台运行截图项目部署源码下载一、项目简介 项目基于微信小程序,使用微信原生开发框架或uni-app框架开发。基于Springboot的农产品销售小程序 随…

作者头像 李华
网站建设 2026/5/12 1:11:56

Router6

一、<Routes/>与<Route/>二、<NavLink>三、<Navigate>四、<Outlet>五、useRoutes()六、useNavigate()七、useParams()八、useSearchParams()九、useLocation()十、useMatch()

作者头像 李华
网站建设 2026/5/14 19:40:53

HarmonyOS 网络请求与数据持久化

网罗开发&#xff08;小红书、快手、视频号同名&#xff09;大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等方…

作者头像 李华