嵌入式 RTOS多任务操作系统简介

任务管理

1. 单任务系统

      裸机编程主要是采用超级循环(super-loops)系统,又称前后台系统。应用程序是一个无限
      的循环,循环中调用相应的函数完成相应的操作,这部分可以看做后台行为,中断服务程序
      处理异步事件,这部分可以看做是前台行为。后台也可以叫做任务级,前台也叫作中断级。

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

      1. 查询方式
         对于一些简单的应用,处理器可以查询数据或者消息是否就绪,就绪后进行处理,然后再
         等待,如此循环下去。对于简单的任务,这种方式简单易处理。但大多数情况下,需要处
         理多个口数据或者消息,那就需要多次处理。用查询方式处理简单的应用,效果比较好
         但是随着工程的复杂,采用查询方式实现的工程就变的很难维护,同时,由于无法定义查
         询任务的优先级,这种查询方式会使得重要的接口消息得不到及时响应。
         比如程序一直在等待一个非紧急消息就绪,如果这个消息后面还有一个紧急的消息需要
         处理,那么就会使得紧急消息长时间得不到执行。

嵌入式 RTOS多任务操作系统简介_第1张图片
2. 中断方式
对于查询方式无法有效执行紧急任务的情况,采用中断方式就有效的解决了这个问题
嵌入式 RTOS多任务操作系统简介_第2张图片
采用中断和查询结合的方式可以解决大部分裸机应用,但随着工程的复杂,
裸机方式的缺点就暴露出来了
 必须在中断(ISR)内处理关键运算:
 ISR 函数变得非常复杂,并且需要很长执行时间。
 ISR 嵌套可能产生不可预测的执行时间和堆栈需求。
 超级循环和 ISR 之间的数据交换是通过全局共享变量进行的:
 应用程序的程序员必须确保数据一致性。
 超级循环可以与系统计时器轻松同步,但如果系统需要多种不同的周期时间,则会很难实现。
 超过超级循环周期的耗时函数需要做拆分。
 增加软件开销,应用程序难以理解。
 超级循环使得应用程序变得非常复杂,因此难以扩展:
 一个简单的更改就可能产生不可预测的副作用,对这种副作用进行分析非常耗时。
 超级循环 概念的这些缺点可以通过使用实时操作系统 (RTOS) 来解决。

2. 多任务系统

嵌入式 RTOS多任务操作系统简介_第3张图片
###1. 多任务系统或者说 RTOS 的实现,重点就在这个调度器上,而调度器的作用就是使用相关的调度算法来决定当前需要执行的任务。如上图所画的那样,创建了任务并完成 OS 初始化后,就可以通过调度器来决定任务 A,任务 B 和任务 C 的运行,从而实现多任务系统。另外需要初学者注意的是,这里所说的多任务系统同一时刻只能有一个任务可以运行,只是通过调度器的决策,看起来像所有任务同时运行一样。为了更好的说明这个问题,再举一个详细的运行例子,运行条件如下:
 使用抢占式调度器。
 1 个空闲任务,优先级最低。
 2 个应用任务,一个高优先级和一个低优先级,优先级都比空闲任务优先级高。
 中断服务程序,含 USB 中断,串口中断和系统滴答定时器中断。

嵌入式 RTOS多任务操作系统简介_第4张图片
###2. 多任务运行过程详解
(1) 启动 RTOS,首先执行高优先级任务。
(2) 高优先级任务等待事件标志( os_evt_wait_and )被挂起,低优先级任务得到执行。
(3) 低优先级任务执行的过程中产生 USB 中断,进入 USB 中断服务程序。
(4) 退出 USB 中断复位程序,回到低优先级任务继续执行。
(5) 低优先级任务执行过程中产生串口接收中断,进入串口接收中断服务程序。
(6) 退出串口接收中断复位程序,并发送事件标志设置消息( isr_evt_set ),被挂起的高优先级任务就会重新进入就绪状态,这个时候高优先级任务和低优先级任务都在就绪态,基于优先级的调度器就会让高优先级的任务先执行,此时就会进入高优先级任务。
(7) 高优先级任务由于等待事件标志( os_evt_wait_and )会再次被挂起,低优先级任务开始继续执行。
(8) 低优先级任务调用函数 os_dly_ wait,低优先级任务被挂起,从而空闲任务得到执行。
(9) 空闲任务执行期间发生滴答定时器中断,进入滴答定时器中断服务程序。
(10) 退出滴答定时器中断,由于低优先级任务延时时间到,低优先级任务继续执行。
(11) 低优先级任务再次调用延迟函数 os_dly_ wait,低优先级任务被挂起,从而切换到空闲任务。空闲任务得到执行。

###3. RTX 就是一款支持多任务运行的实时操作系统,具有时间片,抢占式和合作式三种调度方法
 任务调度 - 任务在需要时进行调用,从而确保了更好的程序执行和事件响应。
 多任务 - 任务调度会产生同时执行多个任务的效果。
 确定性的行为 - 在定义的时间内处理事件和中断。
 更短的 ISR - 实现更加确定的中断行为。
 任务间通信 - 管理多个任务之间的数据、内存和硬件资源共享。
 定义的堆栈使用 - 每个任务分配一个堆栈空间,从而实现可预测的内存使用。
 系统管理 - 可以专注于应用程序开发而不是资源管理。

你可能感兴趣的:(RTOS)