Freescale+MQX实时操作系统用户手册(中文)

更新时间:2023-04-14 17:35:02 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

Freescale MQX实时操作系统用户手册

译自:

Freescale MQX TM Real-Time Operating System User’s Guide Document Number:MQXUG Rev. 0(04/2009)

苏州大学飞思卡尔嵌入式系统教学与应用培训中心译

2010年3月

目录

第一章前言 (1)

1.1关于MQX (1)

1.2关于本手册 (1)

1.33.0和2.50版本的新特点 (2)

1.4约定 (4)

1.4.1 提示 (4)

1.4.2 注释 (4)

1.4.3 注意事项 (4)

第二章MQX概述 (5)

2.1MQX的组织结构 (5)

2.2初始化 (6)

2.3任务管理 (6)

2.4调度 (7)

2.5存储管理 (7)

2.5.1 可变大小存储块管理 (7)

2.5.2 固定大小存储块管理(区块) (7)

2.5.3 高速缓存控制 (8)

2.5.4 存储器管理单元(MMU)控制 (8)

2.5.5 轻量级存储管理 (8)

2.6任务同步 (8)

2.6.1 轻量级事件 (8)

2.6.2 事件 (8)

2.6.3 轻量级信号量 (8)

2.6.4 信号量 (9)

2.6.5 互斥 (9)

2.6.6 消息 (9)

2.6.7 任务队列 (9)

2.7处理器间通信 (9)

2.8定时 (10)

2.8.1 时间组件 (10)

2.8.2 轻量级定时器 (10)

2.8.3 定时器 (10)

I

2.8.4 看门狗 (10)

2.9中断和异常处理 (10)

2.10I/O驱动 (11)

2.10.1 格式化I/O (11)

2.10.2 I/O子系统 (11)

2.11检测工具 (11)

2.11.1 日志 (11)

2.11.2 轻量级日志 (11)

2.11.3 内核日志 (12)

2.11.4 栈的运用 (12)

2.12出错处理 (12)

2.12.1 任务出错代码 (12)

2.12.2 异常处理 (12)

2.12.3 实时测试 (12)

2.13队列操纵 (13)

2.14命名组件 (13)

2.15嵌入式调试 (13)

第三章使用MQX (14)

3.1前言 (14)

3.2初始化并开始运行MQX (14)

3.2.1 MQX初始化结构 (14)

3.2.2 任务模板列表 (15)

3.3使用F REESCALE C ODE W ARRIOR D EVELOPMENT S TUDIO (18)

3.4管理任务 (20)

3.4.1 创建任务 (21)

3.4.2 获取任务IDs (21)

3.4.3 获取和设置一个任务环境 (21)

3.4.4 管理任务错误 (22)

3.4.5 重启任务 (22)

3.4.6 终止任务 (22)

3.4.7 实例:创建任务 (23)

3.5调度任务 (25)

3.5.1 FIFO调度 (25)

3.5.2 轮循调度 (26)

3.6内存管理 (27)

II

3.6.1 使用可变块管理内存 (27)

3.6.2 利用可变大小块管理轻量级内存 (29)

3.6.3 使用固定大小块管理内存(区块) (30)

3.6.4 操纵缓冲寄存器 (32)

3.6.5 控制MMU(虚拟存储器) (33)

3.7任务同步 (36)

3.7.1 事件 (36)

3.7.2 轻量级事件 (42)

3.7.3 关于信号量类型的对象 (43)

3.7.4 轻量级信号量 (46)

3.7.5 信号量 (51)

3.7.6 互斥 (59)

3.7.7 消息 (64)

3.7.8 任务队列 (73)

3.8处理器间的通信 (76)

3.8.1 发送消息到远程处理器 (76)

3.8.2 创建和结束远程处理器上的任务 (77)

3.8.3 访问远程处理器上的事件组 (77)

3.8.4 创建和初始化IPC (78)

3.8.5 消息头的端模式转换 (87)

3.9定时 (87)

3.9.1 MQX定时翻转法 (87)

3.9.2 MQX定时精度 (87)

3.9.3 定时器组件 (87)

3.9.4 定时器 (92)

3.9.5 轻量级定时器 (96)

3.9.6 看门狗 (96)

3.10中断和异常处理 (100)

3.10.1 中断处理初始化 (101)

3.10.2 装载应用程序定义的ISR (102)

3.10.3 针对ISR的限制 (102)

3.10.4 修改默认ISR (104)

3.10.5 异常处理 (104)

3.10.6 ISR异常处理 (105)

3.10.7 任务异常处理 (105)

3.10.8 举例:装载ISR (105)

III

3.11工具 (108)

3.11.1 日志 (108)

3.11.2 轻量级日志 (112)

3.11.3 内核日志 (115)

3.11.4堆栈使用工具 (119)

3.12工具 (119)

3.12.1队列 (119)

3.12.2 命名组件 (120)

3.12.3 运行时测试 (121)

3.12.4 其它工具 (126)

3.13嵌入式调试 (127)

3.14实时编译配置MQX (127)

3.14.1 MQX编译时配置选项 (128)

3.14.2 推荐设置 (131)

第四章重建MQX (133)

4.1为什么要重建MQX? (133)

4.2开始之前 (133)

4.3F REESCALE MQX的目录结构 (134)

4.3.1 MQX RTOS目录结构 (134)

4.3.2 PSP子目录 (135)

4.3.3 BSP子目录 (135)

4.3.4 I/O子目录 (136)

4.3.5 其它源子目录 (136)

4.4F REESCALE MQX构建工程 (136)

4.4.1 PSP构建工程 (136)

4.4.2 BSP构建工程 (136)

4.4.3 构建后处理 (137)

4.4.4 构建方式 (137)

4.5重建F REESCALE MQX RTOS (137)

4.6创建常用MQX配置并构建工程 (137)

4.6.1 为什么创建一个新的配置? (137)

4.6.2 克隆现有配置 (138)

第五章开发一个新的BSP (140)

5.1什么是BSP? (140)

IV

5.2开发一个新的BSP (140)

5.3选择一个基准BSP并入门 (140)

5.4和目标板通信 (141)

5.5修改BSP特定的包含文件 (141)

5.5.1 bsp_prv.h (141)

5.5.2 bsp.h (141)

5.5.3 target.h (141)

5.6修改启动代码 (142)

5.6.1 comp.c (142)

5.6.2 5987ecc652ea551811a68767p (142)

5.7修改源代码 (142)

5.7.1 init_bsp.c (143)

5.7.2 get_usec.c (143)

5.7.3 get_nsec.c (143)

5.7.4 mqx_init.c (144)

5.8为I/O驱动程序创建默认的初始化文件 (144)

5.8.1 initdev.c (144)

5.9支持编译器的文件 (144)

5.10构建新的BSP (144)

第六章FAQS (146)

6.1概述 (146)

6.2事件 (146)

6.3全局构造 (146)

6.4空闲任务 (146)

6.5中断 (147)

6.6内存 (147)

6.7信息传递 (148)

6.8互斥 (148)

6.9信号量 (149)

6.10任务退出处理与任务异常处理 (149)

6.11任务队列 (149)

6.12任务 (149)

6.13时间片 (150)

6.14定时器 (150)

V

第一章前言

1.1 关于MQX

MQX实时操作系统设计用于单一处理器、多处理器和分布式处理器等形式的嵌入式实时系统。

Freescale半导体公司成功地搭载MQX操作系统软件平台用于ColdFire 和PowerPC系列微处理器。相比于最初的MQX发布方式,当下的Freescale MQX发布方式更易于配置和使用。现在一个单一的发布版本就包含了MQX 操作系统外加其它所有软件组件来支持特定的微处理器。有关Freescale MQX 的发布版本的详细说明如下。

MQX是一个运行时函数库,程序用它来实现实时多任务应用。其主要特征为:大小可裁剪、面向组件的架构和便于使用。

MQX支持多处理器应用,并且可用于灵活配置嵌入式输入/输出产品,如网络、数据通讯和文档管理等。

本手册通篇都使用MQX作为MQX操作系统的缩写。

1.2 关于本手册

使用本手册时需要参照:

MQX参考手册——包含MQX简单和复杂的数据类型,按字母顺序排列的MQX函数原型。

1

1.3 3.0和

2.50版本的新特点

作为Freescale发布MQX RTOS的新版本,MQX3.0相比于2.50版本具有如下改进:

●其它的关键性MQX组件,如与Freescale MQX RTOS一起发布的

MFS、RTCS或USB等。

●在编写本文档时,Freescale MQX RTOS与其它MQX组件的默认开

发环境是CodeWarrior Development Studio。新版本还将支持其它开

发环境。

●现在所有关键Freescale MQX RTOS组件(PSP、BSP、RTCS、MFS、

USB、...)的实时编译配置都由编辑user_config.h文件完成,存放于

顶层配置文件夹(config)下的板级相关路径。而在以前的版本中,

用户配置的宏通过命令行下的makefile或者CodeWarrior下的预处理

文件传入整个编译过程。

●PSP组件针对特定的板子配置和编译。原来,PSP组件对于某个特定

设备编译一次。尽管PSP代码仍然保持独立于特定的板子,但这一

特性能够对一个特定的板子进行更好的内核裁剪。

●MQX现在支持类型存储(typed memory),即允许一些附加信息能在

任务调试插件(task-aware debugger plugin)中显示出来。

MQX2.50向后兼容2.40版本,并且具有如下改进:

●减少了对32位类型的依赖——类型由处理器本身的数据宽度决定。

例如一个16位的处理器,其一般数据类型大小是16位。对于小规

模架构的处理器降低了其对于代码和数据宽度的需求。

●时间由一个时钟滴答(tick)来度量——为允许更高分辨率的延迟、

定时和时间测量,MQX用时钟滴答取代秒和毫秒来衡量时间。延迟

一段特定的时间或者直到一个特定的时间为止成为可能。这一改进

适用于所有使用超时功能的组件。这一内在的改变对于用户来讲是

透明的。另外,MQX加入了一个扩展的日期结构来表示超过24世

纪的年历日期,精度可以达到皮秒。

2

●存储管理单元(MMU)的支持包含在PSP中——MMU支持任务间

的存储保护。每个任务能建立它自己的被保护数据区域。

●多个内存池——应用程序可以从一个应用自身定义的全局存储区分

配内存块,正如之前应用从默认的内存池分配内存块一样。内存池和MQX版本2.40的区块(partition)类似,但允许用户分配可变大小的存储块。

●轻量级的存储模块——与存储组件类似,但作为轻量级的组件,MQX

在分配存储块时做较少的检查,且代码和数据量较小。在分配和释放存储空间时,轻量级存储组件更快,但是在一个任务结束时回收存储区域速度较慢。

●能创建处于阻塞状态的任务——应用程序能创建处于阻塞态的任

务。MQX像MQX2.40版本一样创建任务,但是不将其加入就绪队列。

●轻量级事件组——与事件组类似,除了它们更为简单。

●自动清除事件位——如果一个应用程序用自动清除属性创建了一个

事件组,MQX在事件位被设置后自动地清除该事件位。这一特性使得等待事件位的任务变为就绪态,但是该任务不需要清除事件位。

●轻量级信号量可以通过定时和查询方式等待。

●任务可以重新启动——应用程序可以从任务的开始函数重新启动任

务,且保持同样的任务描述符,任务ID号和任务栈。

●增强的区块组件——区块组件是一个完全注册的MQX组件。应用程

序可以以处理其它MQX组件相同的方式创建和注销这些区块。

●EDS服务器(用于嵌入式调试)非常强大且包含于MQX——而且,IPC

支持EDS服务器,因此可以跨越一个多处理器MQX网络来进行调试。

●多处理器事件——应用程序能够通过多处理器MQX网路中的另一

个处理器设置事件位。

●32位队列ID——应用程序除了用16位表示队列ID外还可以用32

位表示它们。因此,应用程序能使用大于255的数值来表示队列号和处理器号。你可以在编译PSP时使能这个选项。

●更快和更紧凑的MQX——应用程序可以使用额外的编译时间配置选

项来建立一个更小的MQX且使用新类型的组件(轻量级组件)来处理存储应用和高速应用。轻量级组件通常使用内存映射的数据结构(没有多处理器功能)。它们比常规的组件速度更快;但是,它们只有较少的特性和保护机制。轻量级组件包括:

?轻量级事件(新)——使用内存映射的数据结构定义事件组。

3

?轻量级日志(新)——由固定大小的条目组成。内核日志目前

为一个轻量级日志。

?轻量级存储组件(新)——使用较少的开销来维持大小可变的

存储块堆。MQX能配置成将轻量级存储组件作为其默认存储组

件。

?轻量级信号量(lightweight semaphores)——使用内存映射的数

据结构来定义信号量。

?轻量级定时器(新)——使用内存映射的数据结构来提供可重

复的时间驱动服务。

1.4 约定

1.4.1 提示

提示指出有用的信息。

提示:从中断服务程序(ISR)中分配消息的最有效方法就是使用_msg_alloc()

1.4.2 注释

注释标明重要信息。

注释:非严谨的信号量不支持优先级继承。

1.4.3 注意事项

注意事项告诉你一些可能有不可预期的副作用的命令或过程,这些命令或过程可能对你的文件或者硬件有威胁。

注意:如果你更改了MQX的数据类型,一些来自MQX Embedded的MQX?的PC端工具可能不能正常工作。

4

第二章MQX概述

2.1 MQX的组织结构

MQX由核心组件(必选)和可选性组件构成。对于核心组件,只有那些MQX或应用程序调用的函数包含在映像中。为了满足要求,应用程序可通过加入可选组件来扩展和配置核心组件。

图2-1显示了以核心组件为中心,外围环绕可选性组件的示意图。

图2-1

表2-1总结了核心组件和可性选组件,它们都将在后面章节中给予描述。

表2-1 核心组件和可选性组件

5

2.2 初始化

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

2.3 任务管理

任务管理是核心组件。

6

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

此外,对于每个任务均可指定:

●退出函数:当任务终止时由MQX调用。

●异常处理:当处于活动状态的任务发生异常时由MQX调用。

2.4 调度

调度遵从POSIX.4标准(实时扩展)并且支持如下策略:

●FIFO(基于优先级的抢占机制)调度是核心组件——等待时间最长

的任务是优先级最高的活动任务。

●轮转(又称时间片)调度也是核心组件——等待时间最长且未消耗

自身时间片的任务是优先级最高的活动任务。

●显式调度(使用任务队列)是一种可选性组件——你可以使用任务

队列明确地调度任务或创建相对复杂的同步机制。因为任务队列提

供尽可能少的功能,因此效率很高。应用程序在创建任务队列时可

指定使用FIFO或轮转调度策略。

2.5 存储管理

2.5.1 可变大小存储块管理

为了分配和释放可变大小的存储片(称为内存块),MQX提供了一些核心服务,它们类似于大部分C运行函数库提供的malloc()和free()函数。你可从默认内存池的内部区或外部区分配存储块给一个任务或系统。分配给一个任务的存储块是该任务的一种资源,当任务终止时,MQX释放存储块。

2.5.2 固定大小存储块管理(区块)

区块组件是可选性组件。你可以分配和管理固定大小的存储片(称作区块)。区块组件支持快速、固定大小的存储分配,减少了存储碎片,节约了存储资源。区块可位于默认内存池的内部(动态区块)和外部(静态区块)。你可将区块分配给一个任务或系统。分配给一个任务的区块是该任务的一种资源,当任务终止时,MQX释放区块。

7

2.5.3 高速缓存控制

MQX功能函数让你能够控制某些CPU具有的指令缓存和数据缓存。

2.5.4 存储器管理单元(MMU)控制

对于一些CPU而言,在使能高速缓存之前,你必须先初始化存储管理单元(MMU)。MQX功能函数能够让你初始化、使能和禁止一个MMU,以及为MMU添加一个存储区域。你可以通过MMU页表来控制MMU。

2.5.5 轻量级存储管理

当一个应用程序受到代码和数据量大小的限制时,可使用轻量级存储管理。轻量级存储管理只有少量的接口函数,代码和数据量也较小。因此,某些部分健壮性降低(移除了头部效验),速度变慢(任务销毁次数增多)。

如果你更改了实时编译配置选项,那么在分配存储空间时,MQX将使用轻量级存储组件。更多内容,参见3.14节“实时编译配置MQX”。

2.6 任务同步

2.6.1 轻量级事件

轻量级事件(LWEvent)是可选性组件。对于使用位状态改变来实现同步的任务而言,这是一个低开销方式。轻量级事件需要的存储空间很少,且速度快。

2.6.2 事件

事件组件是可选性组件,支持格式化为位字段对象的动态管理。任务和中断服务例程可使用事件来实现同步,以位状态改变的形式传送简单信息。有些是命名的快速事件组。事件组具有自动清除事件位,因此,MQX在事件位被设置后立即清除该事件位。应用程序能够设置位于远程处理器上的事件组内的事件位。

2.6.3 轻量级信号量

轻量级信号量(LWSems)组件是核心组件。对于实现共享资源同步存取

8

的任务而言,这是一个低开销方式。轻量级信号量组件需要的存储空间很少,运行速度快,在计算FIFO信号量时没有优先级继承。

2.6.4 信号量

信号量组件是可选性组件。信号量组件用以计算信号。你可以使用信号量同步任务,控制对共享资源的访问权限,或实现生产/消费信号机制。信号量组件提供FIFO队列、优先级队列和优先级继承,可以是严谨的,也可以是非严谨的。有些是命名的快速信号量。

2.6.5 互斥

互斥组件是可选性组件。遵从POSIX.4a标准(线程扩展)。在访问共享资源时,互斥组件实现任务间的相互排斥。互斥提供轮询、FIFO队列、优先级队列、自旋和限制自旋队列、优先级继承以及优先级保护。互斥是严谨的,也就是说,一个任务不能解锁互斥,除非它先锁定了互斥。

2.6.6 消息

消息组件是可选性组件。任务间通过向其它任务打开的消息队列发送消息进行通信。每个任务打开自己的输入消息队列。消息队列由队列ID唯一识别,它是在队列创建时由MQX分配的。只有打开了消息队列的任务才可以从队列接收消息。任何任务可以发送消息到先前打开的消息队列中,只要它知道打开的队列的ID。

任务从消息池分配消息。消息池有两种:系统消息池和私有消息池。任何任务可以从系统消息池中分配消息(系统消息)。具有消息池ID的任务可以从私有消息池中分配消息(私有消息)。

2.6.7 任务队列

除了提供调度机制外,任务队列还提供简单有效的方法实现任务同步。你可以将任务队列中的任务挂起或移除。

2.7 处理器间通信

处理器间通信(IPC)组件是可选性组件。

一个应用程序能够在多个处理器上同时运行,因为每个处理器有一个MQX可执行映像。可执行映像通过消息进行通信和协作,这些信息通过内存

9

或处理器间的通信链传输。每个映像中的应用程序任务不必相同,事实上,它们通常是不一样的。

2.8 定时

2.8.1 时间组件

时间组件是可选性组件,你可以在BSP级允许或禁止它。时间有两种:消逝时间和绝对时间。你可以改变绝对时间。时间决议依赖于在MQX启动时为目标硬件设置的应用程序定义决议。

2.8.2 轻量级定时器

轻量级定时器组件是可选性组件,为周期性调用应用函数提供低开销机制。轻量级定时器通过建立周期队列安装,在开始阶段加入一个定时器,在某偏移量处到期。

当你向队列加入一个轻量级定时器时,你可以指定一个通知函数,它将在定时器到期时由MQX滴答中断服务程序调用。因为定时器从中断服务程序运行,所以并不是所有的MQX函数能够调用。

2.8.3 定时器

定时器组件是可选性组件。它提供应用函数的周期执行。MQX支持一次性定时器(到期一次)和周期性定时器(在给定间隔重复到期)。你可以设置定时器在某指定时间或时间段后启动。

设置了定时器后,你可以指定一个通知函数,当定时器到期时由定时器任务调用它。通知函数可以用来同步任务,通过发送消息,设置事件,或者使用其它MQX同步机制实现。

2.8.4 看门狗

看门狗组件是可选性组件,它帮助用户检测任务级别的崩溃和死锁情况。

2.9 中断和异常处理

在PSP级,中断和异常处理是可选组件。MQX为BSP定义范围内的所有硬件中断服务,并为活动任务保存最小的关联文档。如果CPU支持嵌套中

10

断,那么MQX也完全支持。一旦进入中断服务程序(ISR)内,应用程序可以重新定义中断级别。为了进一步缩短中断延迟,MQX推迟任务调度,直到所有中断服务程序都运行之后。除此之外,只有当中断服务程序准备好一个新任务时,MQX才重新调度。为了减小堆栈规模,MQX支持独立的中断堆栈。

中断服务程序(ISR)不是任务;它是一个规模小、速度快、能对硬件中断迅速反应的例程。中断服务程序通常用C语言编写,它的任务包括重置设备,获取设备数据,以及向相关任务发送信号。通过非阻塞MQX函数,中断服务程序可以用来给一个任务发送信号。

2.10 I/O驱动

在BSP级,I/O驱动是可选性构件,由格式化I/O和I/O子系统组成。本手册内容不涉及I/O驱动。

2.10.1 格式化I/O

MQX提供格式化I/O函数库,它是I/O子系统的应用程序接口(API)。

2.10.2 I/O子系统

你可以动态安装I/O设备驱动程序。此后,任何任务都可以打开它们。

2.11 检测工具

2.11.1 日志

日志组件是可选性组件,让你保存和恢复应用程序专属信息。每个日志条目有一个时间戳和序列号。你可以使用这些信息进行测试、调试、校验和分析运行情况。

2.11.2 轻量级日志

轻量级日志类似于一般日志,但它仅使用固定大小的条目。轻量级日志比普通的应用程序日志速度快,通常用作内核日志。

11

2.11.3 内核日志

内核日志是可选性组件,让你记录MQX活动状态。你可以在指定的位置或者MQX选择的位置创建内核日志。你也可以配置内核日志,以便记录所有MQX函数调用、场景切换以及中断服务情况。内核日志用在性能评估工具软件中。

2.11.4 栈的运用

MQX提供了一些核心函数,让你动态检查中断栈和任务栈,以便你判断是否分配了足够的栈空间。

2.12 出错处理

2.12.1 任务出错代码

每个任务有一个任务出错代码,它和任务的场景相关。特定MQX功能函数能够读取和更新任务出错代码。

2.12.2 异常处理

你可以为所有未处理的中断指定一个默认的中断服务例程(ISR)。对于中断服务程序产生的异常,你也可以指定一个特定的中断服务例程。

2.12.3 实时测试

MQX提供了一些核心实时测试函数,在正常运行状态,应用程序能够调用它们。以下组件具有测试函数:

●事件和轻量级事件

●核日志和轻量级日志

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

●可变大小的存储块和轻量级存储块

●消息池和消息队列

●互斥

●命名组件

●队列(应用程序定义的)

●信号量和轻量级信号量

12

●任务队列

●定时器和轻量级定时器

●看门狗

2.13 队列操纵

有一种核心组件,实现队列元素的双向链表结构。你可以初始化队列、加入、移除和读取队列元素。

2.14 命名组件

命名组件是可选性组件。它提供一个名称库,与动态定义的标量(如队列ID)一一对应。

2.15 嵌入式调试

EDS服务器是可选性组件。它与运行在EDS客户端的主机通信,读写MQX信息,从主机获取各种配置信息。

13

第三章使用MQX

3.1 前言

3.2 初始化并开始运行MQX

MQX开始于_mqx()函数,该函数以MQX初始化结构为参数。基于这一结构中的参数,MQX完成如下任务:

●载入并初始化MQX经常使用的数据,包括默认内存池,就绪队列,中断

堆栈和任务栈;

●初始化硬件(如芯片选择);

●开启定时器;

●设置默认的时间片值;

●生成空闲任务,当没有其它任务就绪时将被激活;

●生成由任务模板队列定义为自启动的任务;

●开始调度多任务。

3.2.1 MQX初始化结构

MQX初始化结构定义应用程序和目标硬件的参数如下:

typedef struct mqx_initialization_struct

{

_mqx_uint PROCESSOR_NUMBER;

pointer START_OF_KERNEL_MEMORY;

pointer END_OF_KERNEL_MEMORY;

_mqx_uint INTERRUPT_STACK_SIZE;

TASK_TEMPLATE_STRUCT_PTR TASK_TEMPLATE_LIST;

_mqx_uint MQX_HARDWARE_INTERRUPT_LEVEL_MAX;

14

_mqx_uint MAX_MSGPOOLS;

_mqx_uint MAX_MSGQS;

char _PTR_ IO_CHANNEL;

char _PTR_ IO_OPEN_MODE;

_mqx_uint RESERVED[2];

} MQX_INITIALIZATION_STRUCT, _PTR_

MQX_INITIALIZATION_STRUCT_PTR;

如需查看每个域的描述,参见MQX附录。

3.2.1.1 默认的MQX初始化结构

你可以为MQX初始化结构定义自己的初始值,或者使用由每个BSP提供的默认值。该默认值被称为MQX_init_struct而且保存在相应的BSP目录下mqx_init.c文件中。该文件已经被编译并连接到MQX。

注意:对于任务相关的调试工具来说,MQX初始化结构必须命名为MQX_init_struct。

本章中的例子将使用如下MQX_init_struct:

MQX_INITIALIZATION_STRUCT MQX_init_struct =

{

/* PROCESSOR_NUMBER */ BSP_DEFAULT_PROCESSOR_NUMBER,

/* START_OF_KERNEL_MEMORY */

BSP_DEFAULT_START_OF_KERNEL_MEMORY,

/* END_OF_KERNEL_MEMORY */ BSP_DEFAULT_END_OF_KERNEL_MEMORY, /* INTERRUPT_STACK_SIZE */ BSP_DEFAULT_INTERRUPT_STACK_SIZE,

/* TASK_TEMPLATE_LIST */ (pointer)MQX_template_list,

/* MQX_HARDWARE_INTERRUPT_LEVEL_MAX*/

BSP_DEFAULT_MQX_HARDWARE_INTERRUPT_LEVEL_MAX,

/* MAX_MSGPOOLS */ BSP_DEFAULT_MAX_MSGPOOLS,

/* MAX_MSGQS */ BSP_DEFAULT_MAX_MSGQS,

/* IO_CHANNEL */ BSP_DEFAULT_IO_CHANNEL,

/* IO_OPEN_MODE */ BSP_DEFAULT_IO_OPEN_MODE

};

注:初始化RESERVED域的元素值为0

3.2.2 任务模板列表

任务模板列表(TASK_TEMPLATE_STRUCT)定义了一组初始化模板,基于此,可以在处理器上生成任务。

15

本文来源:https://www.bwwdw.com/article/yacq.html

Top