首先,应该介绍什么是FreeRtos,他于单片机而言就是一个管理器,作为管理者管理嵌入式芯片中的任务,堆栈,中断,队列等等资源,对于操作系统而言,又分为实时操作系统和非实时操作系统,实时操作系统代表任务或者某个功能必须在指定的运行时间内完成,保证设备想要执行的功能能立即得到执行,FreeRtos就是一个迷你型的实时操作系统内核。
作为轻量级的操作系统活跃于嵌入式行业当中。它占用的资源非常少,是为数不多的能够在小型单片机上移植的操作系统,并且是完全免费的。包括在飞机、航天器上,也在使用一些特别定制的实时嵌入式操作系统,来保证设备的正常运转。
作为嵌入式实时操作系统,FreeRtos具有抢占式实时操作系统内核,也就是说任务之间有优先级的区分,比如一些需要实时响应的功能部分,可以把优先级设置得高一些,这样当需要执行的时候,高优先级别的任务可以打断别的低优先级任务,率先得到CPU资源,得到执行的机会。作为体量而言,他本身占用的rom空间与ram空间就非常小了,它还支持再往下地裁剪,可以将功能裁剪一部分,最小能够只占用10kb左右的rom空间和大约10kb的ram空间。
互斥锁—避免死锁
同时FreeRtos内部就有互斥锁,互斥锁的作用在于避免死锁的情况发生,由于任务运行可能会用到一部分的参数资源,CPU资源等等,当一个任务占用这些资源并且不释放的时候,其他的任务是无法调用这些资源的。那么试想,当两个任务分别在执行的时候,虽然由于单核的原因,任务肯定有挂起的时候,但是挂起并没有代表任务就释放了这些资源,当两个任务分别拥有对方想要使用的资源,所以都等待着对方释放,当双方都不释放的时候,就会造成死锁,两个任务都将彻底卡死不再继续执行,同时对于一些关键的代码段而言,由于任务之间的调度,可能被多个任务执行过甚至更改过参数,这种情况也是需要避免的,这就是互斥锁的意义,它保证在同一时刻,只能有一个线程去操作关键性的共享数据,保证数据不被多任务调用执行,保证任务的正确调度和数据的安全性。
信号量和消息队列
FreeRtos还有信号量和消息队列的功能。一个任务可以向消息队列中添加信息,添加的多条信息按照FIFO先入先出的形式(这种形式也更适合数据信息处理)的方式被别的任务接收到,接收到后判定是否执行相关操作,这样可以防止多任务的访问冲突,也解决了中断服务程序与任务之间的消息传递的问题。
总结
其实对于单片机或者嵌入式设备而言,FreeRtos并不是百利而无一害,既然作为管理者,肯定是需要CPU资源支持管理调度的,同时还有rom和ram的消耗,所以对于嵌入式设备而言,是否要上FreeRtos系统是一种权衡,如果小型的简单逻辑设备,没有必要舍近求远去移植操作系统,直接裸奔就是最好的选择,本身简单的逻辑也不需要太多的管理支持。
但是随着逻辑的增多,功能的增多,FreeRtos的必要性就会越来越高,因为逻辑的增多,我们更需要将精力集中于功能部分的开发而不是这些功能任务间的调度。任务的运行、挂起、就绪态之间的转换,也正是FreeRtos的核心,要在众多任务间做好这件事,并不容易,感谢有这么一种开源免费的操作系统,来帮助开发者精力集中地进行开发,让设备的运行更稳定、更加科学。
来源:亿佰特物联网实验室