freertos学习之路1-裸机和rtos的区别

2023-05-16

写在最前

由于工作需要,需要开始学习freertos的相关知识,本专题主要记录freertos的相关内容

参考:

https://www.bilibili.com/video/BV19g411p7UT 正点原子视频

1. 裸机和rtos的多任务处理

试想一种场景,我们正在打游戏,但女朋友在你打游戏的过程中给你发送消息,你需要回复消息

image-20230203173902379

1.1 裸机处理方式

while(1) 
{ 
	打游戏();
	回复信息(); 
}

玩过51或者stm32的裸机编程的人都知道,我们往往会在应用程序写一个大循环,如果你一把游戏30min,那么你就得30min后才能执行回复信息的任务,那么你女朋友就会找你麻烦了😆打完游戏才能发送信息,回完信息才能继续打游戏,如下图
在这里插入图片描述

1.2 RTOS行为

void main(void) 
{ 
	/* 创建打游戏任务 */
	xTaskCreate(打游戏)
	/* 创建回复信息任务 */ 
	xTaskCreate(回复信息)
}
void 游戏(void) 
{ 
   while(1) 
   { 
	 打游戏();
   }
}
void 信息(void) 
{ 
   while(1) 
   { 
	 回复信息();
   }
}

而rtos不和裸机相同,它会让打游戏运行一个时间片,回复信息运行一个时间片,一个时间片的时间是可以我们自己设置的,就是滴答定时器的一个节拍,例如我们可以设置1ms来运行,这有点类似于一个伪多线程,在微观来看我们实际是两个任务交替运行,但是宏观上我们却感觉两个任务在同时运行,妥妥的游戏得意,情场得意6️⃣,如下图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6MXiN2pO-1675423742794)(C:\Users\zh006\Desktop\images\image-20230203175210812.png)]

2. 裸机和rtos的优先级处理

同样的场景,假设此时小明肚子疼了,要去医院,此时裸机与RTOS又会怎么做呢?

在这里插入图片描述在这里插入图片描述在这里插入图片描述

2.1 裸机处理

这时我们可能就知道,这个时候用中断阿,并把它设为一个比较高的优先级,毕竟生命安全第一位,我们可以定义一个中断服务程序,一肚子痛就触发中断去医院,但我们注意,中断是一瞬间的事情,我们不能在中断服务函数做太多的事,比如我们在终端服务函数做一个delay个10ms,程序可能就会出现问题例如:

  • 中断处理时间太长或导致正常的应用程序不能按时被执行;
  • 执行中断时不能响应其他中断,中断执行时间太长容易丢其他中断;
  • 某个中断服务程序执行时间太长,可能导致中断嵌套非常深,容易导致栈溢出,也容易出现逻辑问题。

去医院就是一个长任务,需要坐车挂号看医生,很显然,我们不能把去医院放在中断中

但是呢,玩过单片机的我们都知道,对中断的处理我们一般都是设置一个全局的标志位,我们只需要在中断函数中设置标志位,然后再大循环中去判断这个标志位就可以了,代码如下:

while(1) 
{ 
	打游戏();
	回复信息(); 
	if(FLAG == 1)
	{
	   去医院();
	   FLAG = 0;
	}
}

但是假如我们此时再打游戏中,打游戏这个任务需要运行30min,即使此时FLAG这个标志位已经在中断中被置为1了也无济于事,仍然要等运行完上面两个任务才能进行下面的判断,实时性非常差

2.2 rtos处理

而rtos的处理方式就相当的优雅了,我们可以创建三个任务,并把去医院设为高优先级,让rtos系统自己去进行调度,并且我们注意一种情况,当去医院这个任务在运行没有占有cpu资源时,例如挂号要等待,此时cpu又可以分配给低优先级的任务,例如打游戏回信息,这样我们就很好的使用了cpu的资源

void main(void) 
{ 
	/* 创建打游戏任务 */
	xTaskCreate(打游戏)
	/* 创建回复信息任务 */ 
	xTaskCreate(回复信息)
	/* 创建去医院任务 */ 
	xTaskCreate(去医院)
}
void 游戏(void) 
{ 
   while(1) 
   { 
	 打游戏();
   }
}
void 信息(void) 
{ 
   while(1) 
   { 
	 回复信息();
   }
}
void 去医院(void) 
{ 
   while(1) 
   { 
	 去医院();
   }
}

3. 裸机和rtos的区别

3.1 裸机

裸机:裸机又称为前后台系统,前台系统指的中断服务函数,后台系统指的大循环,即应用程序

  • 实时性差:(应用程序) 轮流执行
  • delay:空等待,CPU不执行其他代码
  • 结构臃肿:实现功能都放在无限循环

在这里插入图片描述

3.2 rtos

RTOS特点:RTOS全称为:Real Time OS,就是实时操作系统,强调的是:实时性

  • 分而治之:实现功能划分为多个任务
  • 延时函数:任务调度
  • 抢占式:高优先级任务抢占低优先级任务,更高优先级也可以先运行
  • 任务堆栈:每个任务都有自己的栈空间,我们低优先级任务被抢占后,cpu重新回到自己手里,是从之前那个位置继续执行,因此这个栈空间需要有相关的信息,例如:寄存器的值局部变量…,这和c语言的linux多线程编程有点类似

在这里插入图片描述

值得注意的是,rtos也有中断,我们前面的任务调度其实是软件层面上的说法,而中断的优先级是最高的

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

freertos学习之路1-裸机和rtos的区别 的相关文章

随机推荐