【原创】飞思卡尔MQX基本组织结构和概念介绍
0赞介绍一下飞思卡尔实时操作系统MQX的基本组织结构以及MQX中一些常见概念的介绍。
1 MQX的组织结构
MQX 由核心组件(必选)和可选性组件构成。对于核心组件,只有那些 MQX 或应用程序调用的函数包含在映像中。为了满足要求,应用程序可通过加入可选组件来扩展和配置核心组件。图 -1 显示了以核心组件为中心,外围环绕可选性组件的示意图。表-1 总结了核心组件和可性选组件,它们都将在后面章节中给予描述。
|
|
2 初始化
初始化组件是核心组件。_mqx()运行的同时,应用程序开始启动,初始化硬件并启动 MQX。MQX 启动时,创建称为自启动任务的应用程序。
3 任务管理
任务管理是核心组件。与 MQX 启动时自动创建任务一样,应用程序运行时也能创建、管理和终止任务。它能为同一个任务创建多个实例,并且在一个应用程序中没有任务总个数的限制。应用程序可动态改变任
一任务的属性。当一个任务终止时,MQX 释放任务资源。此外,对于每个任务均可指定:退出函数:当任务终止时由 MQX 调用。异常处理:当处于活动状态的任务发生异常时由 MQX 调用。
6
|
4 调度
调度遵从 POSIX.4 标准(实时扩展)并且支持如下策略:
FIFO(基于优先级的抢占机制)调度是核心组件——活动任务(active task)是等待时间最长且优先级最高的任务。
轮转(又称时间片)调度也是核心组件——活动任务(active task)是优先级最高,等待时间最长且未消耗自身时间片的任务。
显式调度(使用任务队列)是一种可选性组件——可以使用任务队列明确地调度任务或创建相对复杂的同步机制。因为任务队列提供尽可能少的功能,因此效率很高。应用程序在创建任务队列时可指定使用 FIFO 或轮转调度策略。
5 存储管理
5.1 可变大小存储块管理
为了分配和释放可变大小的存储片(称为内存块),MQX 提供了类似于大部分 C 运行函数库提供的malloc()和free()函数功能的核心服务。可以从默认内存池的内部区或外部区分配存储块给任务或系统。分配给任务的存储块是该任务的资源,当任务终止时,MQX 将释放存储块,收回所分配的资源。
5.2 固定大小存储块管理(区块)
区块组件是可选性组件。可以分配和管理固定大小的存储片(称作区块)。区块组件支持快速、固定大小的存储分配,减少了存储碎片,节约了存储资源。区块可位于默认内存池的内部(动态区块)和外部(静态区块)。可将区块分配给任务或系统。分配给任务的存储块是该任务的资源,当任务终止时,MQX 将释放存储块,收回所分配的资源。
5.3 高速缓存控制
MQX 功能函数能够控制某些 CPU 具有的指令缓存和数据缓存。
5.4 存储器管理单元(MMU)控制
对于一些 CPU 而言,在使能高速缓存之前,必须先初始化存储管理单元(MMU)。MQX 功能函数能够初始化、使能和禁止 MMU,以及为 MMU 添加一个存储区域。你可以通过 MMU 页表来控制 MMU。
5.5 轻量级存储管理
当一个应用程序受到代码和数据大小限制时,可使用轻量级存储管理。轻量级存储管理只有少量的接口函数,代码和数据量也较小。因此,某些部分健壮性降低(移除了头部效验),速度变慢(任务销毁次数增多)。如果你更改了实时编译配置选项,那么在分配存储空间时,MQX 将使用轻量级存储组件。
6 任务同步
6.1 轻量级事件
轻量级事件(LWEvent)是可选性组件。对于使用位状态改变来实现同步的任务而言,这是一个低开销方式。轻量级事件需要的存储空间很少,且速度快。
6.2 事件
事件组件是可选性组件,支持格式化为位字段对象的动态管理。任务和中断服务例程可使用事件来实现同步,以位状态改变的形式传送简单信息。有些是命名的快速事件组。事件组具有自动清除事件位,因此,MQX 在事件位被设置后立即清除该事件位。应用程序能够设置位于远程处理器上的事件组内的事件位。
6.3 轻量级信号量
轻量级信号量(LWSems)组件是核心组件。对于实现共享资源同步存取的任务而言,这是一种低开销方式。轻量级信号量组件需要的存储空间很少,运行速度快,轻量级信号量计数 FIFO信号量且没有优先级继承。
6.4 信号量
信号量组件是可选性组件。信号量组件用以计数为形式的信号。你可以使用信号量同步任务,控制对共享资源的访问权限,或实现生产/消费信号机制。信号量组件提供 FIFO 队列、优先级队列和优先级继承,可以是严谨的,也可以是非严谨的。有些是命名的快速信号量。
6.5 互斥
互斥组件是可选性组件。遵从 POSIX.4a 标准(线程扩展)。在访问共享资源时,互斥组件实现任务间的相互排斥。互斥提供轮询、FIFO 队列、优先级队列、自旋和限制自旋队列、优先级继承以及优先级保护。互斥是严谨的,也就是说,一个任务不能解锁互斥,除非它先锁定了互斥。
6.6 消息
消息组件是可选性组件。任务间通过向其它任务打开的消息队列发送消息进行通信。每个任务打开自己的输入消息队列。消息队列由队列 ID 唯一识别,它是在队列创建时由 MQX 分配。只有打开了消息队列的任务才可以从队列接收消息。任何任务可以发送消息到先前打开的消息队列中,只要它知道打开的队列的 ID。
任务从消息池分配消息。消息池有两种:系统消息池和私有消息池。任何任务可以从系统消息池中分配消息(系统消息)。具有消息池 ID 的任务可以从私有消息池中分配消息(私有消息)。
6.7 任务队列
除了提供调度机制外,任务队列还提供简单有效的方法实现任务同步。你可以将任务队列中的任务挂起或移除。
7 处理器间通信
处理器间通信(IPC)组件是可选性组件。一个应用程序能够在多个处理器上同时运行,因为每个处理器有一个 MQX 可执行映像。可执行映像通过消息进行通信和协作,这些信息通过内存或处理器间的通信链传输。每个映像中的应用程序任务不必相同,事实上,它们通常是不一样的。
8 定时
8.1 时间组件
时间组件是可选性组件,你可以在 BSP 级允许或禁止它。时间有两种:消逝时间和绝对时间。你可以改变绝对时间。时间解析度依赖 MQX 启动时为目标硬件设置的应用程序解析度所决定。
8.2 轻量级定时器
轻量级定时器组件是可选性组件,为周期性调用应用函数提供低开销机制。轻量级定时器通过建立周期队列安装,在开始阶段加入一个定时器,在某偏移量处到期。当向队列增加一个轻量级定时器时,可以指定一个告知函数,它将在定时器到期时由 MQX滴答中断服务程序调用。因为定时器从中断服务程序运行,所以并不是所有的 MQX 函数能够调用。
8.3 定时器
定时器组件是可选性组件。它提供周期执行应用程序的功能。MQX 支持一次性定时器(到期一次)和周期性定时器(在给定间隔重复到期)。你可以设置定时器在某指定时间或时间段后启动。设置了定时器后,可以指定一个告知函数,当定时器到期时由定时器任务调用。告知函数可以用来同步任务,通过发送消息,设置事件,或者使用其它 MQX 同步机制实现。
8.4 看门狗
看门狗组件是可选性组件,它帮助用户检测任务级别的崩溃和死锁情况。
9 中断和异常处理
中断和异常处理是可选组件(PSP 级别)。MQX 为 BSP 定义范围内的所有硬件中断服务,并为活动任务保存最精简的场景信息。如果 CPU 支持嵌套中断,那么 MQX 也完全支持。一旦进入中断服务程序(ISR)内,应用程序可以重新定义中断级别。为了进一步缩短中断延迟,MQX推迟任务调度,直到所有中断服务程序都运行之后。除此之外,只有当中断服务程序准备好一个新任务时,MQX 才重新调度。为了减小堆栈规模,MQX 支持独立的中断堆栈。中断服务程序(ISR)不是任务;它是一个规模小、速度快、能对硬件中断迅速反应的例程。中断服务程序通常用 C 语言编写,它的任务包括重置设备,获取设备数据,以及向相关任务发送信号。通过非阻塞式 MQX 函数,中断服务程序可以用来给一个任务发送信号。