RTOS基本原理以及实例
时钟节拍
时钟节拍是一个特定的周期性中断,一般使 用定时器中断实现。时钟节拍如同操作系统内核 的脉搏,为各种内核服务提供一定精度的时间信 息。 时钟节拍的抖动是总是存在的,具体的抖动 幅度不仅取决于时钟节拍的周期,也和微处理器 的负荷有关系。 由于时钟节拍的抖动,调用操作系统延时函 数时应多定义一个时钟节拍。
任务
每个任务总是处于休眠、就绪、运行、挂起 和被中断这五种状态中的一种,并且在程序运行 过程中不断变化状态。 挂起
休眠
就绪
运行
被中断
任务调度
运行的任务主动放弃CPU 任务调度的原因 中断使高优先级任务抢占CPU
时间片
基于时间 任务调度的策略 基于优先级 结合优先级和时间 就绪时间
中断
中断是一种硬件机制,用于通知微处理器有 异步事件发生了。中断的一旦被识别,微处理器 首先执行保护现场操作,而后调用中断服务程序 处理异步事件。 对于不可剥夺型内核,中断返回后回到被中 断的任务;而对于可剥夺型内核,中断返回后将 让进入就绪状态的最高优先级任务运行,被中断 任务如果不是最高优先级的就绪任务,将进入挂 起状态,等待运行的机会。 中断级的优先权总是高于任务级。
事件等待
通常信号量、事件和消息都可以支持无限等 待方式和限时等待方式。 在无限等待方式下,任务无条件等待事件的 发生从而进入就绪状态,如果所等的事件始终没 有发生,任务将始终处于挂起状态。 在限时等待方式下,任务在指定的时间范围 内等待事件的发生,如果所等的事件发生,任务 将立刻进入就绪状态,如果在指定时间内所等的 事件没有发生,任务也将在进入就绪状态。
信号量
信号量实际上是一种约定机制,在多任务内 核中普遍使用。信号量像是一把钥匙,任务要运 行下去,得先拿到这把钥匙。如果某信号量已被 别的任务占用,其他需要该信号量的任务只得被 挂起,直到该信号量被当前使用者释放。 控制共享资源的互斥使用 标志某事件的发生
信号量的作用
使两个任务的行为同步
事件
事件实际上是一种标志。通常使用一个与微 处理器位宽相同的变量,每个比特表示一定的含 义,用于在任务之间传递少量的信息,实现任务 的同步。 独立型(OR) 事件的同步方式 关联型(AND)
消息
消息邮箱也称作交换消息,是一种非常灵活 的任务通信方式。通过内核服务,任务或者中断 服务程序把一则消息(即一个指针)放到邮箱里 去。一个或多个任务可以通过内核服务接收这则 消息。该指针指向的内容就是任务之间传递的消 息。 多个消息邮箱可以构成消息队列。通常内核 按照先进先出的策略管理消息队列。
实时操作系统
(Real Time Operating System)
ห้องสมุดไป่ตู้
实时系统
实时系统是指必须在有限的时间内做出响应 的系统。根据对时间要求的严格程度可以划分为 硬实时系统和软实时系统。
硬实时系统是指系统响应必须在指定的时间 之内;软实时系统对时间的要求相对较低,偶尔 响应较慢也可以接受。
前后台方式的软件体系
内核
不可剥夺型内核 内核类型 可剥夺型内核 不可剥夺型内核要求每个任务主动放弃微处 理器的控制权,任务级响应时间取决于最长的任 务执行时间。 可剥夺型内核允许最高优先级的任务一旦就 绪,总能得到优先运行的机会。任务级响应时间 得以最优化。
任务
每个任务都是一个无限的循环,多个任务以时分复用 方式占用同一个微处理器。 每个任务都有各自独立的堆栈,通过将运行中工作寄 存器的数据保存在堆栈中,每个任务都感觉自己拥有专用 的工作寄存器。 每个任务通常有一定的优先级,越重要的任务优先级 越高。实时系统大多综合了软实时和硬实时这两种需求, 应当合理创建任务,并且给任务赋予合理的优先级。 最低优先级任务: Idle Task。
后台行为:在一个无限循环中按顺序执行操作。 前台行为:当中断发生时处理异步事件。
任 务 级
中 断 级
前后台方式的软件体系需要的系统资源比较 少,但是在实时性方面的性能比较差,任务级响 应时间可能很长,程序的可维护性也比较差。
基于实时操作系统的软件体系
实时操作系统是一段在嵌入式系统启动后首先 运行的背景程序,用户的应用程序是运行于实时操 作系统之上的多个任务。实时操作系统根据任务的 要求,进行任务调度、资源分配、异常处理以及任 务间的通信。微观上多个任务以时分复用方式占用 微处理器,宏观上感觉多个任务是在同时运行。 基于实时操作系统的软件体系占用的资源比较 多,但是在实时性方面的性能比较好,程序的可维 护性也比较好,更容易实现模块化。
基于实时操作系统的软件体系
USER PROGRAM APPLICATION MIDDLEWARE DRIVER RTOS HARDWARE
内核
实时操作系统内核的最基本服务就是进行任 务调度,此外还提供多种系统服务,包括信号量 管理、事件管理、消息队列和定时延时等。内核 的这些服务都是通过提供内核函数实现的 任务通过调用内核函数使用内核提供的各种 服务,任务自己感觉不到多进程环境,它觉得自 己始终在控制微处理器,仅仅是调用了一个函数 而已。