張建 王宜懷
?
基于ARM CortexTM-M4的MQX-RTOS啟動(dòng)流程剖析*
張建1,2王宜懷1,2
(1.蘇州大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 2.軟件新技術(shù)與產(chǎn)業(yè)化協(xié)同創(chuàng)新中心)
結(jié)合ARM Cortex-M4的地址映射、工程鏈接文件intflash.ld分析Kinetis MK60DN512ZVLQ10芯片的地址空間的分配情況,剖析芯片從加電復(fù)位跳轉(zhuǎn)到駐留在ROM開始地址的中斷向量表處執(zhí)行,依次完成系統(tǒng)堆棧指針、進(jìn)程堆棧指針、切換堆棧指針等設(shè)置,最后調(diào)用MQX初始化函數(shù)完成MQX-RTOS的啟動(dòng),在對(duì)啟動(dòng)過(guò)程的代碼進(jìn)行合理裁剪的基礎(chǔ)上,給出較詳細(xì)的注釋,為研究其他RTOS的啟動(dòng)提供一定的借鑒。
MQX系統(tǒng);RTOS;ARM Cortex-M4芯片;啟動(dòng)流程
MQX(message queue executive)是一種廣泛應(yīng)用于工業(yè)控制、醫(yī)療電子、家用電器等領(lǐng)域的嵌入式實(shí)時(shí)操作系統(tǒng)(embedded real time operation system,RTOS),相對(duì)其他的嵌入式實(shí)時(shí)操作系統(tǒng),其內(nèi)核精簡(jiǎn)、實(shí)時(shí)性較高,具有技術(shù)支持、開發(fā)工具成熟、外設(shè)驅(qū)動(dòng)豐富等特點(diǎn)而備受開發(fā)人員歡迎。RTOS的啟動(dòng)過(guò)程具有復(fù)雜性高和啟動(dòng)時(shí)間短的特點(diǎn),深入剖析MQX-RTOS的啟動(dòng)流程,對(duì)提高軟件開發(fā)、編寫高效的軟件代碼有很大的幫助[1]。
以蘇州大學(xué)飛思卡爾嵌入式實(shí)驗(yàn)中心發(fā)布的AMQXFW工程框架,結(jié)合ARM Cortex-M4的地址映射、工程鏈接文件intflash.ld分析Kinetis MK60DN512ZVLQ10芯片地址空間的分配情況[2]。剖析芯片從加電復(fù)位跳轉(zhuǎn)到駐留在ROM開始地址(地址為0x0000_0000)的中斷向量表處執(zhí)行,依次設(shè)置系統(tǒng)堆棧指針、進(jìn)程堆棧指針、切換堆棧指針、關(guān)看門狗、端口時(shí)鐘門控、系統(tǒng)時(shí)鐘、初始化全局變量,調(diào)用MQX初始化函數(shù)完成MQX-RTOS啟動(dòng)的復(fù)雜過(guò)程,對(duì)啟動(dòng)過(guò)程的代碼進(jìn)行合理的裁剪并給出剖析的注釋,可深入理解MQX-RTOS的啟動(dòng)過(guò)程[3]。
存儲(chǔ)器空間地址映像是芯片的“地圖”,規(guī)定了芯片上所有設(shè)備的地址范圍,不同芯片組的存儲(chǔ)器空間地址映像也不相同。ARM Cortex-M4的K60系列的存儲(chǔ)器空間地址映像對(duì)照如表1所示,MK60DN512ZVLQ10芯片沒(méi)有FlexNVM和FlexRAM,其存儲(chǔ)器空間地址映像對(duì)照如表2所示。
表1 K60系列芯片的存儲(chǔ)器空間地址映像
表2 MK60DN512ZVLQ10芯片的存儲(chǔ)器空間地址映像
ARM Cortex-M4的K60系列ROM地址范圍為0x0000_0000~0x0FFF_FFFF,共計(jì)256MB的ROM區(qū)域,該區(qū)域主要存放中斷向量表、操作系統(tǒng)代碼和常量等內(nèi)容。Kinetis MK60DN512ZVLQ10芯片只配置512 kB的Flash,其地址只使用了起始的512 kB地址空間,即0x0000_0000~0x0008_0000,該區(qū)域主要存放中斷向量表、Flash模塊配置信息、MQX-RTOS操作系統(tǒng)代碼和常量等內(nèi)容。K60系列的RAM地址范圍為0x1800_0000~0x200F_FFFF,共計(jì)129 MB的RAM區(qū)域,主要存放運(yùn)行時(shí)的中斷向量表、支持操作系統(tǒng)運(yùn)行的代碼、常變量、靜態(tài)變量、全局變量和堆棧等內(nèi)容。Kinetis MK60DN512ZVLQ10芯片只配置了128 kB的SRAM,其地址只使用了SRAM_L末尾的64 kB和SRAM_U起始的64 kB空間,地址范圍為0x1FFF_0000~0x0x2000_FFFF[4]。
Flash和SRAM存儲(chǔ)空間的分配,在AMQXFW工程的鏈接文件intflash.ld中定義如下:
MEMORY
{
/* 異常中斷向量表 */
vectorrom (RX): ORIGIN = 0x00000000, LENGTH = 0x00000400
/* Flash模塊配置 */
cfmprotrom (R): ORIGIN = 0x00000400, LENGTH = 0x00000020
/* 代碼和常量 */
rom (RX): ORIGIN = 0x00000420, LENGTH = 0x0007FBE0
/* SRAM */
ram (RW): ORIGIN = 0x1FFF0000, LENGTH = 0x00020000
/* 內(nèi)核數(shù)據(jù)區(qū)結(jié)束處 */
end_of_kd (RW): ORIGIN = 0x2000FFF0, LENGTH = 0x00000000
/* 啟動(dòng)堆棧 */
bstack (RW): ORIGIN = 0x2000FA00, LENGTH = 0x00000200
/* 啟動(dòng)堆棧結(jié)束處 */
end_bstack (RW): ORIGIN = 0x2000FC00, LENGTH = 0x00000000
}
由intflash.ld文件的定義,MK60DN512ZVLQ10的ROM、RAM的地址映射分別如圖1和圖2所示;512 kB的ROM主要分為1 kB的中斷向量表+32 B的Flash配置+(511 kB-32 B)的代碼和常量區(qū),其中1 kB的中斷向量共包含256個(gè)中斷項(xiàng),每個(gè)中斷占4個(gè)字節(jié)[5]。
圖1 MK60DN512ZVLQ10 ROM地址空間映射
圖2 MK60DN512ZVLQ10 RAM地址空間映射
128 kB的RAM由編譯器根據(jù)MQX系統(tǒng)預(yù)定義的常量進(jìn)行有條件地編譯使用。一般來(lái)說(shuō),RAM主要有中斷向量表、數(shù)據(jù)段、BSS段和內(nèi)核數(shù)據(jù)等,其中內(nèi)核數(shù)據(jù)區(qū)約從0x1FFF_0330開始,到0x2000_ FFFF結(jié)束,約為127 kB,不同的工程編譯出來(lái)的內(nèi)核數(shù)據(jù)區(qū)大小也不盡相同。
MK60DN512ZVLQ10芯片的啟動(dòng)可分為芯片啟動(dòng)和MQX-RTOS系統(tǒng)啟動(dòng)2個(gè)階段,啟動(dòng)流程如圖3所示。
MK60DN512ZVLQ10芯片加電復(fù)位跳轉(zhuǎn)到駐留在ROM開始地址的中斷向量表處執(zhí)行,依次設(shè)置系統(tǒng)堆棧指針、進(jìn)程堆棧指針、切換堆棧指針、關(guān)看門狗、端口時(shí)鐘門控、系統(tǒng)時(shí)鐘、初始化全局變量[6]。
圖3 MQX-RTOS啟動(dòng)流程
2.1引導(dǎo)
芯片上電,ARM Cortex-M4處理器架構(gòu)的芯片將寄存器清0,同時(shí)自動(dòng)執(zhí)行0x0000_0000地址處的指令。對(duì)存儲(chǔ)映射區(qū)域進(jìn)行解析,位于0x0000_0000為ROM區(qū)域的中斷向量表內(nèi)容。引導(dǎo)程序從中斷向量表中取第一個(gè)表項(xiàng)(地址為:0x0000_0000)的內(nèi)容作為系統(tǒng)棧指針,即主堆棧指針(main stack pointer,MSP);從中斷向量表中取第二個(gè)表項(xiàng)(地址為:0x0000_0004)的內(nèi)容作為系統(tǒng)啟動(dòng)函數(shù)的地址,并放入程序計(jì)數(shù)器(Program Counter,PC)中,接著進(jìn)入執(zhí)行PC指向處的指令,進(jìn)入__boot函數(shù)的執(zhí)行。ROM起始的1 kB放置的256個(gè)中斷,每個(gè)中斷占4個(gè)字節(jié),以下代碼為前2個(gè)中斷[7]。
/* 第1個(gè)中斷項(xiàng)
* 中斷系統(tǒng)棧指針,值在intflash.ld文件中定義,其值和end_bstack相同
* end_bstack=0x2000_FC00*/
(vector_entry)__BOOT_STACK_ADDRESS,
/* 第2個(gè)中斷項(xiàng)
* 啟動(dòng)函數(shù)指針宏定義為__boot
* __boot為boot.s中的標(biāo)號(hào) */
BOOT_START,
...
2.2__boot啟動(dòng)
__boot啟動(dòng)代碼在boot.s文件中,采用匯編語(yǔ)言編寫加快啟動(dòng)速度。__boot主要設(shè)置了啟動(dòng)過(guò)程中禁中斷、切換堆棧,并跳轉(zhuǎn)到startup.c的__thumb_startup處運(yùn)行。__boot代碼如下。
__boot:
// 禁中斷清除掛起標(biāo)志
ldr r0, =NVIC_ICER0
ldr r1, =NVIC_ICPR0
ldr r2, =0xFFFFFFFF
mov r3, #8
// 循環(huán)設(shè)置8個(gè)禁中斷清除掛起標(biāo)志寄存器
_boot_loop:
cbz r3, _boot_loop_end
str r2, [r0], #4 /* NVIC_ICERx - 清除IRQ使能 */
str r2, [r1], #4 /* NVIC_ICPRx - 清除掛起IRQ標(biāo)志 */
sub r3, r3, #1
b _boot_loop
_boot_loop_end:
// 用主堆棧指針值設(shè)置進(jìn)程堆棧指針的值
mrs r0, MSP
msr PSP, r0
// 切換到PSP CONTROL[1]為1使用PSP 為0使用MSP
mrs r0, CONTROL
orr r0, r0, #2
msr CONTROL, r0
isb #15
// 跳轉(zhuǎn)到startup.c的__thumb_startup處執(zhí)行
.extern __thumb_startup
b __thumb_startup
2.3__thumb_startup函數(shù)
__thumb_startup函數(shù)在startup.c文件中,主要完成看門狗、端口時(shí)鐘門控、系統(tǒng)時(shí)鐘等設(shè)置,初始化全局變量,調(diào)用main函數(shù),進(jìn)入main函數(shù)運(yùn)行。__thumb_startup函數(shù)代碼如下:
//設(shè)置看門狗
wdog_disable1();
//設(shè)置端口時(shí)鐘門控
gpio_io_init();
//初始化全局變量
zero_fill_bss();
//拷貝ROM至RAM,本文件中SUPPORT_ROM_TO_RAM定義為1
#if SUPPORT_ROM_TO_RAM
if (__S_romp != 0L)/* __S_romp 在intflash.ld中定義 */
__copy_rom_sections_to_ram();
#endif
//設(shè)置系統(tǒng)時(shí)鐘
SystemClockSetup(ClockSource_EX50M,CoreClock_96M);
//進(jìn)入主程序Main
exit(main(0, argv));
MQX-RTOS系統(tǒng)啟動(dòng)階段主要是通過(guò)main函數(shù)調(diào)用_mqx函數(shù)完成MQX-RTOS系統(tǒng)的啟動(dòng)。
3.1 main函數(shù)
main函數(shù)在main.c文件中,主要根據(jù)定義的MQX初始化常量調(diào)用_mqx函數(shù)完成MQX-RTOS系統(tǒng)的啟動(dòng)。main函數(shù)代碼如下:
//MQX初始化結(jié)構(gòu)體常量MQX_init_struct,在mqx_init.c文件中賦值
extern const MQX_INITIALIZATION_STRUCT MQX_init_struct;
//調(diào)用_mqx,啟動(dòng)MQX-RTOS系統(tǒng)
_mqx( (MQX_INITIALIZATION_STRUCT_PTR) &MQX_init_struct );[8]
3.2_mqx函數(shù)
_mqx函數(shù)主要完成MQX-RTOS系統(tǒng)的啟動(dòng),具體步驟如下:
1) 初始化內(nèi)核數(shù)據(jù)區(qū)
內(nèi)核數(shù)據(jù)區(qū)是負(fù)責(zé)記錄MQX系統(tǒng)運(yùn)行狀態(tài)及資源使用情況的存儲(chǔ)區(qū),在開始正常工作之前,要為內(nèi)核數(shù)據(jù)區(qū)指定合適的初始值。
初始化內(nèi)核數(shù)據(jù)區(qū)依次執(zhí)行:創(chuàng)建內(nèi)核數(shù)據(jù)區(qū)訪問(wèn)指針→填充內(nèi)核數(shù)據(jù)區(qū)→啟動(dòng)對(duì)中斷的支持→創(chuàng)建系統(tǒng)空閑任務(wù)?!鷦?chuàng)建就緒任務(wù)隊(duì)列數(shù)組→創(chuàng)建任務(wù)操作信號(hào)量。
2) 初始化外設(shè)
MQX操作系統(tǒng)的運(yùn)行需要硬件平臺(tái)的支持,因此在系統(tǒng)啟動(dòng)過(guò)程中,需對(duì)硬件平臺(tái)進(jìn)行初始化設(shè)定。
初始化外設(shè)依次執(zhí)行:初始化MQX中斷系統(tǒng)→初始化系統(tǒng)時(shí)間滴答→初始化IO子系統(tǒng)。
3) 調(diào)度系統(tǒng)初始化與啟動(dòng)
啟動(dòng)調(diào)度系統(tǒng)是MQX啟動(dòng)過(guò)程的最后一個(gè)環(huán)節(jié),成功啟動(dòng)調(diào)度系統(tǒng)后,整個(gè)系統(tǒng)中包含的應(yīng)用任務(wù)將在調(diào)度系統(tǒng)的管理下有序地運(yùn)行。
調(diào)度系統(tǒng)初始化與啟動(dòng)依次執(zhí)行:設(shè)置缺省使用的時(shí)間片→創(chuàng)建并啟動(dòng)空閑任務(wù)→創(chuàng)建自啟動(dòng)應(yīng)用任務(wù)→啟動(dòng)調(diào)度系統(tǒng)。
啟動(dòng)調(diào)度系統(tǒng)成功后,標(biāo)志著RTOS系統(tǒng)成功啟動(dòng),用戶開發(fā)的程序可通過(guò)調(diào)度系統(tǒng)來(lái)運(yùn)行。
MQX-RTOS系統(tǒng)啟動(dòng)過(guò)程包括芯片啟動(dòng)和MQX系統(tǒng)啟動(dòng)2個(gè)階段。MQX-RTOS系統(tǒng)成功啟動(dòng)調(diào)度系統(tǒng)后,由調(diào)度系統(tǒng)合理有序地調(diào)度各個(gè)任務(wù)、中斷運(yùn)行。本文主要結(jié)合蘇州大學(xué)飛思卡爾嵌入式實(shí)驗(yàn)中心發(fā)布的AMQXFW工程框架進(jìn)行深入剖析,對(duì)主要的啟動(dòng)代碼進(jìn)行分析,為從事RTOS系統(tǒng)的啟動(dòng)研究提供了研究基礎(chǔ),同時(shí)為基于MQX系統(tǒng)應(yīng)用程序開發(fā)提供一定的借鑒。
[1] 王宜懷,朱仕浪,姚望舒.嵌入式實(shí)時(shí)操作系統(tǒng)MQX應(yīng)用開發(fā)技術(shù)—ARM Cortex-M微處理器[M].北京:電子工業(yè)出版社,2014.
[2] 朱仕浪,王宜懷,馮德旺.MQX實(shí)時(shí)操作系統(tǒng)構(gòu)件化工程框架研究[J].武漢理工大學(xué)學(xué)報(bào),2013,35(10):135-140.
[3] 蔣建武,王宜懷.基于ARM Cortex-M4的MQX中斷機(jī)制深度剖析[J].電子技術(shù)與軟件工程,2014(22):214-217,233.
[4] Freescale. MQX User Guide Rev.12[M]. 2014.
[5] 王宜懷,吳瑾,蔣銀珍.嵌入式系統(tǒng)原理與實(shí)踐——ARM Cortex-M4 Kinetis微控制器[M].北京:電子工業(yè)出版社, 2012.3.
[6] Freescale.K60 Sub-Family Reference Manual Rev.6[M]. 2011.
[7] Freescale. Freescale MQX RTOS Reference Manual Rev.16 [M]. 2014.
[8] Freescale. Cortex-MTM System Design Kit Technical Reference Manual Revision r0p0[M]. 2011.
[9] Giovani Gracioli, Sebastian Fischmeister. Tracing and recording interrupts in embedded software[J]. Journal of Systems Architecture,2012,58(9): 372-385.
[10] 董榮勝,古天龍.計(jì)算機(jī)科學(xué)與技術(shù)方法論[M].北京:人民郵電出版社,2002.
[11] Enkhbaatar Tumenjargal, Luubaatar Badarch, Hyeokjae Kwon, et al. Embedded software and hardware implementation system for a human machine interface based on ISOAgLib[J]. Journal of Zhejiang University-Science C (Computers & Electronics), 2013,14(3):155-166.
The Analysis of Starting Process of MQX-RTOS Based on ARM CortexTM-M4
Zhang Jian1,2Wang Yihuai1,2
(1.School of Computer Science & Technology, Soochow University, Suzhou 2.Collaborative Innovation Center of Novel Software Technology and Industrialization)
Based on ARM Cortex-M4’s address mapping and the project link file “intflash.ld”, this paper analyzes the address space distribution statement of Kinetis MK60DN512ZVLQ10 chip, and the starting process of the chip, which first jumps to the interrupt vector table at the beginning of the ROM address after power on reset, and then sets the system stack pointer, process stack pointer, switches stack pointer, and finally calls the MQX initialization function to complete the MQX-RTOS starting process. In the basis of reasonable tailoring the start-up code, this paper gives more detailed annotations, which provide certain reference for the further study of other RTOS.
MQX System; RTOS; ARM Cortex-M4 Chip; Booting Process
張建,男,1980年生,講師/碩士,主要研究方向:MIS系統(tǒng)開發(fā)、嵌入式系統(tǒng)應(yīng)用。E-mail: zhangjian2012@suda.edu.cn
王宜懷(通信作者),男,1962年生,教授/博士、博導(dǎo),主要研究方向:嵌入式系統(tǒng)、傳感網(wǎng)與智能控制技術(shù)。E-mail: Yihuaiw@suda.edu.cn
國(guó)家自然科學(xué)基金資助項(xiàng)目(61070169:無(wú)線網(wǎng)傳感器網(wǎng)絡(luò)中緊急事件信息發(fā)布的可靠性研究)