Freescale MQX 实时操作系统用户手册
译自:
Freescale MQXTM Real-Time Operating System User’s Guide
Document Number:MQXUG Rev. 0(04/2009)
苏州大学 Freescale 嵌入式教学与应用培训中心译
2010 年 3 月
目 录
第一章 前言 .................................................................................................... 1
1.1 关于 MQX .............................................................................................. 1
1.2 关于本手册 ............................................................................................ 1
1.3 3.0 和 2.50 版本的新特点 ...................................................................... 2
1.4 约定 ........................................................................................................ 4
1.4.1 提示 ................................................................................................ 4
1.4.2 注释 ................................................................................................ 4
1.4.3 注意事项 ......................................................................................... 4
第二章 MQX 概述 .......................................................................................... 5
2.1 MQX 的组织结构 .................................................................................. 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.10 I/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.1.1 默认的 MQX 初始化结构 .................................................... 15
.2.2 任务模板列表 ................................................................................. 15
3.2.2.1 指定任务优先级 .................................................................... 16
3.2.2.2 指定任务属性 ........................................................................ 16
3.2.2.3 默认任务模板列表 ................................................................ 16
3.2.2.4 举例:一个任务模板列表 .................................................... 16
3.2.2.5 实例:创建一个自启动任务 ................................................ 17
3.3 使用 FREESCALE CODEWARRIOR DEVELOPMENT STUDIO ................... 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
II
3.4.6 终止任务 ....................................................................................... 22
3.4.7 实例:创建任务 ............................................................................ 23
3.4.7.1 实例代码 ................................................................................ 23
3.4.7.2 在 MQX 下编译和连接应用程序 ........................................ 25
3.5 调度任务 .............................................................................................. 25
3.5.1 FIFO 调度 ..................................................................................... 25
3.5.2 轮循调度 ....................................................................................... 26
3.5.2.1 抢占........................................................................................ 27
3.6 内存管理 .............................................................................................. 27
3.6.1 使用可变块管理内存 ................................................................... 27
3.6.2 利用可变大小块管理轻量级内存 ............................................... 29
3.6.3 使用固定大小块管理内存(区块) ........................................... 30
3.6.3.1 为动态区块生成区块组件 .................................................... 30
3.6.3.2 生成区块 ................................................................................ 30
3.6.3.3 分配和释放区块 .................................................................... 30
3.6.3.4 撤销动态区块 ........................................................................ 30
3.6.3.5 举例:两个区块 .................................................................... 30
3.6.4 操纵缓冲寄存器 ........................................................................... 32
3.6.4.1 清除数据缓存 ........................................................................ 32
3.6.4.2 使数据/指令缓存失效 ........................................................... 32
3.6.5 控制MMU(虚拟存储器) ........................................................ 33
3.6.5.1 举例:使用虚拟存储初始化 MMU ..................................... 34
3.6.5.2 举例:创建虚拟现场 ............................................................ 35
3.6.5.3 举例:使用虚拟现场创建任务 ............................................ 35
3.7 任务同步 .............................................................................................. 36
3.7.1 事件 .............................................................................................. 36
3.7.1.1 生成事件组件 ........................................................................ 38
3.7.1.2 创建事件组 ............................................................................ 38
3.7.1.3 打开与事件组的连接 ............................................................ 38
3.7.1.4 等待事件位 ............................................................................ 39
3.7.1.5 设置事件位 ............................................................................ 39
3.7.1.6 清除事件位 ............................................................................ 39
3.7.1.7 关闭与事件组的连接 ............................................................ 39
3.7.1.8 撤销事件组 ............................................................................ 39
3.7.1.9 举例:使用事件 .................................................................... 39
3.7.2 轻量级事件 ................................................................................... 42
III
3.7.2.1 生成轻量级事件组 ................................................................ 43
3.7.2.2 等待事件位 ............................................................................ 43
3.7.2.3 设置事件位 ............................................................................ 43
3.7.2.4 清除事件位 ............................................................................ 43
3.7.2.5 撤销轻量级事件组 ................................................................ 43
3.7.3 关于信号量类型的对象 ............................................................... 43
3.7.3.1 限制........................................................................................ 43
3.7.3.2 优先级倒置 ............................................................................ 44
3.7.3.3 举例:优先级倒置 ................................................................ 44
3.7.3.4 使用优先级继承防止优先级倒置 ........................................ 44
3.7.3.5 使用优先级保护防止优先级倒置 ........................................ 45
3.7.4 轻量级信号量 ............................................................................... 46
3.7.4.1 生成轻量级信号量 ................................................................ 46
3.7.4.2 等待并传递轻量级信号量 .................................................... 47
3.7.4.3 撤销一轻量级信号量 ............................................................ 47
3.7.4.4 举例:生产者与消费者 ........................................................ 47
3.7.5 信号量........................................................................................... 51
3.7.5.1 信号量使用纵览 .................................................................... 51
3.7.5.2 生成信号量组件 .................................................................... 52
3.7.5.3 生成信号量 ............................................................................ 52
3.7.5.4 打开与信号量的连接 ............................................................ 53
3.7.5.5 等待信号量与传递信号量 .................................................... 53
3.7.5.6 关闭与信号量的连接 ............................................................ 53
3.7.5.7 撤销信号量 ............................................................................ 53
3.7.5.8 举例:任务同步与互斥操作 ................................................ 53
3.7.6 互斥 .............................................................................................. 59
3.7.6.1 创建互斥组件 ........................................................................ 60
3.7.6.2 互斥属性 ................................................................................ 60
3.7.6.3 互斥等待协议 ........................................................................ 60
3.7.6.4 调度协议 ................................................................................ 61
3.7.6.5 创建与初始化互斥 ................................................................ 61
3.7.6.6 锁定互斥 ................................................................................ 62
3.7.6.7 解锁互斥 ................................................................................ 62
3.7.6.8 撤销互斥 ................................................................................ 62
3.7.6.9 举例:使用互斥 .................................................................... 62
3.7.7 消息 .............................................................................................. 64
IV
3.7.7.1 创建消息组件 ........................................................................ 66
3.7.7.2 使用消息池 ............................................................................ 66
3.7.7.3 分配与释放消息 .................................................................... 67
3.7.7.4 发送消息 ................................................................................ 67
3.7.7.5 消息队列 ................................................................................ 68
3.7.7.6 使用私有消息队列接收消息 ................................................ 68
3.7.7.7 使用系统消息队列接收消息 ................................................ 68
3.7.7.8 确定排队消息数 .................................................................... 69
3.7.7.9 警告函数 ................................................................................ 69
3.7.7.10 举例:客户/服务器模式 ..................................................... 69
3.7.8 任务队列 ....................................................................................... 73
3.7.8.1 创建和撤消任务队列 ............................................................ 73
3.7.8.2 挂起任务 ................................................................................ 73
3.7.8.3 重启任务 ................................................................................ 74
3.7.8.4 举例:任务同步 .................................................................... 74
3.8 处理器间的通信 .................................................................................. 76
3.8.1 发送消息到远程处理器 ............................................................... 76
3.8.1.1 举例:四核处理器的应用。 ................................................ 77
3.8.2 创建和结束远程处理器上的任务 ............................................... 77
3.8.3 访问远程处理器上的事件组 ....................................................... 77
3.8.4 创建和初始化IPC ....................................................................... 78
3.8.4.1 编译 IPC 路由表 ................................................................... 78
3.8.4.2 创建 IPC 协议初始化表 ....................................................... 79
3.8.4.3 IPC 使用 I/O PCB 设备驱动程序 ......................................... 79
3.8.4.4 启动 IPC 任务 ....................................................................... 80
3.8.4.5 举例:IPC 初始化信息 ........................................................ 80
3.8.5 消息头的端模式转换 ................................................................... 87
3.9 定时 ...................................................................................................... 87
3.9.1 MQX 定时翻转法 .......................................................................... 87
3.9.2 MQX 定时精度 .............................................................................. 87
3.9.3 定时器组件 ................................................................................... 87
3.9.3.1 秒/毫秒时间 .......................................................................... 89
3.9.3.2 滴答时间 ................................................................................ 89
3.9.3.3 消逝时间 ................................................................................ 90
3.9.3.4 时间分辨率 ............................................................................ 90
3.9.3.5 绝对时间 ................................................................................ 90
V
3.9.3.6 日期中的时间格式 ................................................................ 90
3.9.3.7 超时........................................................................................ 91
3.9.4 定时器........................................................................................... 92
3.9.4.1 创建定时器组件 .................................................................... 92
3.9.4.2 开启定时器 ............................................................................ 93
3.9.4.3 取消重要定时器请求 ............................................................ 93
3.9.4.4 举例:定时器的使用 ............................................................ 93
3.9.5 轻量级定时器 ............................................................................. 96
3.9.5.1 启动轻量级定时器 .............................................................. 96
3.9.5.2 取消重要定时器请求 .......................................................... 96
3.9.6 看门狗......................................................................................... 96
3.9.6.1 创建看门狗组件 .................................................................. 97
3.9.6.2 启动或复位看门狗 .............................................................. 97
3.9.6.3 终止看门狗 .......................................................................... 97
3.9.6.4 举例:看门狗的使用 .......................................................... 97
3.10 中断和异常处理 ............................................................................ 100
3.10.1 中断处理初始化 ..................................................................... 101
3.10.2 装载应用程序定义的ISR ...................................................... 102
3.10.3 针对ISR 的限制 ..................................................................... 102
3.10.3.1 ISR 不能调用的函数 ...................................................... 102
3.10.3.2 ISR 不应该调用的函数................................................... 103
3.10.4 修改默认ISR .......................................................................... 104
3.10.5 异常处理 ................................................................................. 104
3.10.6 ISR 异常处理 .......................................................................... 105
3.10.7 任务异常处理 ......................................................................... 105
3.10.8 举例:装载ISR ...................................................................... 105
3.10.8.1 利用 MQX 编译和连接应用程序 .................................. 107
3.11 工具 ................................................................................................ 108
3.11.1 日志 ......................................................................................... 108
3.11.1.1 创建日志组件 .................................................................. 109
3.11.1.2 创建日志 .......................................................................... 109
3.11.1.3 格式化日志条目 .............................................................. 109
3.11.1.4 写日志 .............................................................................. 109
3.11.1.5 读日志 .............................................................................. 109
3.11.1.6 禁用和启用记录日志 ...................................................... 109
3.11.1.7 重置日志 .......................................................................... 110
VI
3.11.1.8 举例:使用日志 .............................................................. 110
3.11.2 轻量级日志 ............................................................................. 112
3.11.2.1 创建轻量级日志组件 ...................................................... 113
3.11.2.2 创建轻量级日志 .............................................................. 113
3.11.2.3 格式化轻量级日志条目 .................................................. 113
3.11.2.4 写轻量级日志 .................................................................. 113
3.11.2.5 读小型日志 ...................................................................... 113
3.11.2.6 禁用和启用轻量级日志 .................................................. 114
3.11.2.7 重置轻量级日志 .............................................................. 114
3.11.2.8 举例:使用轻量级日志 .................................................. 114
3.11.3 内核日志 ................................................................................... 115
3.11.3.1 使用内核日志 .................................................................... 116
3.11.3.2 禁用内核日志 .................................................................... 117
3.11.3.3 举例:内核日志的应用 ..................................................... 117
3.11.4 堆栈使用工具 ............................................................................ 119
3.12 工具 .................................................................................................. 119
3.12.1 队列 ........................................................................................... 119
3.12.1.1 队列的数据结构 ................................................................ 120
3.12.1.2 创建队列 ............................................................................ 120
3.12.1.3 向一个队列增加元素 ........................................................ 120
3.12.1.4 从队列中移除元素 ............................................................ 120
3.12.2 命名组件 ................................................................................... 120
3.12.2.1 创建命名组件 ..................................................................... 121
3.12.3 运行时测试 ............................................................................... 121
3.12.3.1 举例:运行时测试 ............................................................ 122
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.3 FREESCALEMQX 的目录结构 ............................................................ 134
4.3.1 MQX RTOS 目录结构 ................................................................. 134
VII