单任务系统(裸机)弊端

学习多任务系统之前,我们先来回顾下单任务系统的编程框架,即裸机时的编程框架。裸机编程主要是采用超级循环(super-loops)系统,又称前后台系统。应用程序是一个无限的循环,循环中调用相应的函数完成相应的操作,这部分可以看做后台行为;中断服务程序处理异步事件,这部分可以看做是前台行为。后台也可以叫做任务级,前台也叫作中断级。

 【FreeRTOS操作系统教程】第10章 <wbr> <wbr>FreeRTOS任务管理(上)

图10.1 单任务系统

对于前后台系统的编程思路主要有以下两种方式:

10.1.1 查询方式

对于一些简单的应用,处理器可以查询数据或者消息是否就绪,就绪后进行处理,然后再等待,如此循环下去。对于简单的任务,这种方式简单易处理。但大多数情况下,需要处理多个接口数据或者消息,那就需要多次处理,如下面的流程图所示:

【FreeRTOS操作系统教程】第10章 <wbr> <wbr>FreeRTOS任务管理(上)

 

用查询方式处理简单的应用,效果比较好,但是随着工程的复杂,采用查询方式实现的工程就变得很难维护,同时,由于无法定义查询任务的优先级,这种查询方式会使得重要的接口消息得不到及时响应。比如程序一直在等待一个非紧急消息就绪,如果这个消息后面还有一个紧急的消息需要处理,那么就会使得紧急消息长时间得不到执行。

10.1.2 中断方式

对于查询方式无法有效执行紧急任务的情况,采用中断方式就有效地解决了这个问题,下面是中断方式简单的流程图:

【FreeRTOS操作系统教程】第10章 <wbr> <wbr>FreeRTOS任务管理(上)

 

采用中断和查询结合的方式可以解决大部分裸机应用,但随着工程的复杂,裸机方式的缺点就暴露出来了:

u  必须在中断(ISR)内处理时间关键运算:

l  ISR 函数变得非常复杂,并且需要很长执行时间。

l  ISR 嵌套可能产生不可预测的执行时间和堆栈需求。

u  超级循环和ISR之间的数据交换是通过全局共享变量进行的:

l  应用程序的程序员必须确保数据一致性。

u  超级循环可以与系统计时器轻松同步,但:

l  如果系统需要多种不同的周期时间,则会很难实现。

l  超过超级循环周期的耗时函数需要做拆分。

l  增加软件开销,应用程序难以理解。

u  超级循环使得应用程序变得非常复杂,因此难以扩展:

l  一个简单的更改就可能产生不可预测的副作用,对这种副作用进行分析非常耗时。

l  超级循环概念的这些缺点可以通过使用实时操作系统(RTOS) 来解决。

10.2多任务系统

针对这些情况,使用多任务系统就可以解决这些问题了。下面是一个多任务系统的流程图:

 【FreeRTOS操作系统教程】第10章 <wbr> <wbr>FreeRTOS任务管理(上)

多任务系统或者说RTOS的实现,重点就在这个调度器上,而调度器的作用就是使用相关的调度算法来决定当前需要执行的任务。如上图所示的那样,创建了任务并完成OS初始化后,就可以通过调度器来决定任务A,任务B和任务C的运行,从而实现多任务系统。另外需要初学者注意的是,这里所说的多任务系统同一时刻只能有一个任务可以运行,只是通过调度器的决策,看起来像所有任务同时运行一样。为了更好的说明这个问题,再举一个详细的运行例子,运行条件如下:

u  使用抢占式调度器。

u  1个空闲任务,优先级最低。

u  2个应用任务,一个高优先级和一个低优先级,优先级都比空闲任务优先级高。

u  中断服务程序,含USB中断,串口中断和系统滴答定时器中断。

下图10.2所示是任务的运行过程,其中横坐标是任务优先级由低到高排列,纵坐标是运行时间,时间刻度有小到大。

 

【FreeRTOS操作系统教程】第10章 <wbr> <wbr>FreeRTOS任务管理(上)

图10.2 多任务系统运行过程

(1)    启动RTOS,首先执行高优先级任务(vTaskStartScheduler)。

(2)    高优先级任务等待事件标志(xEventGroupWaitBits)被阻塞,低优先级任务得到执行。

(3)    低优先级任务执行的过程中产生USB中断,进入USB中断服务程序。

(4)    退出USB中断复位程序,回到低优先级任务继续执行。

(5)    低优先级任务执行过程中产生串口接收中断,进入串口接收中断服务程序。

(6)    退出串口接收中断复位程序,并发送事件标志设置消息(xEventGroupSetBitsFromISR),被阻塞的高优先级任务就会重新进入就绪状态,这个时候高优先级任务和低优先级任务都在就绪态,抢占式调度器就会让高优先级的任务先执行,所以此时就会进入高优先级任务。

(7)    高优先级任务由于等待事件标志(xEventGroupWaitBits)会再次被阻塞,低优先级任务开始继续执行。

(8)    低优先级任务调用函数vTaskDelay,低优先级任务被挂起,从而空闲任务得到执行。

(9)    空闲任务执行期间发生滴答定时器中断,进入滴答定时器中断服务程序。

(10)  退出滴答定时器中断,由于低优先级任务延时时间到,低优先级任务继续执行。

(11)  低优先级任务再次调用延迟函数vTaskDelay,低优先级任务被挂起,从而切换到空闲任务。空闲任务得到执行。

通过上面实例的讲解,大家应该对多任务系统完整的运行过程有了一个全面的认识。随着教程后面对调度器,任务切换等知识点的讲解,大家会对这个运行过程有更深刻的理解。

FreeRTOS就是一款支持多任务运行的实时操作系统,具有时间片,抢占式和合作式三种调度方法。通过FreeRTOS实时操作系统可以将程序函数分成独立的任务,并为其提供合理的调度方式。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值