rtos的核心原理简析
rtos全称real-time operating system(实时操作系统),我来简单分析下:
我们都知道,c语句中调用一个函数后,该函数的返回地址都是放在堆栈中的(准确的说是栈中)。
rtos个人理解是一种黑客行为,他悄悄的修改了这个保存在栈中的返回这个地址,让调用函数返回到我们想让他返回的地方。
好了,这个返回什么时候返回呢?
一、 任务切换有两种:
1. 任务自己主动要求切换,这就是我们常用的sleep()函数了
2. 我的任务就是不想调用sleep()不切换,怎么呢? 好了,rtos中就有一个tick定时中断,定时中断后就跳转到另一个任务去了。为了保证实时性,外部中断以及其他外设中断也能够立刻切换。
二、 临界区
切换是可以了,但是现在我的任务运行一个东西就是不能够被打断的,怎么呢? 好了,rtos又有了一东西叫临界区,哈哈,加上就可以满足需求了。
三、 任务同步
从宏观上看,rtos的每个任务相对并发运行的,我怎么保证任务A运行到某个地方,任务B的继续向下执行? rots就有了信号量一说。
四、任务间数据处理问题
c开发的很多人常会用全局变量解决,由于个任务运行没有先后顺序,全局变量会带来相关隐行bug,必须慎用;rtos引入了队列、邮箱等解决问题。
以上就是rtos简单分析,不同的rtos还应该以具体源码为准。上面说了rtos,还有一个不得不说的OSAL,全称operating system abstraction layer用过TI的蓝牙,zigbee芯片的朋友都知道,TI用的蓝牙和zigbee协议栈中就有OSAL这个东西。他与rtos又有什么不同呢?
1. 任务与系统
rtos的任务和系统是独立的,也就是说rtos中的任务使用while(1);语句不会影响到系统以及其他任务。
OSAL则不同,任务和系统是耦合在一起的,也就是任务与系统都是运行在一个循环中的,即:
while(1){
系统
时钟Tick
事件信息
任务处理
...
}
2. 延时问题
rtos中很简单,直接调用系统sleep即可
OSAL则只能使用系统提供time来做大的延时,小延时不影响系统也可以使用while(delay--);