今日头条
本课是在听了韦东山老师的裸机和RTOS开发模式课程后,才简单了解裸机开发与RTOS开发的区别。更多的是对现在自己编程方式有一个认知,希望在这里与大家分享。 |
什么是RTOS?实时操作系统(RTOS)是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统做出快速响应,并控制所有实时任务协调一致运行的操作系统。提供及时响应和高可靠性是其主要特点。 |
在小公司中的项目,很少用到RTOS模式,基本我都是使用裸机开发模式。
那就先分享一下裸机开发模式:
裸机开发模式我知道的有三种:
轮询方式 |
事件驱动方式 |
状态机方式(今天我会简单的讲一下我理解的状态机方式) |
概念:在主程序里,一直在查询所有事情,直到查询的某个事情发生。
在进入单片机工程师职位时,我使用的一直是这种方式。因为我的理解是程序只要正常执行就说明可以了。
这种方式的缺点是:函数之间会相互影响。
// 经典单片机程序
void main()
{
while (1)
{
Work();//工作
Eat();//吃饭
}
}
程序执行流程如下:
轮询执行流程先处理工作的事情,处理完后再处理吃饭的事情。如果吃饭的事情触发了,未到查询吃饭的事情,吃饭的事情就
需要等待,直到吃饭的事情查询到。
概念:什么叫事件驱动?当某个事件发生时,才调用对应函数,这就叫事件驱动。
首先我们要理解什么是事件?
例如:按下了按键、串口接收到了数据、模块产生了中断、某个全局变量被设置了,这些都被称为事件。
void main()
{
while (1)
{
if (get_key)
process_key();
}
}
void key_isr() /* 工作触发中断a */
{
key = xxx;
get_key = 1;
}
void b_isr() /* 吃饭触发中断b */
{
吃几口饭();
}
这种方式我在处理IO外部中断时和按键时用的比较多,当IO口发生下降沿或上升沿中断时,进入中断标志位置0/1。
①如果你对程序执行的时间很了解,否则切记不要在中断之间去处理程序。因为如果程序执行时间比较长,会影响下一次中断事件的处理。因为每次中断只能处理一个,几个中断优先级相同的同时触发都需要排队。这样影响了其他几个中断程序执行的效率。
②在每次进入中断后,标志位置0/1的操作就不会对中断有那么大的影响。主程序里只需要处理哪个标志位被置1,但是在主程序里处理方式就变为轮询的方式。主程序里面一直在等待哪个事件的标志位置1。
什么是状态机?把一个程序分为好几个小部分,每次只处理一部分然后跳到另一个程序去执行,这样来回切换状态。
个人见解(新人角度分析):如下图所示
状态机执行流程状态机的缺陷:
需要我们使用状态机拆分程序:比较麻烦,有些复杂的程序无法拆分为状态机。
假设要调用两个函数AB,AB执行的时间都很长,使用裸机程序时可以把AB函数改造为"状态机",还可以使用RTOS。这两种方法的核心都是"分时复用":
分时:函数A运行一小段时间,函数B再运行一小段时间
复用:复用谁?就是CPU
还是以那位工作和吃饭为例,对于眼明手快的人,她可以一心多用,她这样做:
左手拿筷子,吃饭
右手敲键盘,工作
两不耽误,一边“以为”在正常吃饭,一边“以为”在专心工作
但是脑子只有一个啊,虽然说“一心多用”,但是谁能同时思考两件事?
只是她反应快,上一秒钟在考虑夹哪个菜,下一秒钟考虑写哪些信息
程序运行时间图如下:
// RTOS程序
喂饭()
{
while (1)
{
吃一口饭();
}
}
回信息()
{
while (1)
{
写一个文件();
}
}
void main()
{
create_task(吃饭);
create_task(写文件);
start_scheduler();
while (1)
{
sleep();
}
}
审核编辑:符乾江
全部0条评论
快来发表一下你的评论吧 !