很多STM32单片机初学者都是从裸机开始的,裸机确实也能开发出好的产品。
但是,作为一个嵌入式软件工程师,况且用的并不是51那种低端单片机,如
果只会用裸机开发产品,那肯定是不够的。
要从裸机的思维转变到RTOS(Real Time Operating System)的思维,其实
需要一个过程,而且开始的一段时间会很痛苦。但过一段时间理解了一些内
容,能写一些Demo之后,你会发现其实RTOS也不难。
现在FreeRTOS在CubeMX工具中可以直接配置并使用,相当方便。
为什么需要RTOS
为什么我们需要RTOS?就像最开始学C编程时,老师告诉我们,指针很重要,
那时你肯定有一个大的疑问,指针到底有什么好?
心里一直犯嘀咕着:不用指针不一样把程序编出来了? 现在想想看C语言没
了指针,是不是“寸步难行”呢。
回到正题,我们到底为什么需要RTOS?
这是最常见的一种思路,对于简单的系统当然是够用了,但这样的系统实时
性很差。
比如“事务1”如果是一个用户输入的检测,当用户输入时,如果程序正在处
理事务1下面的那些事务,那么这次用户输入将失效,用户的体验是“这个按
键不灵敏,这个机器很慢”,而我们如果把事务放到中断里去处理,虽然改
善了实时性但会导致另外一个问题,有可能会引发中断丢失,这个后果有时
候比“慢一点”更加严重和恶劣!
又比如事务2是一个只需要1s钟处理一次的任务,那么显然事务2会白白浪费
CPU的时间。
改进思路
看到上面裸机开发的局限了吗?
加Q2859780203,一起探讨,获取更多资料
可以看到,这种改进后的思路,使得事务的执行时间得到控制,事务只在自
己的时间片到来后,才会去执行。但这种方式仍然不能彻底解决“实时性”
的问题,因为某个事务的时间片到来后,也不能立即就执行,必须等到当前
事务的时间片用完,并且后面的事务时间片没到来,才有机会获得“执行时
间”。
这时候我们需要继续改进思路,为了使得某个事务的时间片到来后能立即执行
,我们需要在时钟中断里判断完时间片后,改变程序的返回位置,让程序不
返回到刚刚被打断的位置,而从最新获得了时间片的事务处开始执行,这样
就彻底解决了事务的实时问题。
我们在这个思路上,进行改进,我们需要在每次进入时钟中断前,保存CPU的
当前状态和当前事务用到的一些数据,然后我们进入时钟中断进行时间片处
理,若发现有新的更紧急的事务的时间片到来了,则我们改变中断的返回的
地址,并在CPU中恢复这个更紧急的事务的现场,然后返回中断开始执行这个
更紧急的事务。
使用RTOS的好处
上面那段话,对于初学者来说,可能有些不好理解。
事实上,这是因为要实现这个过程是有些复杂和麻烦的,这时候我们就需要
找一个操作系统(OS)帮我们做这些事了,如果你能自己用代码实现这个过程
,事实上你就在自己写操作系统了。
其实从这里也可也看出,操作系统的原理其实并不那么神秘,只是一些细节
你很难做好。我们常见的RTOS基本都是这样的一个操作系统,它能帮你完成
这些事情,而且是很优雅的帮你完成!
RTOS的用处远不止帮你完成这个“事务时间片的处理”,它还能帮你处理各
种超时,进行内存管理,完成任务间的通信等。
有了RTOS,程序的层次也更加清晰,给系统添加功能也更方便,这一切在大
型项目中越发的明显!
但是,作为一个嵌入式软件工程师,况且用的并不是51那种低端单片机,如
果只会用裸机开发产品,那肯定是不够的。
要从裸机的思维转变到RTOS(Real Time Operating System)的思维,其实
需要一个过程,而且开始的一段时间会很痛苦。但过一段时间理解了一些内
容,能写一些Demo之后,你会发现其实RTOS也不难。
现在FreeRTOS在CubeMX工具中可以直接配置并使用,相当方便。
为什么需要RTOS
为什么我们需要RTOS?就像最开始学C编程时,老师告诉我们,指针很重要,
那时你肯定有一个大的疑问,指针到底有什么好?
心里一直犯嘀咕着:不用指针不一样把程序编出来了? 现在想想看C语言没
了指针,是不是“寸步难行”呢。
回到正题,我们到底为什么需要RTOS?
这是最常见的一种思路,对于简单的系统当然是够用了,但这样的系统实时
性很差。
比如“事务1”如果是一个用户输入的检测,当用户输入时,如果程序正在处
理事务1下面的那些事务,那么这次用户输入将失效,用户的体验是“这个按
键不灵敏,这个机器很慢”,而我们如果把事务放到中断里去处理,虽然改
善了实时性但会导致另外一个问题,有可能会引发中断丢失,这个后果有时
候比“慢一点”更加严重和恶劣!
又比如事务2是一个只需要1s钟处理一次的任务,那么显然事务2会白白浪费
CPU的时间。
改进思路
看到上面裸机开发的局限了吗?
加Q2859780203,一起探讨,获取更多资料
可以看到,这种改进后的思路,使得事务的执行时间得到控制,事务只在自
己的时间片到来后,才会去执行。但这种方式仍然不能彻底解决“实时性”
的问题,因为某个事务的时间片到来后,也不能立即就执行,必须等到当前
事务的时间片用完,并且后面的事务时间片没到来,才有机会获得“执行时
间”。
这时候我们需要继续改进思路,为了使得某个事务的时间片到来后能立即执行
,我们需要在时钟中断里判断完时间片后,改变程序的返回位置,让程序不
返回到刚刚被打断的位置,而从最新获得了时间片的事务处开始执行,这样
就彻底解决了事务的实时问题。
我们在这个思路上,进行改进,我们需要在每次进入时钟中断前,保存CPU的
当前状态和当前事务用到的一些数据,然后我们进入时钟中断进行时间片处
理,若发现有新的更紧急的事务的时间片到来了,则我们改变中断的返回的
地址,并在CPU中恢复这个更紧急的事务的现场,然后返回中断开始执行这个
更紧急的事务。
使用RTOS的好处
上面那段话,对于初学者来说,可能有些不好理解。
事实上,这是因为要实现这个过程是有些复杂和麻烦的,这时候我们就需要
找一个操作系统(OS)帮我们做这些事了,如果你能自己用代码实现这个过程
,事实上你就在自己写操作系统了。
其实从这里也可也看出,操作系统的原理其实并不那么神秘,只是一些细节
你很难做好。我们常见的RTOS基本都是这样的一个操作系统,它能帮你完成
这些事情,而且是很优雅的帮你完成!
RTOS的用处远不止帮你完成这个“事务时间片的处理”,它还能帮你处理各
种超时,进行内存管理,完成任务间的通信等。
有了RTOS,程序的层次也更加清晰,给系统添加功能也更方便,这一切在大
型项目中越发的明显!