1、为什么学习RTOS
一个妈妈需要给孩子喂饭,同时还需要回同事消息
1、在主函数中轮询
void main(void)
{
while(1)
{
喂饭;
回消息;
}
}
这中方法的缺点:当喂饭/回消息时间过长时,会导致另一个任务等待的时间过久
2、使用中断(也可以称为前后台)
void main(void)
{
while(1)
{
喂饭; //后台
}
}
void 滴_中断()
{
回消息; //前台
}
缺点:一直在运行喂饭,当有“滴”时,去运行回消息的任务,但是当某一次回消息时间过长时,会导致喂饭等等时间过长
3、定时器驱动
void main(void)
{
while(1)
{}
}
void 定时器_中断()
{
static int cnt = 0;
cnt++;
if(cnt % 2 == 0)
{
喂饭;
}
if(cnt % 5 == 0)
{
回消息;
}
}
缺点:当某次回消息的时间过长,会阻碍喂一口饭
以上方法都无法解决俩个任务之间的相互影响。
4、基于状态机
当“喂饭”“回消息”都需要花很长的时间,无论前面的那种设计模式,都会退化到轮询模式的缺点:函数相互之间有影响。可以使用状态机来解决这个缺点:
//状态机
void main(void)
{
while(1)
{
喂饭();
回消息();
}
}
//2个函数的内部实现:使用状态机,每次只执行一个状态的代码,减少每次执行的时间
void 喂饭(void)
{
static int state = 0;
switch(state)
{
case 0:
{
/* 舀饭 */ /* 进入下一个状态 */
state++;
break;
}
case 1:
{
/* 喂饭 */ /* 进入下一个状态 */
state++;
break;
}
case 2:
{
/* 舀菜*/ /* 进入下一个状态 */
state++;
break;
}
case 3:
{
/* 喂菜 */ /* 恢复到初始状态 */
state = 0;
break;
}
}
}
void 回消息(void)
{
static int state = 0;
switch(state)
{
case 0:
{
/* 查看消息 */ /* 进入下一个状态 */
state++;
break;
}
case 1:
{
/* 打字 */ /* 进入下一个状态 */
state++;
break;
}
case 2:
{
/* 发送 */ /* 恢复到初始状态 */
state = 0;
break;
}
}
}
这种方法可以使两种任务相互之间的影响降低,但是这种方法需要将任务拆分成若干个状态,当遇到较为复杂的任务时,没法将任务拆分
5、多任务状态
RTOS 交叉执行
//RTOS
喂饭任务()
{
while(1)
{
喂饭();
}
}
回消息()
{
while(1)
{
回消息();
}
}
void main()
{
//创建2个任务
create_task(喂饭任务);
create_task(回消息);
//启动调度器
start_scheduler();
}
多任务系统会依次给这些任务分配时间:你执行一会,我执行一会,如此循环,只要切换的间隔足够短,用户会“感觉这些任务在同时运行”。
总:所以复杂的程序还是需要使用RTOS