You are on page 1of 79

MQX

MQX

2009
MQXMQX Precise Software Technologies
1989 2009 MQX
API TCP/IP USB
MQX
MQX
1 MQX MQX
MQX
MQX
2 MQX FIFO RR
FIFO RR MQX

3 MQX MCF52223
LCD MQX

MQX
MQX

MQX

Abstract

Kernel Analysis and Application Research of Embedded Real-time Operating System MQX

Kernel Analysis and Application Research of Embedded


Real-time Operating System MQX
Abstract
Embedded real-time operating system MQX that applies industrial control, automotive
electronics and consumer electronics is launched by Freescale semiconductor in the
chinese market in 2009. MQX was first developed by Precise Software Technologies
Corporation in 1989. MQX opens source after Freescale's acquisition in 2009. MQX
adopts micro-kernel structure, with standard API interface, module architecture, TCP/IP
protocol stack, USB protocol stack and so on. So it has excellent performance in terms of
real-time, transplant and reduction. In view of the domestic research and application of
MQX not yet begin, commissioned by Freescale semiconductor, the paper analyzes and
researches MQX mainly from the following aspects:
(1) Researches MQX micro-kernel structure and kernel management function, and
deeply analyzes MQX running implementation mechanism from MQXs startup, task
scheduling, device driver and so on. Puts forward MQX engineering framework structure
by the idea of underlying software component, and rewrites device driver.
(2) Analyzes and researches FIFO scheduling policy and RR scheduling policy of
MQX, combines FIFO scheduling policy with RR scheduling policy, designs and
implements multi-level feedback queue scheduling algorithm in the MQX, which not only
responds the task with high priority but also makes the short task done quickly.
(3) Transplants MQX to the automatic bending system microcontroller MCF52223,
elaborates transplant procedure, files to modify and configure in the transplant process,
designs LCD touch screen interface and completes the software platform design of
automatic bending system on the MQX.
Automatic bending equipment based on MQX runs well, effectively controls angle and
accuracy of bending, and possesses high real-time response capability. The paper
completes analysis and research of MQX, which has heuristic instructional function for its
study and application in the field of embedded control.
Key words: MQX, Kernel, Task Scheduling, Device Driver, Transplant
Written by ChengYujuan
Supervised by WangYihuai

II

......................................................................................................................1

1.1 .............................................................................................1
1.1.1 RTOS...........................................................................................1
1.1.2 RTOS...................................................................................................2
1.1.3 RTOS...................................................................................2
1.1.4 RTOS..................................................................................4
1.2 MQX ................................................................................................................5
1.2.1 MQX ...........................................................................................5
1.2.2 MQX ...................................................................................................6
1.3 .............................................................................................7
1.3.1 ........................................................................................................7
1.3.2 ........................................................................................................7
1.4 .............................................................................................7
1.4.1 ........................................................................................................8
1.4.2 ........................................................................................................8
1.5 .........................................................................................................9
MQX ......................................................................................................10
2.1 MQX ......................................................................................................10
2.1.1 ..........................................................................................10
2.1.2 MQX ................................................................................................. 11
2.2 ...............................................................................................................12
2.2.1 ..............................................................................................13
2.2.2 MQX .........................................................................................13
2.2.3 MQX .............................................................................................14
2.2.4 MQX .....................................................................................15
2.3 ...............................................................................................................16
2.3.1 MQX .....................................................................................16
2.3.2 MQX .....................................................................................16
2.3.3 MQX .........................................................................................17
2.4 ...............................................................................................................17
2.4.1 ..........................................................................................17
2.4.2 MQX .........................................................................................18

2.4.3 MQX .............................................................................................18


2.5 ...............................................................................................................19
2.6 ...................................................................................................20
2.6.1 ..............................................................................................................21
2.6.2 ..........................................................................................................21
2.6.3 ..............................................................................................................22
2.6.4 ..............................................................................................................22
2.7 ...............................................................................................................23
MQX ..............................................................................................24
3.1 MQX ..........................................................................................24
3.1.1 Bootloader.........................................................................................25
3.1.2 Bootloader.....................................................................................25
3.1.3 MQX .............................................................................................26
3.2 MQX ..................................................................................................27
3.2.1 ..............................................................................................27
3.2.2 ..............................................................................................29
3.3 ...........................................................................................30
3.3.1 ......................................................................................30
3.3.2 ......................................................................................31
3.3.3 ......................................................................................32
3.3.4 ..................................................................................................34
3.4 MQX ..................................................................................34
3.4.1 MQX .............................................................................35
3.4.2 MQX ............................................................................36
3.4.3 ......................................................................................37
3.5 ...............................................................................................................39
MQX ..................................................................................................40
4.1 MQX ..................................................................................................40
4.1.1 CodeWarrior..................................................................................40
4.1.2 CW ................................................................................................41
4.2 MQX ..................................................................................................41
4.3 MQX ..............................................................................................42
4.3.1 ..........................................................................42
4.3.2 ..........................................................................43
4.4 MQX .....................................................................................................44
4.4.1 ..............................................................44

4.4.2 CWMQX..............................................................45
4.4.3 ..................................................................46
4.5 ...............................................................................................................51
MQX ..........................................................................52
5.1 ...............................................................52
5.1.1 ......................................................................................................52
5.1.2 ......................................................................................................53
5.2 MQX ..................................................................................................53
5.3 LCD............................................................................................55
5.3.1 LCD...........................................................................................55
5.3.2 ..........................................................................................56
5.4 .......................................................................................58
5.4.1 ......................................................................................................58
5.4.2 ..............................................................................................61
5.5 ...............................................................................................................62
............................................................................................................63
6.1 .......................................................................................................................63
6.2 .......................................................................................................................64
..............................................................................................................................65
..................................................................70
A MQX.....................................................................................................71
B .............................................................................................72

..................................................................................................................................73

MQX

MQX 2009 RTOS


ROM

MQX

RTOS
RTOS MQX

1.1

[1]

Embedded Real-Time Operating SystemERTOSRTOS

1.1.1 RTOS
20 70 40
40 RTOSRTOS
200 RTOS[2]RTOS
120 70
RTOS
RTOSCRTOS
[2]
21981 Ready System
VRTX32[3]20 80 RTOS
1

MQX

RTOSVRTXIPIMTOS 80 ISIPSOS
16 68k8086[4]
320 90
RTOS

[4]
420 90 RTOS
RTOS
APIApplication Programming InterfaceAPI
POSIXPortable Operating System Interface of UnixPOSIXWin32
RTOS UNIXWindows

1.1.2 RTOS
RTOS

[5]RTOS
[6]
RTOS
Interrupt Service RoutineISR
I/O RTOS
1
2
3
4
5

1.1.3 RTOS
1.
RTOS

MQX

2.

3.

4.

[9]
5.

1
2

6.
CPU CPU
ISR

7.
CPU

8.
CPU CPU
CPU
9.

MQX

10.

1.1.4 RTOS

MP4[7]RTOS
RTOS
VxWorksC/OS-IIClinuxmicro-control LinuxQNXeCosEmbedded
Configurable Operating System [8]-[13] RTOS
Windows CEAndroidSymbian[14]-[16] 1-1 RTOS
1-1 RTOS

VxWorks

C/OS-II

Clinux

QNX

eCos

WinCE

WindRiver 400

Jean
Labrosse 1992 64

Linux MMU


API
TCP/IP
QNX

GNU


OS
Visual Studio

Google
Android Linux

Symbian

RAM ROM

PDA

Linux

MQX

1.2 MQX
Message Queue eXecutiveMQXPrecise Software Technologies
1989 2000 3 MQXARC
[17]FreescaleColdFireIBM/Freescale
PowerPCARMARCi.MX[18]2009
ColdFire MCUMQXRTOS
MQX

1.2.1 MQX
2009 MQXRTOS 3.0.1
3.6.2
[19]-[21] 1-2
1-2 MQX RTOS

3.0.1

2009,1

3.1.0

2009,4

3.2.1

2009,6

3.3.0

2009,8

1CodeWarrior
Task-Aware DebuggingTAD
2Board Support PackageBSP
Trivial File SystemTFSI2CInter Integrated CircuitFlexCAN
Real-Time ClockRTC I/OGeneral Purpose
I/OGPIOPC PC
3 TCP/IP Real-Time TCP/IP Communication SuiteRTCSMQX
MQX File SystemMFSUniversal Serial BUSUSB
RAM
4RTCS HTTP
5 USB HUB HUB
6 USB USB
Host Development KitHDK
1
2 SNMPv2Simple Network Management ProtocolSNMP
ROM Management Information BaseMIB
3Analog-to-Digital ConverterADCSerial
Peripheral InterfaceSPI
1 ColdFire V1 V2
2 MQX Flash FlashX Flash
1 ColdFire V1-V4
Fast Ethernet ControllerFECMedium Access Control
MAC
2Shell MFS File Transfer Protocol
FTP
3USB MASS Storage DeviceMSD
Communication Device ClassCDC

MQX

3.4.0

2009,10

3.5.0

2010,2

3.5.1

2010,4

3.6.0

2010,6

3.6.2

2010,11

1 USB Enhanced Host Controller InterfaceEHCI

2Personal Hospital Device ClassPHDC


Inter-processor communicationIPC
3 SPI SPIQSPI DSPI SPI SD
1 MQX
2SPI EEPROM SPI EEPROM
MRAM
3ENET MAC
1 ColdFire V1-V4
2 SD Embeded Secure Digital High Capacity
ESDHCDigital-Analog ConverterDACNAND Flash
1 CodeWarrior 10
2 eGUIembedded Graphical user interfaceeGUI
3 UDP IPC
1Freescale Kinetis ARM Cortex M4 PSP
2 ARM IAR MQX Kinetis
3 RTC API I/O
MAC-NET Kinetis

1.2.2 MQX
MQX
MQX
[22]
1
MQX Freescale
MQX

2[23]
MQX

3
MQX

4 APIMS-DOS MS-DOS
File SystemMFS
5[24]
RTCS MAC TCP/IP FTPTelnet
DHCPSNMPDNSHTTP
6

MQX

6USB[25]
USB USB USB PHDC
HID MSD CDCHUB

1.3
1.3.1

RTOS 40 RTOS
VxWorksC/OS-IIClinuxWindows CEAndroid 1-1

1.3.2
RTOS
MCU&DSP
RTOS

RTOS MQX MQX

1.4
MQX
MQX
7

MQX

APITCP/IP[22]
MQX

1.4.1
MQX
1 MQX MQX RTOS
MQX

2 MQX MQX
MQX MQX
MQX FIFO
RR MQX
MQX
3 MQX
MQX

4 MQX
LCD

1.4.2
RTOS
RTOS
MQX MQX
MQX
MQX MQX MQX
MQX
RTOS MQX

MQX

1.5

RTOS RTOS
RTOS MQX
RTOS

MQX MQX
MQX MQX
MQX
MQX
MQX

MQXMQX
Bootloader
MQX
MQXMQX
MQX
MQX MQX CodeWarrior
CW
MQX
MQX
MQX

MQX
MQX MCF52223

LCD

MQX MQX

MQX
MQX RTOS
RTOS

CPU
MQX
MQX

2.1 MQX
MQX

2.1.1

[26]

[27] 2-1

2-1

10

MQX MQX

2.1.2 MQX
MQX
MQX
2-2 MQX[22]
MQX
A

2-2 MQX

2-2 MQX
MQX 2-1

11

MQX MQX
2-1

BSP

I/O

RRFIFO

MQX

MQX MQX

Memory Management UnitMMU

ID
EDS EDS MQX

BSP

I/O I/O
I/O I/O API

2.2
TaskRTOS

CPU
ID
TCB[28]
RTOSC
[29]

12

MQX MQX

2.2.1
MQXTASK_TEMPLATE_STRUCT

MQX_AUTO_START_TASK
MQX

typedef struct task_template_struct


{
_mqx_uint TASK_TEMPLATE_INDEX;
void (_CODE_PTR_ TASK_ADDRESS)(uint_32);
_mem_size TASK_STACKSIZE;
_mqx_uint TASK_PRIORITY;
char _PTR_ TASK_NAME;
_mqx_uint TASK_ATTRIBUTES;
uint_32 CREATION_PARAMETER;
_mqx_uint DEFAULT_TIME_SLICE;
};

//
//
//
//
//
//
//
//

MQX
32 IDMQX
MQX 0
6
7

1 MQX
2Digital Signal ProcessingDSPMQX DSP

3MQX
4MQX FIFO

2.2.2 MQX
OS[30]MQX

13

MQX MQX

2-3 [31]

2-3

MQX
1Terminated CPU
2Blocked

[30]
3Ready

4Active CPU

2.2.3 MQX
OS CPU
CPU MQX

MQX
1

2
3
4

14

MQX MQX

2.2.4 MQX
RTOSMQX
[22][32]
1

[33]
MQX _task_create()_task_create_blocked()
_task_create()
_task_create_blocked()
_task_ready()
2 IDs
_task_get_id() ID
_task_get_creator() ID
ID
_task_get_id_from_name()
ID
3
_task_get_priority()_task_set_priority()

4
_sched_get_policy()_sched_set_policy()

_task_stop_preemption()

15

MQX MQX

_task_start_preemption()
6
MQX
_task_get_error()
_task_set_error()
MQX_OK MQX_OK MQX

7
_task_restart()
ID
8
ID
MQX MQX
_task_destroy()_task_abort()

2.3

2.3.1 MQX
MQX tick
MQX
200 5 MQX ISR

MQX MQX

2.3.2 MQX
_time_get_resolution()
16

MQX MQX

_time_set()
_time_get()
_time_delay()

2.3.3 MQX
MQX
1 MQX

2
MQX

MQX

2.4
[34]
ISRRTOS
CPU

RTOS[35]
RTOSCPU

ISRISR

[36]

2.4.1
ISR

17

MQX MQX

1
ISR ISR
ISR

2
3
4 ISR API ISR
API ISR

2.4.2 MQX
MQXISRMQXISR[37]
1
2
3
4

2.4.3 MQX
MQX ISR ISR
ISR MQX
ISR ISR
MQX ISR
ISR
1
2
3 ISR
4 ISR
MQX ISR ISR
18

MQX MQX

ISR ISR ISR

2-4 MQX

2-4 MQX

MQX
1MQX ISR
ISR ISR _int_default_isr() ISR
2 ISRMQX _int_install_isr()
ISR ISR_int_install_isr()

1
2
3
ISR
3 ISR_int_install_kernel_isr() ISR ISR
ISR
1

2 MQX
3

2.5
RTOS malloc() free()
RTOS

MQX

MQX MQX

19

MQX MQX

MQX

MQX MMU
MMU MMU MMU

2-5 MMU

2-5 MQX

2.6
[30]

RTOS

MQX

MQX MQX

20

MQX MQX

2.6.1
ISR
ISR

2
3
4

MQX

ISR MQX

MQX
MQX

2.6.2
ISR
12

3[38]

[39]
3

[9]
MQX MQX

MQX 0 MQX
MQX

21

MQX MQX

MQX
MQX

[40]
[41]
MQX

2.6.3

MQX

2.6.4
ISR

1
2

[42]

MQX

MQX MQX

ID
MQX
MQX ID

22

MQX MQX

ISR
MQX

2.7
MQX MQX

1
MQX
2 MQX
MQX
3 MQX
4 MQX

MQX
MQX MQX
MQX

23

MQX MQX

MQX
RTOS
RTOSMQX

BootloaderMQX
MQX
MQXMQX

3.1 MQX
MQX Bootloader
main()_mqx()
MQX 3-1 MQX
CodeWarrior BSP MQX

3-1 MQX

1ColdWarrior
CF_startup.cColdWarrior _start()
_SP_INIT.bss/.sbss C
24

MQX MQX

initialize_hardware() initialize_OS() main()


2BSP[37]
vectors.c_boot()
init_hw.c/bsp_init.c Flash
SDRAM PLLFlex

cw.c Metrowerks CodeWarrior


CW
cw2.c MQX C main()
init_bsp.cBSP I/O

3MQX
mqx.c MQX _mqx()
dispatch.cw

3.1.1 Bootloader
Bootloader

BootloaderMQX
Bootloader
CPU
Bootloader[43]

3.1.2 Bootloader

vectors.c

(vector_entry)__BOOT_STACK_ADDRESS,
__boot,

//
//(0x004) PC

__BOOT_STACK_ADDRESS intflash.lcf
25

MQX MQX

__boot __boot
Program CounterPC__boot

_boot() start()_boot()
SRAMFlash IPSBAR 4G
IPSBAR
FLASHBAR Flash RAMBAR1 SRAM
start()
jsr mcf5222_init
jmp _start

//
//

jsr mcf5222_init
PC jmp _start
CF_startup.c start()
CPU ColdFire
initialize_hardware() initialize_OS() main()

3.1.3 MQX
Bootloader main()_mqx()
MQX MQX
main() cw2.c MQX MQX

TASK_TEMPLATE_STRUCT
MQX_AUTO_START_TASK
MQX
main()
int main(void)
{
extern MQX_INITIALIZATION_STRUCT MQX_init_struct;
_mqx(&MQX_init_struct );
// MQX
return 0;
}

mqx()
TD
26

MQX MQX

BSP
mqx()

_mqx()MQX[22]
typedef struct mqx_initialization_struct
{
_mqx_uint PROCESSOR_NUMBER;
//
pointer START_OF_KERNEL_MEMORY;
// RAM
pointer END_OF_KERNEL_MEMORY;
// RAM
_mqx_uint INTERRUPT_STACK_SIZE;
//
TASK_TEMPLATE_STRUCT_PTR TASK_TEMPLATE_LIST; //
_mqx_uint MQX_HARDWARE_INTERRUPT_LEVEL_MAX; //
_mqx_uint MAX_MSGPOOLS;
//
_mqx_uint MAX_MSGQS;
//
char _PTR_ IO_CHANNEL;
// I/O
char _PTR_ IO_OPEN_MODE;
// I/O
_mqx_uint RESERVED[2];
//
}MQX_INITIALIZATION_STRUCT, _PTR_ MQX_INITIALIZATION_STRUCT_PTR;

3.2 MQX

MQX
First In First Out
FIFO
Round RobinRR
FIFO RR
MQX

3.2.1
MQX POSIX.4
1. FIFO
MQX FIFO FIFO
<MQX_install>\mqx\source\kernel\mqxiinit.h
#if MQX_HAS_TIME_SLICE
kernel_data->SCHED_POLICY = MQX_SCHED_FIFO;//
#endif

27

MQX MQX

FIFO
3-2
1 MQX
2
3

3-2 FIFO

2. RR
RR
RR

MQX_TIME_SLICE_TASK RR
<MQX_install>\lib\<board>.cw\mqx\mqx_cnfg.h
#define MQX_HAS_TIME_SLICE 1

MQX_TIME_SLICE_TASK
DEFAULT_TIME_SLICE
0
BSP 5ms
50ms _sched_get_rr_interval()
_sched_get_rr_interval_ticks()_sched_set_rr_interval()
_sched_set_rr_interval_ticks()
MQX
MQX

28

MQX MQX

RR

FIFO 3-3

3-3

3.

#define MQX_TASK_QUEUE_FIFO
#define MQX_TASK_QUEUE_BY_PRIORITY

(0x00)
(0x08)

1_taskq_create()
2_taskq_suspend()
3_taskq_resume()

3.2.2
MQX
<MQX_install>\lib\<board>.cw\mqx\mqx.h
1 MQX_AUTO_START_TASK

#define MQX_AUTO_START_TASK

(0x01)

2 MQX_FLOATING_POINT_TASK
29

MQX MQX

#define MQX_FLOATING_POINT_TASK

(0x02)

3 MQX_TIME_SLICE_TASK
RR
#define MQX_TIME_SLICE_TASK

(0x04)

4 MQX_DSP_TASK DSP
DSP DSP
DSP

#define MQX_DSP_TASK

(0x08)

3.3

[44]

[45]

3.3.1
MQX FIFO RR
MQX FIFO

2
1
2 CPU I/O
30

MQX MQX

MQX RR
CPU

CPU

FIFO

CPU
RR
1T=N*q
2
3
MQX FIFO RR
FIFO RR

3.3.2

MQX [30][46]
1NQ1 ,Q2....QN

Priority(Q1 )>Priority(Q2)>...>Priority(QN)

2
Q1 FIFO

Q2 FIFO
Q2Q3
31

MQX MQX

Q1Qn Qn
3Q1 Q2Q1~Qi-1
QiQi
Q1~Qi-1
Qi
3-4

3-4

3 Q1Q2 Q3 248Priority(Q1)>
Priority(Q2 ) > Priority(Q3) 3 J1 J2 J3 013
CPU 321
3-5

3-5

3.3.3
MQX Task DescriptorTD

_task_set_priority() _sched_internal()
_sched_setscheduler()_sched_set_policy() MQX
kernel _sched_internal()
32

MQX MQX

_sched_setscheduler()_task_set_priority()
<MQX_install>\mqx\source\psp\coldfire\
dispatch.cw
sc_irdyq.c
<MQX_install>\mqx\source\kernel
sc_ipq.c
sc_obsel.csc_spol.c
sc_srr.c
MQX
1 kernel
60~5 5 FIFO
MQX 5ms
5ms 5*2n n 0n5

2 TD_STRUCT
Qnumber WaitTime
3_sched_internal()
1 6 WaitTime
maxWaitTime 1

2 1 FIFO
_task_set_priority()
2 5
6 6
1
3 I/O

33

MQX MQX

3.3.4
ColdWarrior 7.2
3.6.2 MQX MCF52223
80 RR
3-6 3-7

3-6

3-7

MQX
MQX

3.4 MQX

1
2
3
4

34

MQX MQX

3.4.1 MQX
MQX
1 I/O

2 buffercache
3
MQX
[47]
MQX

MQX
3-8 I/O I/O

3-8 MQX

MQX
FILE_STRUCTFILE_STRUCTMQX
API
FILE_STRUCT
[48] 3-9

3-9 I/O

MQX
(open)(close)(read)(write)
I/O(ioctl)MQX
I/OAPI
35

MQX MQX

POSIXI/O[37][49]MQXAPI 3-10

3-10 MQXAPI

MQX
1

3.4.2 MQX
MQX BSP
RAM<MQX_install>\config\<board>\user_config.h

#define BSPCFG_ENABLE_TTYB

1 BSP
fopen
MQX 3-1
3-1 MQX
I/O
ttya:
ttyb:
ttyc:
ittya:
ittyb:
ittyc:
i2c0:
i2c1:
spi0:
spi1:
gpio:
adc:
adcn:
flashx:

UART0
UART1
UART2
UART0
UART1
UART2
I2C0
I2C1
SPI0
SPI1
GPIO
ADC
ADC
CFM

36

(user_config.h)
BSPCFG_ENABLE_TTYA
BSPCFG_ENABLE_TTYB
BSPCFG_ENABLE_TTYC
BSPCFG_ENABLE_ITTYA
BSPCFG_ENABLE_ITTYB
BSPCFG_ENABLE_ITTYC
BSPCFG_ENABLE_I2C0
BSPCFG_ENABLE_I2C1
BSPCFG_ENABLE_SPI0
BSPCFG_ENABLE_SPI1
BSPCFG_ENABLE_GPIODEV
BSPCFG_ENABLE_ADC
BSPCFG_ENABLE_ADCn
BSPCFG_ENABLE_FLASHX

MQX MQX

3.4.3
I/OMQX

1
2BSPBSP[50]
1.
MQX device.h device.c
1
device.h
extern "C"
{
extern _mqx_uint _io_device_install(char_ptr);
}

2
device.c MQX

1_io_device_install(char_ptr)_io_dev_install()
MQX
fopen

_mqx_uint _io_device_install(char_ptr
{
_mqx_uint result;
result = _int_io_dev_install
(
identifier,
_io_device_open,
_io_device_close,
_io_device_read,
_io_device_write,
_io_device_ioctl,
NULL
);
return result;
}

identifier)

2_io_device_open(FILE_PTR, char_ptr, char_ptr)


37

MQX MQX

fopen I/O
_io_device_open 3-10
_io_device_open
3_io_device_close(FILE_PTR)
fclose I/O _io_device_close 3-10
_io_device_close xxx_open
4_io_device_read(FILE_PTR, char_ptr, _mqx_int)
read I/O _io_device_read 3-10
_io_device_read

5_io_device_write(FILE_PTR, char_ptr, _mqx_int)


write I/O _io_device_write 3-10
_io_device_write

6_io_device_ioctl(FILE_PTR, _mqx_uint, pointer)I/O


_io_device_ioctl
ioctl
I/O _io_device_ioctl 3-10

3
device.h device.c <MQX_install>\mqx\source\io\
device device.h device.c
2. BSP
MQX Platform Support PackagePSP
Board Support PackageBSPPSP
BSP
MQX BSP
Codewarrior BSP <MQX_install>\mqx\build\codewarrior\
bsp_<board>.mcp
1 device Codewarrior IO Drivers
38

MQX MQX

2OK
3 device.h <MQX_install>\lib\
<board>.cw\mqx
4
#include<device.h>_io_device_install fopenfclosewriteread
ioctl

3.5
MQX
1MQX MQX
Bootloader Bootloader MQX
main() main() mqx()

2MQX MQX
MQX FIFO
RR MQX
MQX
MQX

3MQX MQX

MQX
RTOS MQX

39

MQX

MQX

MQX
MQX MQX
1 MQX
2 MQX 3 MQX
MQX
4
MQX

4.1 MQX

PC
MQX CodeWarrior

4.1.1 CodeWarrior
CodeWarriorCWFreescale MCU
DSP
[51]CodeWarriorGUIIntegrated
Development EnvironmentIDEMCUC
C++
CodeWarrior 3 Special Edition
C
12KB 30
3 license
CodeWarrior
CodeWarrior for S08 V6.2CodeWarrior for HC12 V4.6CodeWarrior for
ColdFire V6.3CodeWarrior for ColdFire 7.1CodeWarrior for Microprocessor 9.2
CodeWarrior for MCU V10
CW

40

MQX MQX

[7]CW

MQX IARCodeWarrior for ColdFire V6.3

4.1.2 CW
CW Windows

license key

E-MAIL License.dat
License.dat License.dat
MQX
MQX

4.2 MQX
MQX
4-1

1config
Common BSP

BSP
2demo demo
3docMQX MQX

4-1 MQX

MFS RTCS USB


4lib BSP
5mfsMFS BuildExamples
Source
6mqx MQX BSP
41

MQX

MQX

BuildExamples Source
BuildCodeWarriorIAR
BSP PSP bat
BSPPSP
Examples MQX
MQX BSP
Source MQX BSP PSP

7rtcsTCP/IP
8shellshell
9tools
10usbUSB

4.3 MQX

MQX

MQX

4.3.1
Embedded Software ComponentESC

[52]MCF52223
CW 7.2 MQX 4-2

42

MQX MQX

4-2 MQX

4-2 :
1 inflash.lcf
MQX
2BSPMQX
MQXApplication Binary InterfaceABI
MQXBSPABIBSP
[21]
3main
ID

4.3.2

MQX

43

MQX

MQX

4-3 MQX

4-3 MQX
mcp
<bin>.S19 MCU
MQX
.S19
bin map
MCU map
MCU
<Progect_Data/Light/ObjectCode>.c
.o
.S19
<Sources>
CodeWarrior

4.4 MQX
4.4.1

#include

44

MQX MQX

[53]

1
2

3 MCU
MCU

4.4.2 CWMQX

File->New Project MCU


CRelocatable assembly
Project name Location

Light LCD
1 LCD
2 Light.mcp LCD.mcp
3 Light_Data
45

MQX

MQX

4 bin

4.4.3
MCF52223
MQX
MCF52223 I/O I/O
MCF52223 0 MCF52223
PC
main_task led_task uart0_task
1. GPIO
GPIO
1 0 1 0MCU GPIO
Port GPIO
GPIO IO_Driver.hIO_Driver.c GPIO

GPIO
Light_Run0 MCU GPIO_PORT_TC 0
MCU IO_Driver.h
1GPIOIO_Driver.h
//-------------------------------------------------------------------------------------------*
//:IO_Driver.h(GPIO )
*
//-------------------------------------------------------------------------------------------*
#include<mqx.h>
//
#include<bsp.h>
//
static FILE_PTR output_port=NULL;
//
#define Light_PORT
GPIO_PORT_TC
// GPIO TC
#define Light_Run0 0
//Run0 0
//
boolean IO_Init(uint_32 port,uint_32 name,uint_32 state); //IO_Init()
void IO_Control(uint_32 port,uint_32 name,uint_32 state); //IO_Control()

2GPIOIO_Driver.c
IO_Driver.c
46

MQX MQX
//----------------------------------------------------------------------------------------------*
//:IO_Driver.c(GPIO )
*
//----------------------------------------------------------------------------------------------*
#include<IO_Driver.h>
//----------------------------------------------------------------------------------------------*
//:IO_Init
*
// :
*
// :port:
*
//
name:
*
//
state:,1=(),0=()
*
// : IO
*
//----------------------------------------------------------------------------------------------*
boolean IO_Init(uint_32 port,uint_32 name,uint_32 state)
{
uint_32 output_set[] =
//
{
GPIO_PIN_STATUS_0,
GPIO_LIST_END
};
output_set[0]=port|name|output_set[0];
output_port=fopen("gpio:write",(char_ptr)&output_set);
// GPIO
if(output_port)
// GPIO
{
ioctl(output_port,(state)?
GPIO_IOCTL_WRITE_LOG1:GPIO_IOCTL_WRITE_LOG0,(pointer)&output_set);
}
return(output_port!=NULL);
}
//-----------------------------------------------------------------------------------------------*
//:IO_Control
*
// :
*
// :port:
*
//
name:
*
//
state:,1=(),0=()
*
// :
*
//------------------------------------------------------------------------------------------------*
void IO_Control(uint_32 port,uint_32 name,uint_32 state)
{
uint_32 light[]=
{
GPIO_PIN_STATUS_0,
GPIO_LIST_END
};
light[0]=port|name|light[0];
if(output_port)
// GPIO
{
ioctl(output_port,(state)?GPIO_IOCTL_WRITE_LOG1:GPIO_IOCTL_WRITE_LOG0,(pointer)&light);
}
}

2. Light
Light_task.hLight_task.cLight_task.h
47

MQX

MQX

UART_SEMLIGHT_SEM
Light_task.c
1LightLight_task.h
//------------------------------------------------------------------------------------------------*
//:Light_task.h ()
*
//------------------------------------------------------------------------------------------------*
#include <mqx.h>
#include <bsp.h>
#include <fio.h>
#include <IO_Driver.h>
extern uint_8 times;
//
extern LWSEM_STRUCT UART_SEM;
extern LWSEM_STRUCT LIGHT_SEM;
extern boolean IO_Init(uint_32 port,uint_32 name,uint_32 state);
//
extern void IO_Control(uint_32 port,uint_32 name,uint_32 state);
void led_task(uint_32);
//

2LightLight_task.c
//---------------------------------------------------------------------------------------------------*
//:Light_task.c()
*
//---------------------------------------------------------------------------------------------------*
#include<Light_task.h>
//---------------------------------------------------------------------------------------------------*
//:led_task
*
// :
*
// :initial_data
*
// :
*
//----------------------------------------------------------------------------------------------------*
void led_task(uint_32 initial_data)
{
uint_8 i;
_lwsem_wait(&LIGHT_SEM);
//
for(i=0;i<times-'0';i++)
{
Light_Control(GPIO_PORT_TC,Light_Run0,1); //
_time_delay(1000);
Light_Control(GPIO_PORT_TC,Light_Run0,0); //
_time_delay(1000);
}
_lwsem_post(&UART_SEM);
//
}

3. UART
Uart_task.hUart_task.cUart_task.h
UART_SEMLIGHT_SEM
Uart_task.c PC PC
48

MQX MQX

1UARTUart_task.h
#include<mqx.h>
#include<bsp.h>
#include<IO_Driver.h>
//
#define LED_TASK 6
//
extern uint_8 times;
//
extern LWSEM_STRUCT UART_SEM;
extern LWSEM_STRUCT LIGHT_SEM;
void uart0_task(uint_32 initial_data);
//

2UARTUart_task.c
#include<Uart_task.h>
//-------------------------------------------------------------------------------------------------------------*
//:uart0_task
*
// :,,, *
// :initial_data
*
// :
*
//--------------------------------------------------------------------------------------------------------------*
void uart0_task(uint_32 initial_data)
{
uint_32 c;
uint_32 flags=0;
_task_id task_id;
uint_32 result;
FILE_PTR serial_fd = fopen("ttya:",0);
// 0
IO_Init (GPIO_PORT_TC,Light_Run0,0);
//
ioctl(serial_fd, IO_IOCTL_SERIAL_SET_FLAGS, &flags); //
result = _lwsem_create(&UART_SEM, 1);
//
result = _lwsem_create(&LIGHT_SEM, 1);
if (result!=MQX_OK)
{
printf("\nCreating sem failed: 0x%X",result);
_mqx_exit(0);
}
while(TRUE)
{
if(fstatus(serial_fd))
//
{
_lwsem_wait(&UART_SEM);
//
c=fgetc(serial_fd);
//
times=c;
if(c==IO_ERROR)break;
putchar((char)c);
//
_lwsem_post(&LIGHT_SEM);
//
task_id=_task_create(0,LED1_TASK,0);
//
if(task_id==MQX_NULL_TASK_ID)
{
printf("\nCould not create LED_TASK\n");
}
else

49

MQX

MQX

{
printf("\nLED_TASK created\n");
}
}
}
fclose(serial_fd);
}

4.
main_task led_task
uart0_task main_task uart0_task
uart0_task PC led_task

//-----------------------------------------------------------------------------------------------------------*
// :Light
*
//:MCU 0 PC
*
//: I/O ,
*
//
: MQX
*
//
: Freescale MCU
*
//--------------- 2011 -----------------------------------*
#include <IO_Driver.h>
//
#define MAIN_TASK 5
// ID,
#define LED_TASK 6
#define UART_TASK 7
uint_8 times;
//
LWSEM_STRUCT UART_SEM;
//
LWSEM_STRUCT LIGHT_SEM;
//
extern void main_task(uint_32);
extern void led_task(uint_32);
extern void uart0_task(uint_32);
//
TASK_TEMPLATE_STRUCT MQX_template_list[] =
{
//,
,,,, ,
,
{MAIN_TASK,main_task,1500, 9, "main",MQX_AUTO_START_TASK,0, 0},//
{LED_TASK,led_task,
1500, 10, "led1", 0,
0, 0},//
{UART_TASK,uart0_task,1500, 11, "uart", 0,
0, 0},//
{0,
0,
0,
0,
0,
0,
0, 0} //
};
//------------------------------------------------------------------------------------------------------------*
//:main_task
*
// :
*
// : initial_data
*
// :
*
//-------------------------------------------------------------------------------------------------------------*
void main_task(uint_32 initial_data)
{
int i=0;
_task_id task_id;
task_id=_task_create(0,UART_TASK,0);
//

50

MQX MQX
if(task_id==MQX_NULL_TASK_ID)
{
printf("\n Could not create UART_TASK\n");
}
else
{
printf("\n UART_TASK created \n");
}
}

MCF52223 MQX
UART SPI IIC AD
Flash

4.5
MQX MQX
1 MQX CodeWarrior CW
MQX CW

2 MQX
MQX
3 MQX MQX

4 MQX

51

MQX MQX

MQX
MQX
RTOS MQX MQX
MQX
LCD

5.1

ColdFire V2 MCF52223[54]-[56]
RTOS MQX

5.1.1

MCU LCD
MCU LCD
/

1 1 4 6 /
1 1 4 1
14 14 1 USB
2LCD USB
3

52

MQX MQX

5.1.2

MCF52223 /
LCD USB 5-1

B
ZigBee

USB

RS232

LCD

MCF
52223

5-1

5.2 MQX
MQXColdFire V2 MCF52223
MQX 4-1 MQX
mqxbuildBSPPSP
[57]
1. BSP
MCF52223 MCF52235 ColdFire V2 MQX
MCF52235 MCF52235 BSP
2. BSPPSP
<MQX_install>\mqx\build\cwcf72 bsp_m52235evb.mcp
psp_m52235evb.mcp bsp_MCF52223.mcp psp_MCF52223.mcp
<MQX_install>\mqx\build\bat

bsp_m52235evb.bat

psp_m52235evb.bat bsp_MCF52223.bat psp_MCF52223.bat


<MQX_install>\mqx\source\bsp MCF52223
53

MQX MQX

<MQX_install>\mqx\source\bsp\m52235evb MCF52223
<MQX_install>\lib MCF52223.cw<MQX_
install>\lib\MCF52223.cw mqx
3.
bsp_ MCF52223.bat psp_ MCF52223.bat m52235evb
MCF52223
<MQX_install>\mqx\source\bsp\MCF52223\ m52235evb.h
MCF52223.h m52235evb
MCF52223
<MQX_install>\mqx\source\bsp\MCF52223\cw\dbg
m52235evb.cfg m52235evb.mem MCF52223.cfg MCF52223.mem
MCF52223.mem Flash MCF52223 Flash
<MQX_install>\mqx\source\bsp\MCF52223\cw\intflash.lcf
MCF52223 ROM Flash
<MQX_install>\mqx\source\bsp\MCF52223\.c.h
m52235evb MCF52223
4. PSP
codewarrior for Microcontroller V7.2 <MQX_install>\mqx\build\cwcf72\
psp_MCF52223.mcp
m52235evb user config MCF52223 user config user_config.h
<MQX_install>\config\MCF52223\user_config.h
Debug RegABI setting
1 Target Setting choose output Directory <MQX_install>
\lib\MCF52223.cw\mqx
2 Access Paths{Project}...\...\config\m52235evb add
<MQX_install>\config\MCF52223
3 BatchRunner P choose<MQX_install>\mqx\build\bat\
psp_MCF52223.bat
5. BSP
Codewarrior for Microcontroller V7.2 <MQX_install>\mqx\build\cwcf72\
54

MQX MQX

bsp_MCF52223.mcp
m52235evb user config MCF52223 user config user_config.h
<MQX_install>\config\MCF52223\user_config.h
m52235evb BSP Files MCF52223 BSP Files
add files<MQX_install>\mqx\source\bsp\<MQX_install>
.h .c
Debug RegABI setting
1 Target SettingAccess Paths BatchRunner P
MCF52223 PSP
2 Coldfire Target File Name m52235evb_regabi_d.a
MCF52223_regabi_d.a
6.

<MQX_install>\mqx\source\bsp\MCF52223\bsp_init.c MQX

5.3 LCD
MCU LCD

5.3.1 LCD
LCDDMT80600T080TFT
MAX232 MCU[58]
LCDMCU
0xAA 0xCC0x330xC30x3C
[59] 5-1
5-1

0xAA

(1 )

0xCC 0x33 0xC3 0x3C

LCD
1 18
LCD MCU 2 8
55

MQX MQX

3 9 LCD
LCD

5.3.2
4

PC
LCD

LCD

1.
5-2
MCU Flash

5-2

56

MQX MQX

2.
5-3

5-3

3.

5-4

5-4

57

MQX MQX

4.
5-5

LCD LCD

5-5

5.4
5.4.1
RTOS

[28]

I/O

[60]
LCD
LCD LCD
58

MQX MQX

USB Flash
5-6

5-6

PWM

I/O I/O PIT


I/O

UART LCD UART


LCD LCD
PC
LCD
LCD
MCU
5-7
LCD
59

MQX MQX

5-7 LCD

MCU LCD
5-8

5-8 LCD

USB MCU Flash

Flash MCU Flash


MCUMCU

60

MQX MQX

5.4.2
I/O

I/O

2
3
MQX

LCD
LCD LCD
io_LCD_int_install()io_LCD_int_open()io_LCD_int_close()
io_LCD_int_read()io_LCD_int_write()io_LCD_int_ioctl()io_LCD_int_isr()LCD ISR
LCD
ISR
typedef struct io_ lcd _init_struct
// LCD
{
_mqx_uint
QUEUE_SIZE;
///
uint_32
DEVICE;
//
uint_32
VECTOR;
//
_int_level
LEVEL;
//
}LCD_INT_STRUCT;
typedef struct io_ lcd _ info_struct
//
{
LCD_INT_STRUCT INIT;
//
pointer OLD_ISR_DATA;
//
void (_CODE_PTR_ OLD_ISR)(pointer);
} LCD_INFO_STRUCT;

61

MQX MQX

5.5
MQX

1
MQX

2 MQX MCF52223

3 LCD

4 RTOS
MQX

62

MQX


6.1
RTOS
RTOS
RTOS RTOSMQX
ROM API

RTOS

RTOS MQX
1 RTOS RTOS
MQX

2 MQX MQX
MQX

3MQXBootloader
MQXMQX
MQXMQX

4 MQX CodeWarrior CW
MQX
MQX
MQX
5 MQX MCF52223

LCD RTOS

63

MQX

6.2
RTOS MQX MQX
MQX

1 MQX TCP/IP
MQX MQX

2 MQX MQX

3 MQX
Zigbee MQX

64

MQX

[1] Wolf WMadsen JEmbedded systems education for the future[J]Proceedings of


the IEEE2000,88(1):23-30.
[2] [J]
2002,(6):6-9.
[3] VRTX32[J]
1992,5(4):7-14.
[4] [J]
2001,(3):12-17.
[5] [J]
2000,24(5):105-108.
[6] Mohamed Tag ElsirPatrick SebastianYap Vooi VoonA RTOS for Educational
Purposes[CA]International Conference on Intelligent and Advanced Systems
(ICIAS)2010:1-4.
[7] 2 [M]:
2011.
[8] Paul Parkinson Franco Gasperoni High-Integrity Systems Development for
Integrated Modular Avionics Using VxWorks and GNAT[C]Blieberger and
Strohmeier2002:163-178.
[9] Jean J.Labrosse C/OS-II( 2 )[M]
2003:88-91.
[10] Rick

Lehrbaum Using

Linux

in

Embeded

and

Real

time

Systems[J/OL]http://www.linuxdevices.com.
[11] P MantegazzaBianchi EDozio LPapacharalambous SRTAIReal-Time
Application Interface[J]Linux Journal Magazine2000,4:105-108.
[12] Cheng FeiMiao Ke-jianWang Rui-minAnalysis and real-time performance
tests of QNX and VxWorks[J] Computer Engineering and Design
2008,29(18):4734-4739.
65

MQX

[13] Anthony J Massa eCos [M]


2006.
[14] Dong YibingWang LangDesign of Embedded Cropland Data Acquisition and
Processing System Based On Xscale and WinCE[J]International Forum on
Information Technology and Applications2009,31(13):22-119.
[15] Sarah AllenVidal GrauperaLee LundriganPro Smartphone Cross-Platform
Development iPhoneBlackBerryWindows Mobileand Android Development
and Distribution[M]Paul Manning2010:35-50.
[16] Thomas BaduraMichael BecherTesting the Symbian OS Platform Security
Architecture[CA] Advanced Information Networking and Applications
2009:838-844.
[17] Anon ARC

international

precise/MQX[J] Penton

Publishing

Co

2002,50(12):90-94.
[18] MQX RTOS[DB/OL]http://en.wikipedia.org/wiki/MQX.
[19] Freescale MQX RTOS 3.0.1 Release Notes[DB/OL]http://www.freescale.com.
[20] Freescale MQX RTOS 3.4.0 Release Notes[DB/OL]http://www.freescale.com.
[21] Freescale MQX RTOS 3.6.2 Release Notes[DB/OL]http://www.freescale.com.
[22] Freescale

MQXTM

Real-Time

Operating

System

Users

Guide

[DB/OL]http://www.freescale.com.
[23] AnonPrecise/MQX RTOS Gets User-configurable[J]Cahner Publishing Co
2001,46(12):20-25.
[24] Freescale MQX RTCS Users Guide[DB/OL]http://www.freescale.com.
[25] PHDC USB [DB/OL]http://www.freescale.com.
[26] Gien M Micro-kernel Architecture Key to Modern Operating System
Design[EB/OL]http://www.chorus.com/documentation/ref.html.
[27] [J]
2001,21(1):113-115.
[28] RTOS [D]
2008.
[29] [J]
66

MQX

2000,19(8):13-15.
[30] [M]
2006:37-38.
[31] MQX RTOS Hands-On[DB/OL]http://www.freescale.com.
[32] Freescale MQX RTOS Reference Manual[DB/OL]http://www.freescale.com.
[33] Ren PengXiang ZhengA Multitask Scheduling Algorithm For Vxworks: Design
and Task Simulation[CA]International Conference on Artificial Intelligence and
Computational Intelligence2009,3:353-357.
[34] Linux 2.6 [D]
2008.
[35] RAM C/OS-II [D]2005.
[36] [J]
2002,24(4):38-40.
[37] Hands-On

Workshop:

Freescale

MQX

Drivers

and

BSPs[DB/OL].

http://www.freescale.com2010.
[38] Yan LiPing-Ping GuXian-Shan WangThe Implementation of Semaphore
Management In Hardware

Real-time Operating System[J] Information

Technology Journal2011,10(1):63-158.
[39] RTOS [D]
2007.
[40] Tao WangDaxin LiuAvoiding Unbounded Priority Inversion by Integrating Task
Inheritance

and

Classification

into

Preemption

Threshold

Scheduling[CA]ISSCAA2006: 593-596.
[41] Jaehong ShimKyunghee ChoiGihyun JungSeungkyu ParkHyeonSik Shin
Dongyoon Kim Priority inversion handling in microkernel-based Real-Time
Mike[CA]Real-Time Computing Systems and Applications1996:238-245.
[42] Shu Hong-xiaWang Ji-hongDesign and Implementation of Message Passing for
Distributed Real-time Operating System[J]Computer Engineering and Design
2008,29(9):2239-2245.
[43] Xiaofeng WanHailin HuXiaojun ZhouAnalysis and Design of Bootloader on
67

MQX

Embedded Electric Power Steering System[CA]ISECS International Colloquium


on

Computing,

Communication,

Control,

and

Management(CCCM)

2008,2:276-280.
[44] [D]
2009.
[45] Hessel FMarcon CSantos THigh Level RTOS Scheduler Modeling for A Fast
Design Validation[CA]IEEE Computer Society Annual Symposium on VLSI
2007:6-10.
[46] Linux [J]2004
30(20):81-83.
[47] Alessandro

Rubini Linux

Device

Drivers[M] Sebastopol CA

OReilly&AssociatesInc1998.
[48] Freescale MQXTM I/O Drivers Users Guide[DB/OL]http://www.freescale.com.
[49] Ji Chan MaengJong-Hyuk KimMinsoo RyuAn RTOS API Translator for
Model-driven Embedded Software Development[CA]12th IEEE International
Conference on Embedded and Real-Time Computing Systems and Applications
2006:363-367.
[50] How to Develop I/O Drivers for MQX[DB/OL]http://www.freescale.com.
[51] CodeWarrior

Development

Studio

for

ColdFire

Architectures

V7.2[DB/OL]http://www.freescale.com.
[52] 32 ColdFire [M]
2009.
[53] [D]
2007.
[54] ColdFire [M]
2006.
[55] MCF52223 Data Sheet Rev 2[DB/OL]http://www.freescale.com.
[56] MCF52223

ColdFire

Integrated

Microcontroller

Rev3[DB/OL]http://www.freescale.com.
[57] MQX BSP [DB/OL]http://www.freescaleic.org.
68

Reference

Manual

MQX

[58] DMT80600T080 [DB/OL]http://www.dwin.com.cn.


[59] DMT80600T080 [DB/OL]http://www.dwin.com.cn.
[60] [J]
2000,26(7):190-192.

69

MQX

[1] RFID
2011,28(3):44-46
[2]

[3]
2011 2
[4]
0171463
[5] 2

2011
[6] 2009

70

MQX

A MQX

71

MQX

72

MQX

73

You might also like