7.2 多任务系统 针对这些情况,使用多任务系统就可以解决这些问题了。下面是一个多任务系统的流程图: 多任务系统或者说RTOS的实现,重点就在这个调度器上,而调度器的作用就是使用相关的调度算法来决定当前需要执行的任务。如上图所画的那样,创建了任务并完成OS初始化后,就可以通过调度器来决定任务A,任务B和任务C的运行,从而实现多任务系统。另外需要初学者注意的是,这里所说的多任务系统同一时刻只能有一个任务可以运行,只是通过调度器的决策,看起来像所有任务同时运行一样。为了更好的说明这个问题,再举一个详细的运行例子,运行条件如下: 1. 使用抢占式调度器。 2. 1个空闲任务,优先级最低。 3. 2个应用任务,一个高优先级和一个低优先级,优先级都比空闲任务优先级高。 4. 中断服务程序,含USB中断,串口中断和系统滴答定时器中断。 下图7.2所示是任务的运行过程,其中横坐标是任务优先级由低到高排列,纵坐标是运行时间,时间刻度有小到大。 图7.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,低优先级任务被挂起,从而切换到空闲任务。空闲任务得到执行。
通过上面实例的讲解,大家应该对多任务系统完整的运行过程有了一个全面的认识。随着教程后面对调度器,任务切换等知识点的讲解,大家会对这个运行过程有更深刻的理解。 RTX就是一款支持多任务运行的实时操作系统,具有时间片,抢占式和合作式三种调度方法。通过RTX实时操作系统可以将程序函数分成独立的任务,并为其提供合理的调度方式。同时RTX实时操作系统为多任务的执行提供了以下重要优势: 任务调度 - 任务在需要时进行调用,从而确保了更好的程序执行和事件响应。 多任务 - 任务调度会产生同时执行多个任务的效果。 确定性的行为 - 在定义的时间内处理事件和中断。 更短的 ISR - 实现更加确定的中断行为。 任务间通信 - 管理多个任务之间的数据、内存和硬件资源共享。 定义的堆栈使用 - 每个任务分配一个堆栈空间,从而实现可预测的内存使用。 系统管理 - 可以专注于应用程序开发而不是资源管理。 图7.3RTX中任务通信
|