garfield

【原创】飞思卡尔MQX基本组织结构和概念介绍

0
阅读(5199)

介绍一下飞思卡尔实时操作系统MQX的基本组织结构以及MQX中一些常见概念的介绍。

1 MQX的组织结构

MQX 由核心组件(必选)和可选性组件构成。对于核心组件,只有那些 MQX 或应用程序调用的函数包含在映像中。为了满足要求,应用程序可通过加入可选组件来扩展和配置核心组件。图 -1 显示了以核心组件为中心,外围环绕可选性组件的示意图。表-1 总结了核心组件和可性选组件,它们都将在后面章节中给予描述。

clip_image001

<>任务同步和通信

组件

内容

类型

初始化

初始化和自动任务创建

核心

任务管理

动态任务管理

核心

调度

轮转和先进先出

核心

显式使用任务队列

可选

任务同步和通信

轻量级信号量

核心

信号量

可选

轻量级事件

可选

事件

可选

互斥

可选

消息

可选

任务队列

可选

处理器间通信

可选

2 初始化

初始化组件是核心组件。_mqx()运行的同时,应用程序开始启动,初始化硬件并启动 MQX。MQX 启动时,创建称为自启动任务的应用程序。

3 任务管理

任务管理是核心组件。与 MQX 启动时自动创建任务一样,应用程序运行时也能创建、管理和终止任务。它能为同一个任务创建多个实例,并且在一个应用程序中没有任务总个数的限制。应用程序可动态改变任

一任务的属性。当一个任务终止时,MQX 释放任务资源。此外,对于每个任务均可指定:退出函数:当任务终止时由 MQX 调用。异常处理:当处于活动状态的任务发生异常时由 MQX 调用。

6

定时

时间组件

可选(BSP)

轻量级定时器

可选

定时器

可选

看门狗

可选

存储管理

可变大小的存储块

核心

固定大小的存储块(区块)

可选

存储器管理单元(MMU),高速缓存和虚拟

存储

可选

轻量级存储

可选

中断处理

可选(BSP)

输入/输出驱动

输入/输出子系统

可选(BSP)

格式化输入/输出

可选(BSP)

检测工具

栈的运用

核心

内核日志

可选

日志

可选

轻量级日志

可选

错误处理

任务错误代码,异常处理,运行测试

核心

队列操纵

核心

命名组件

可选

嵌入式调试

EDS 服务器

可选

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 函数,中断服务程序可以用来给一个任务发送信号。

Baidu
map