请稍侯

MQX机制分析——介绍

18 February 2014

  最近一段时间一直在看MQX的代码,抽空把一些笔记整理记录下来。接下来一个系列的文章会基于MQX 4.0.2这个版本的源码从启动,时间管理,任务调度,中断管理,任务同步以及内存管理这几个部分进行分析。

简介

  MQX的缩写是Message Queue eXecutive,意为消息队列执行,是Precise Software Technologies公司1989年开发的一款嵌入式实时操作系统。2000年3月,MQX被ARC公司收购,并在新的处理器体系中(主要包含:Freescale的ColdFire系列、IBM®/Freescale的PowerPC、ARM、ARC和i.MX等)继续开发。2009年,飞思卡尔半导体公司出售ColdFire MCU时,额外附加了MQX的源代码,并在其官方网站上提供源代码,使其成为开源RTOS。在这里可以下载源码。
  MQX还提供了轻量级的MQXLite用于硬件资源比较紧张的硬件平台。MQX从2009年推出第一个版本3.0.1开始,一直在不断的更新升级,截止目前已经到4.0.2这个版本。在MQX中,除了基本的驱动外,还额外附上了一些其他组件,如TCP/IP和USB协议栈等等。
  官方对MQX工程的组织,是将完整的MQX工程分为PSP(processor Support Package,处理器支持包)工程、BSP(Board Support Package,板级支持包)工程和APP工程。三个工程相对独立,可以分别编译;PSP工程将与处理器内核相关的文件及MQX系统内核文件组织起来,编译生成处理器支持包的库文件;BSP工程将与外设模块功能和电路板相关的文件组织起来,编译生成板级支持包的库文件;APP包含处理器支持包和板级支持包的库文件及用户编写的任务程序,编译最终生成完整的MQX应用的可执行文件。
  什么是PSP什么是BSP呢?BSP是与硬件开发平台相关的代码,具体来说,PSP是与芯片的处理器内核相关的一系列代码,涉及到MQX操作系统中的上下文切换、中断控制等与处理器结构密切相关的功能。源码包中除了Cortex-M4内核之外还提供了CodeFire及PowerPC处理器的psp包,在安装时选择即可。而BSP的内容是与电路板相关的代码,涉及到MQX操作系统启动过程中对硬件系统(时钟、中断控制等)的初始化。不同的电路板对应不同的BSP,即使采用与Demo板相同的芯片,也需要根据硬件电路的不同在官方提供的BSP文件基础上进行修改。

使用

  首先我们需要下载源码,运行自解压安装程序,然后按说明继续操作。如果改变了默认安装位置(默认路径C:\Program Files\Freescale\Freescale MQX 3.X),建议您重新编译所有内核库。否则,每当在调试器下启动这个应用程序时,调试器便会询问MQX源代码文件的路径。安装完之后我们就会发现在默认的路径下Freescale_MQX_4_0这个文件夹下这样的文件结构:
1   最后一个文件是我自己加上去,因为4.0.0文件夹与4.0.2类似,有时会搞混,就手动加上一个文件表示版本号,看着清楚一点。下面简单介绍下每个文件夹作用。


build文件夹

  包含bsp,psp,shell等的makefile文件以及通用的make文件。

config文件夹

  对不同开发环境的支持,其中的common文件夹包含了官方提供的四个配置文件:maximum_config.hsmall_ram_config.hsmallest_config.hverif_enabled_config.h。对于不同的硬件配置来选用不同的配置文件,这些文件就是对一些非必需模块的定制。

demo文件夹

  给出了四个样例工程。

doc文件夹

  所有模块的官方文档。如MQX中的嵌入式文件系统,tcp/ip协议栈,usb协议栈等。

lib文件夹

  MQX中的库工程的头文件(库工程在mqx文件夹下的build文件夹中),freescale的源代码的体现的思想是:用户只需要做应用级的开发,将bsp和psp这两个库工程编译好之后,其他工程中使用的bsp.a和psp.a文件会指向编译好的库文件,若用户需要修改bsp和psp,则需要重新编译两个库工程。

mcc、mfs、rtcs、shell、usb文件夹

  多核通信,MQX文件系统,tcp/ip协议栈,shell工具、usb协议栈相关文件夹,包含程序和部分文档(介绍文档在doc文件夹)。

mqx文件夹

  其中有三个文件夹,build包含了不同的编译器的bsp、psp库工程。example文件夹包含了若干模块的样例代码。source文件夹包含了样例工程中相同文件夹的内容,如fio、io等等。

tools文件夹

  包含一些常用的工具,如ddcopy(硬盘对拷程序)还有BSPCloningWizard(快速创建一个新工程)。


  开发环境使用的是CodeWarrior V10.4,开发板使用的是我们实验室的K60开发板,采用MK60DN512ZVLQ60作为主控芯片,板上集成OSBDM写入器,通过一根USB连接线与PC机相连即可进行开发。
2
  首先打开CodeWarrior V10.4,将..\Freescale_MQX_4_0\mqx\build\cw10gcc文件夹下的bsp和psp库工程导入到环境中。再将..\Freescale_MQX_4_0\mqx\examples\hello\cw10gcc文件夹下的hello_twrk60n512工程拖到CW中。文件结构如下所示:
3

  因为使用的是我们实验室自己的开发板,所以bsp那个库中需要修改一些东西,比如默认的调试串口,以及默认串口使用的哪几个引脚。首先我们在..\Freescale_MQX_4_0\config\twrk60n512目录下找到user_config.h这个文件,里面存放了可用于对模块进行配置的宏定义,我们需要设置下使用的串口,这块开发板上使用的默认调试串口是串口4,也就是ttye(tty是teletype电传打字机的缩写,unix系统中开始使用,后沿用至今。e是从a开始计数,a代表0,依次向后计数)。找到下面那两个宏定义,将BSPCFG_ENABLE_TTYE修改为1,代表使能串口4,另外一个BSPCFG_ENABLE_ITTYE代表的是带中断的串口4,我们现在还不需要使用。

#define BSPCFG_ENABLE_TTYE                        1
#define BSPCFG_ENABLE_ITTYE                       0
...
#define BSP_DEFAULT_IO_CHANNEL                    "ttye:"

  设置好了默认串口,还需要设置这个串口使用的是哪个引脚。打开..\Freescale_MQX_4_0\mqx\source\bsp\twrk60n512文件夹下找到init_gpio.c这个文件,找到_bsp_serial_io_init这个函数中下面这块代码。

case 4:
            pctl = (PORT_MemMapPtr)PORTE_BASE_PTR;
            if (flags & IO_PERIPHERAL_PIN_MUX_ENABLE)
            {
                /* PTE25 as RX function (Alt.3) + drive strength */
                pctl->PCR[25] = 0 | PORT_PCR_MUX(3) | PORT_PCR_DSE_MASK;
                /* PTE24 as TX function (Alt.3) + drive strength */
                pctl->PCR[24] = 0 | PORT_PCR_MUX(3) | PORT_PCR_DSE_MASK;
            }

  查看指定的串口引脚是否与实际的电路板一致。本开发板的串口4使用了PTE25和PTE24作为收、发引脚,与默认设定一致,不需要修改。还有就是串口的通信速率的设置了,打开..\Freescale_MQX_4_0\mqx\source\bsp\twrk60n512目录下twrk60n512.h文件,这个文件包含对官方demo板(也就是tower板)的所有的模块引脚设置,我们需要修改的地方有两块,第一块是板上运行指示灯的引脚修改,另外一处就是串口通信速率的修改。

#define BSP_LED1                    (GPIO_PORT_A | GPIO_PIN11)
#define BSP_LED2                    (GPIO_PORT_A | GPIO_PIN28)
#define BSP_LED3                    (GPIO_PORT_A | GPIO_PIN29)
#define BSP_LED4                    (GPIO_PORT_A | GPIO_PIN10)
...
#ifndef BSPCFG_SCI4_BAUD_RATE
	#define BSPCFG_SCI4_BAUD_RATE             115200
#endif
...

  修改完之后,我们需要将BSP、PSP两个库工程重新编译生成bsp.a(位于..\Freescale_MQX_4_0\lib\twrk60n512.cw10gcc\debug\bsp文件夹下)和psp.a(位于..\Freescale_MQX_4_0\lib\twrk60n512.cw10gcc\debug\psp文件夹下)文件。再将hello_twrk60n512编译,编译完成后将程序通过OSBDM写入器烧写到开发板中,运行程序,运行结果是在串口调试工具打印出Hello World,结果如下: 4
  至此我们通过定制MQX完成了第一个hello world程序,接下来的文章会对MQX的具体机制进行分析,不早了,熄灯准备睡觉了。