1. 概述
MQX BSP即板级支持包,是指针对某一特定的板子的系统软件包,包括 MQX操作系
统内核,MFS 文件系统(如果需要支持文件系统功能的话),RTCS 协议栈(如果需要)、
USB协议栈(如果需要)以及板子上所有硬件的驱动程序。
Freescale公司针对主要的 coldfire处理器,开发了比较完整的驱动程序,基本上包含了
所有 coldfire 芯片集成的片上模块。因此,在大多数情况下,我们都无需开发驱动程序。
Freescale提供了多个其官方评估板的BSP。本文档描述如何在自己开发的板子上移植MQX
BSP,以 Nicrosystem开发的NSCF51ACR1开发板为例,给出了详细的移植过程。
注意:
本文档只针对freescale公司的 coldfire处理器,并不适用将MQX 移植到别的架构。
本文档只描述板级支持包的移植,不包含芯片级的移植,即假定板子上采用的
coldfire处理器MQX 已经支持了。
MQX 操作系统不能商用在其他公司的处理器上,如果需要这样做,则需要联系飞
思卡尔等公司了解授权事宜。
2. MQX 源代码结构
从飞思卡尔网站免费下载的 MQX 系统,安装后,在安装目录下(下面以%installdir 表
示)会创建如下子目录:
Config:该目录下包含配置文件。
Demo:几个综合性的 demo工程 Nicrosystem
Doc:MQX 的英文文档,包括用户手册,MFS参考手册等
Lib:包含每个板子 BSP的最终输出结果:库文件,头文件等
Mfs:MFS文件系统源码和examples
Mqx:MQX 操作系统代码,BSP相关代码,驱动代码
Rtcs:TCP/IP协议栈代码和 examples
Shell:shell代码
Tools:一些辅助的工具
Usb:USB 协议栈代码,包括 device 协议栈和 host 协议栈两部分,每部分又有几个
examples
移植 MQX BSP 首先相关的是 config目录和 mqx 目录。下面再详细说明下这两个目录
的结构。
Config目录的基本结果如下图:
该目录众多子目录分成两大类:
Common:该子目录包括的是所有板子 bsp共用的配置文件。
maximum_config.h:MQX 全功能配置,基本上把 MQX 的所有功能都打开了,很
自然生成的 image也最大,最系统硬件资源的需求也最大
small_ram_config.h:针对比较小 SRAM 的微控制器的典型配置,大多数情况下采
用该配置即可
smallest_config.h:最小配置,只打开 MQX 最基本的功能,针对资源极端受限的应
用
verif_enabled_config.h:一些辅助的配置。主要是针对 MQX 内部错误检查的使能
配置。
所有其它子目录:每个子目录都对应一个板子(或者说对应一个 bsp)。里面包含针对
每个 bsp的个性化配置
对于我们移植mqx到新的板子,common目录的内容通常不需要做任何改动,但需要在
config目录下创建一个新的子目录,以你的板子的名称命名,包含针对你的板子的个性化配
置。
MQX 目录的结构如下:
Build:该子目录包含不同编译器(codewarrior,IAR 等)的子目录,每个子目录下
则是各个板子bsp和psp的工程文件。此外,还包括一个 bat 子目录,里面是各个
板子bsp,psp的链接后批处理脚本。
Examples:样例程序,演示 mqx 主要功能,比如消息邮箱,中断服务等,可以用
该目录下的程序测试验证移植的 mqx bsp是否功能正确
Source:包含 mqx 内核的所有代码,所有驱动程序代码,以及bsp相关代码。
Mqx目录是移植的重点,需要在 build目录为自己的板子分别创建bsp和 psp的工程文Nicrosystem
5
件;在 source\bsp 目录下创建一个新子目录,以自己的板子名称命名。如果你的板子有
freescale未提供驱动的硬件,那么你还需要在 source\io目录下为它编写驱动。
3. MQX BSP移植指南
移植的基本步骤如下:
选择一个基线bsp作为起点
复制选择的 bsp和psp工程文件,配置文件,源码
修改相关的配置文件,工程文件和源程序
创建默认的 I/O设备初始化文件
Build
下面以 nicrosystem的 NSCF51ACR1 开发板为例子,描述每个步骤。
3.1 选择基线 bsp
通常我们不需要从零开始创建一个新的bsp,我们可以选择 freescale 提供的某个 bsp作
为起点,加速开发。NSCF51ACR1 开发板采用飞思卡尔coldfire V1 系列的 MCF51AC128微
控制器为主芯片。因此我们选择飞思卡尔提供的m51acdemo bsp为基线,因为这个demo板
采用的是 MCF51AC256芯片,与NSCF51ACR1 的MCF51AC128是同一系列,非常接近。
3.2复制选择的 bsp和 psp工程文件,配置文件,源码
在 %installdir\mqx\build\cwmcu63 目 录 下 , 复 制 bsp_m51acdemo.mcp 和
psp_m51acdemo.mcp,分别命名为 bsp_nscf51acr1.mcp和 psp_nscf51acr1.mcp
在%installdir\mqx\build\bat 目录下,复制bsp_m51acdemo.bat 和 psp_m51acdemo.bat,分
别命名为bsp_nscf51acr1.bat和 psp_nscf51acr1.bat
在%installdir\mqx\source\bsp 目录下,创建一个新的目录,命名为 nscf51acr1,拷贝
%installdir\mqx\source\bsp\m51acdemo目录下所有文件到新目录nscf51acr1。
在 %installdir\lib 目 录 下 创 建 新 目 录 , 命 名 为 nscf51acr1.cw , 并 在
%installdir\lib\nscf51acr1.cw目录下创建子目录 mqx
3.3 修改
修改 bsp_nscf51acr1.bat 和 psp_nscf51acr1.bat文件,将其中所有的m51acdemo字符串替
换为nscf51acr1
将新创建的$installdir\mqx\source\bsp\nscf51acr1\目录下的 m51acdemo.h 文件改名为
nscf51acr1.h,打开这个文件,将里面所有的 m51acdemo字符串替换为 nscf51acr1
将新创建的$installdir\mqx\source\bsp\nscf51acr1\cw\dbg 目录下的 m51acdemo.cfg 和
m51acdemo.mem文件改名为 nscf51acr1.cfg和 nscf51acr1.mem
修改nscf51acr1.mem文件,将里面的:
range 0x00000410 0x0003FFFF 4 ReadWrite // Second Section of the
256KBytes of Flash Memory
reserved 0x00040000 0x007FFFFF
改为:
range 0x00000410 0x0001FFFF 4 ReadWrite // Second Section of the
128KBytes of Flash Memory
reserved 0x00020000 0x007FFFFF
修改$installdir\mqx\source\bsp\nscf51acr1\cw\intflash.lcf文件,将其中的:
rom (RX): ORIGIN = 0x00000440, LENGTH = 0x0003FBBF # Code + Const
data # = 0x3FFFF - 0x440 :: 256K Flash
修改为:
rom (RX): ORIGIN = 0x00000440, LENGTH = 0x0001FBBF # Code + Const data #
= 0x1FFFF - 0x440 :: 128K Flash
将$installdir\mqx\source\bsp\nscf51acr1\目录下所有文件,包括.c,.h以及其他类型的文件
中出现的 m51acdemo字符串全部替换为 nscf51acr1
用 codewarrior for Microcontroller V6.3 打 开
%installdir\mqx\build\cwmcu63\psp_nscf51acr1.mcp,然后按照 3.3.1节的步骤做修改
用 codewarrior for Microcontroller V6.3 打 开
%installdir\mqx\build\cwmcu63\bsp_nscf51acr1.mcp,然后按照 3.3.2节的步骤做修改
按照 3.3.3节的说明,做其他源码的修改
3.3.1 修改 psp工程设置
分别对 Debug regABI和 release regABI两个target做同样的设置修改。下面只以Debug
regABI为例。
最原始的界面如下: Nicrosystem MQX 移植指南
7
将 m51acdemo user config重命名为nscf51acr1 user config。删除 user_config.h文件,点
击右键->add files…,重新加入%installdir\config\nscf51acr1\user_config.h
点击Debug RegABI setting按钮(或者按ALT+F7),弹出设置对话框:
点 choose,选择 output Directory为%installdir\lib\nscf51acr1.cw\mqx
选择Access Paths,出现:
将 删除,点击add加入%installdir\config\nscf51acr1
选择 BatchRunner P…,出现
点 choose,将 替换为
%installdir\mqx\build\bat\psp_nscf51acr1.bat Nicrosystem
3.3.2 修改 bsp工程设置
原始的工程打开后如下:
修改 m51acdemo User Config为 nscf51acr1 User Config,将 user_config.h删除,加入
%installdir\config\nscf51acr1\user_config.h
将 m51acdemo BSP Files改名为 nscf51acr1 VSP Files,然后删除掉下面的所有文件,右
键 add files…,重新加入%installdir\mqx\source\bsp\nscf51acr1目录下以及其子目录下的
所有.h和.c文件。如下图所示:
点击 Debug RegABI setting按钮(或者按 ALT+F7),弹出设置对话框:
点 choose,将 换成%installdir\lib\nscf51acr1.cw\mqx
选择 Access Paths,出现如下对话框 Nicrosystem
将其中的(project)..\..\..\config\m51acdemo,..\source\bsp\m51acdemo,
\source\bsp\m51acdemo\cw分别替换成对应的%installdir\config\nscf51acr1,
%installdir\mqx\source\bsp\nscf51acr1,%installdir\mqx\source\bsp\nscf51acr1\cw。简单说就是
把所有出现 m51acdemo的项全换掉
再选择 Coldfire Target,出现:
将 File Name里的 m51acdemo_regabi_d.a 换成 nscf51acr1_regabi_d.a Nicrosystem
选择 BatchRunner P…,出现
将对应的 bsp_m51acdemo.bat 换成%installdir\mqx\build\bat\bsp_nscf51acr1.bat
3.3.3源码修改
这部分是与你板子的硬件设计直接相关的,简单说,你的硬件与所选择的baseline bsp
板子有任何差异,都要做相应修改,这部分基本上就是整个移植过程中,开发工作量最大的
一部分。
下面我们以NSCF51ACR1 开发板为平台,以两个例子来说明修改方法。第一个例子是
芯片时钟初始化,第二个例子是对 SD卡的支持。
芯片时钟初始化
NSCF51ACR1 开发板采用的晶振是25MHZ,这点与我们作为基线版本的 M51acdemo
是不同的,飞思卡尔的 m51acdemo上用的是 4MHZ晶振。所以在系统启动最开始对时
钟的初始化要做修改,即设置 CPU主频。
找到%installdir\mqx\source\bsp\nscf51acr1\bsp_init.c文件,将其中的
_mqx_clock_init_20MHz()函数删除,添加新的_mqx_clock_init_25MHz(),将系统主频设
置为50MHZ,这块代码需要根据 MCF51AC128手册来写
在nscf51acr1.h中修改
#define BSP_SYSTEM_CLOCK (40000000L)
为:
#define BSP_SYSTEM_CLOCK (50000000L)
SD卡支持
NSCF51ACR1 开发板支持 SD卡,而飞思卡尔官方的m51acdemo没有此功能,为此需
要在bsp中添加对SD卡的支持,核心就是添加 SD卡的驱动程序。
NSCF51ACR1开发板的SD卡是通过MCF51AC128的SPI1驱动的,因此需要SPI驱动,
这个在 m51acdemo bsp中已经加入了,所以不需要修改。我们需要的是SD卡驱动程序,
飞思卡尔在 MQX中已经实现,代码在%installdir\mqx\source\io\sdcard。我们打开
bsp_nscf51acr1.mcp,在 peripheral IO Drivers 下面创建一个目录,命名为sdcard,,再在
sdcard下创建个子目录 sdcrad_spi,将%installdir\mqx\source\io\sdcard下的.h和.c文件加
到 sdcard下,将%installdir\mqx\source\io\sdcard\sdcard_spi目录下的.h和.c文件加到
sdcard_spi下。如图:
这样 sdcard的驱动程序就加入到bsp中了。接下来要创建 sdcard的初始化参数配置文
件。在%installdir\mqx\source\bsp\nscf51acr1 下创建一个新文件:init_sdcard0.c,将这个
文件加入 bsp工程,如下图所示:
在 init_sdcard0.c中添加代码,如下:
在 nscf51acr1.h文件中添加:
在 user_config.h中检查 BSPCFG_ENABLE_SPI0 是否为 1,如没有,则添加
#define BSPCFG_ENABLE_SPI0 1
在 bsp.h里添加:
#include <sdcard.h>
#include <sdcard_spi.h>
extern const SDCARD_INIT_STRUCT _bsp_sdcard0_init;
打开 Debug RegABI Settings,选择Access Paths,添加%installdir\mqx\source\io\sdcard
和%installdir\mqx\source\io\sdcard\sdcard_spi,如下图:
点 OK 确认退出。
打开%installdir\mqx\build\bat\bsp_nscf51acr1.bat,添加:
copy /Y ..\..\..\mqx\source\io\sdcard\sdcard.h .
copy /Y ..\..\..\mqx\source\io\sdcard\sdcard_spi\sdcard_spi.h .
至此,SD卡支持完成,其他硬件差异的支持步骤与此类似,可能需要你开发相应的驱
动程序。
最后打开bsp_nscf51acr1.mcp build,生成的库文件以及用户需要用到的头文件全部自动
拷贝到%installdir\lib\nscf51acr1\mqx 下。
再打开 psp_nscf51acr1.mcp, build,生成psp的库,也拷贝到%installdir\lib\nscf51acr1\mqx
下。
这样就完成了MQX BSP的移植。
当然如果还需要MFS、RTCS等功能,还要针对这些组件进行移植,相关的步骤与此类
似,但都比较简单。