汪成義
(湖北經(jīng)濟(jì)學(xué)院信息工程學(xué)院,武漢430205)
基于MDK和μC/OS-III的開(kāi)發(fā)過(guò)程存儲(chǔ)空間優(yōu)化
汪成義
(湖北經(jīng)濟(jì)學(xué)院信息工程學(xué)院,武漢430205)
為了降低成本,充分挖掘低端Cortex-M處理器的潛在能力,需要突破其存儲(chǔ)器空間不足的限制。通過(guò)分析問(wèn)題與優(yōu)化測(cè)試得知,如果能合理利用開(kāi)發(fā)工具M(jìn)DK提供的微代碼庫(kù)、交叉模塊優(yōu)化、分級(jí)優(yōu)化等優(yōu)化手段,可以大大提升存儲(chǔ)器空間的有效利用率。與此同時(shí),基于實(shí)時(shí)操作系統(tǒng)μC/OS-III的應(yīng)用系統(tǒng)可以根據(jù)需要進(jìn)行一系列裁減、優(yōu)化。測(cè)試結(jié)果表明,其優(yōu)化效果明顯。
MDK;μC/OS-III;Cortex-M;存儲(chǔ)器
MDK是ARM公司微控制器開(kāi)發(fā)工具(Microcontroller Development Kit)的簡(jiǎn)稱(chēng),其核心是集項(xiàng)目管理、源碼編輯、系統(tǒng)調(diào)試、外圍電路仿真于一身的集成開(kāi)發(fā)環(huán)境μVision[1],以及針對(duì)不同硬件平臺(tái)的編譯鏈接工具。實(shí)時(shí)操作系統(tǒng)μC/OS-III最典型的應(yīng)用平臺(tái)是基于ARM公司不同架構(gòu)的Cortex-M系列處理器,Cortex-M主要應(yīng)用于對(duì)成本以及功耗較為敏感的微控制器或終端設(shè)備,其產(chǎn)品從低端到高端又分為Cortex-M0、Cortex-M0+、Cortex-M1、Cortex-M3、Cortex-M4到Cortex-M7等子系列,不同芯片公司的子系列往往又有多個(gè)型號(hào)的處理器。在激烈的市場(chǎng)競(jìng)爭(zhēng)中,到底是為滿足越來(lái)越復(fù)雜的應(yīng)用而選擇高配置處理器,還是為降低成本而選擇較低配置的處理器,一直是個(gè)令人糾結(jié)的問(wèn)題,而當(dāng)應(yīng)用系統(tǒng)中引入實(shí)時(shí)操作系統(tǒng)后(如μC/OS-III),片內(nèi)存儲(chǔ)器空間消耗增大,空間問(wèn)題成為型號(hào)應(yīng)用限制的關(guān)鍵問(wèn)題之一。本文主要以低成本的中低端配置處理器為研究對(duì)象,分析在μC/OS-III應(yīng)用開(kāi)發(fā)過(guò)程中可能會(huì)遇到的存儲(chǔ)器空間不足的問(wèn)題及不同環(huán)節(jié)的解決辦法。
在產(chǎn)品開(kāi)發(fā)過(guò)程中,為了實(shí)現(xiàn)產(chǎn)品的功能需要提供足夠的程序存儲(chǔ)空間和運(yùn)行空間,還要為產(chǎn)品的功能擴(kuò)展、軟件升級(jí)與維護(hù)預(yù)留一定的空間。對(duì)中低端處理器來(lái)說(shuō),成本降低了,但存儲(chǔ)器空間可能面臨不足,表現(xiàn)如下:
(1)處理器存儲(chǔ)空間自身不足
對(duì)于低端Cortex-M處理器,存儲(chǔ)空間在32 KB的Flash存儲(chǔ)器/8 KB的SDRAM存儲(chǔ)器以下,對(duì)于中端Cortex-M處理器,存儲(chǔ)空間在256 KB的Flash存儲(chǔ)器/ 64 KB的SDRAM存儲(chǔ)器以下。Micrium公司在其網(wǎng)站已提供了針對(duì)十幾家微控制器廠商不同型號(hào)芯片的μC/ OS-III版本,其一般要求128 KB的Flash存儲(chǔ)器/32 KB 的SDRAM存儲(chǔ)器或以上,個(gè)別型號(hào)的配置為64 KB的Flash存儲(chǔ)器/16 KB的SDRAM存儲(chǔ)器。在實(shí)際應(yīng)用中,若用戶任務(wù)較多,并且有圖形用戶界面、網(wǎng)絡(luò)協(xié)議、數(shù)據(jù)庫(kù)等,如果不作優(yōu)化處理,空間要求會(huì)快速提高,則要求256 KB的Flash存儲(chǔ)器/64 KB的SDRAM存儲(chǔ)器或以上,若如此,沒(méi)有成本優(yōu)勢(shì),且功能擴(kuò)展也會(huì)受限。
(2)不合理消耗導(dǎo)致的空間不足
在基于ARM公司的MDK開(kāi)發(fā)工具進(jìn)行應(yīng)用開(kāi)發(fā)的過(guò)程中,若不充分利用MDK對(duì)ARM處理器優(yōu)化,或利用的不恰當(dāng),會(huì)導(dǎo)致空間的不必要消耗。基于μC/OS-III的應(yīng)用系統(tǒng)設(shè)置不合理或變量定義不恰當(dāng),也會(huì)引起不必要的空間消耗。當(dāng)處理器型號(hào)選定之后,μC/OS-III應(yīng)用開(kāi)發(fā)空間問(wèn)題的解決主要依賴開(kāi)發(fā)工具參數(shù)的合理設(shè)置和軟件自身空間消耗安排的合理化,下面就此展開(kāi)分析。
2.1 存儲(chǔ)器空間占用信息
考慮到空間分布與硬件平臺(tái)緊密相關(guān),下面就以NXP公司基于Cortex-M3的LPC1347微控制器為分析對(duì)象,其片內(nèi)有64 KB的Flash存儲(chǔ)器,8 KB(IRAM0)+2 KB(IRAM1)+2 KB(USB IRAM)即共計(jì)16 KB的RAM存儲(chǔ)器[2],并設(shè)定μC/OS-III的優(yōu)先級(jí)數(shù)為64個(gè),建立2個(gè)系統(tǒng)任務(wù)和2個(gè)用戶任務(wù)的最基本應(yīng)用情形,以此作為下面分析空間變化情況的參考基準(zhǔn)。測(cè)試時(shí),所用工具鏈?zhǔn)荕DK-ARM Standard Version 5.11.0.0版本,對(duì)應(yīng)Arm Link的版本是V5.04.0.49。構(gòu)造對(duì)象(指編譯并鏈接)后輸出信息為“Program Size:Code=34820-RO data= 1748 RW-data=216 ZI-data=8964”,查看對(duì)應(yīng)生成的map文件,發(fā)現(xiàn)含有涉及空間的詳細(xì)信息,最后三行信息如圖1所示。

圖1 map文件中的存儲(chǔ)器空間信息
圖中信息說(shuō)明,該工程所生成的應(yīng)用系統(tǒng)占用RAM的大小為9 180字節(jié)(即8.96 KB),是RW數(shù)據(jù)和ZI數(shù)據(jù)兩項(xiàng)之和,占用ROM大小為36 784字節(jié)(即35.92 KB),是Code、RO數(shù)據(jù)和RW數(shù)據(jù)三項(xiàng)之和。其中,Code為代碼大小,RO數(shù)據(jù)為常數(shù)大小,RW數(shù)據(jù)為已初始化為非零的全局變量大小,ZI數(shù)據(jù)為未初始化或初始化為零的變量大小。
2.2 映像的加載與執(zhí)行視圖
為便于理解,結(jié)合LPC1347的存儲(chǔ)器結(jié)構(gòu)和Arm-Link對(duì)存儲(chǔ)器映像的分布規(guī)律,將圖1中信息進(jìn)一步總結(jié)為如圖2所示映像分布。
其中,加載視圖是根據(jù)映像執(zhí)行之前加載到存儲(chǔ)器的地址,描述映像的區(qū)或節(jié)的組成情況;執(zhí)行視圖則是根據(jù)映像執(zhí)行時(shí)的地址,描述映像的區(qū)或節(jié)的組成情況[3]。由圖2可知,程序執(zhí)行前需占用ROM空間大小由RW節(jié) (或區(qū),下同)和RO節(jié)(含Code和RO數(shù)據(jù))組成,程序執(zhí)行時(shí),需將ROM中的RW節(jié)映射到RAM的RW節(jié),因?yàn)榇鎯?chǔ)空間不夠,初始化為0的全局變量一部分內(nèi)容映射到起始地址為0x1000 0000的IRAM0 中,一部分內(nèi)容映射到起始地址為0x2000 0000的IRAM1中。由此可知,減少Code和RO數(shù)據(jù)的空間占用,只對(duì)ROM有利,減少ZI的空間占用,只對(duì)RAM有利,而減少RW的空間占用,對(duì)ROM和RAM都有利。

圖2 存儲(chǔ)器映像分布情況
作為ARM公司提供的開(kāi)發(fā)工具,MDK對(duì)ARM架構(gòu)處理器提供了針對(duì)性很強(qiáng)的優(yōu)化選擇和細(xì)節(jié)參數(shù)設(shè)置選項(xiàng),與存儲(chǔ)器空間優(yōu)化緊密相關(guān)的主要包括3個(gè)方面的優(yōu)化選項(xiàng)。
3.1 微代碼庫(kù)
MDK針對(duì)ARM架構(gòu)處理器提供了一套可代替標(biāo)準(zhǔn)庫(kù)的微縮型的運(yùn)行庫(kù)Micro LIB,它去掉了一些不必要的庫(kù)函數(shù),如time()等,同時(shí)也因改造而讓部分庫(kù)函數(shù)運(yùn)行起來(lái)更慢,如memcpy()等[4],但能顯著減少應(yīng)用系統(tǒng)對(duì)Flash存儲(chǔ)器和SDRAM存儲(chǔ)器空間的占用。
3.2 交叉模塊優(yōu)化
MDK的交叉模塊優(yōu)化主要是通過(guò)二次編譯的方法,去除未使用的函數(shù),從而減少應(yīng)用系統(tǒng)對(duì)Flash存儲(chǔ)器空間的占用。
3.3 C/C++分級(jí)優(yōu)化
MDK針對(duì)C/C++的應(yīng)用開(kāi)發(fā)提供了4級(jí)優(yōu)化選擇,其關(guān)鍵是在調(diào)試信息的詳細(xì)程度與系統(tǒng)性能之間進(jìn)行不同的選擇。具體見(jiàn)表1。

表1 C/C++分級(jí)優(yōu)化選項(xiàng)
在工程文檔不變,通過(guò)修改編譯參數(shù)選項(xiàng)的設(shè)置,形成不同組合,并逐一在編譯通過(guò)并能正常調(diào)試情況下記錄測(cè)試數(shù)據(jù),測(cè)試結(jié)果如表2所列。其中,打鉤表示被選中,存儲(chǔ)器空間大小的單位是字節(jié)。
表2中數(shù)據(jù)表明,空間優(yōu)化程度最高的是微代碼庫(kù)、交叉模塊優(yōu)化加C/C++的O2優(yōu)化級(jí)的組合選項(xiàng)。結(jié)合表1,想要獲得良好的調(diào)試感受,又要有好的空間優(yōu)化率,微代碼庫(kù)、交叉模塊優(yōu)化加O0優(yōu)化級(jí)的組合選項(xiàng),以及微代碼庫(kù)、交叉模塊優(yōu)化加O1優(yōu)化級(jí)的組合選項(xiàng),則更具有優(yōu)勢(shì),并在實(shí)踐中得到驗(yàn)證。

表2 編譯參數(shù)對(duì)工程空間優(yōu)化的影響
為了支持不同任務(wù)間的調(diào)度,高效地實(shí)現(xiàn)應(yīng)用系統(tǒng)功能,μC/OS-III提供了包括信號(hào)量、互斥信號(hào)量、消息隊(duì)列、事件標(biāo)志組、軟件定時(shí)器、內(nèi)存分區(qū)等內(nèi)核對(duì)象。對(duì)一個(gè)實(shí)際的應(yīng)用系統(tǒng)來(lái)說(shuō),一旦功能、性能要求確定,設(shè)計(jì)方案明確,其所需的操作系統(tǒng)內(nèi)核對(duì)象就可以確定,從而可對(duì)不需要的內(nèi)核對(duì)象進(jìn)行裁減,即可有效降低對(duì)代碼空間和內(nèi)存空間的要求。裁減方法主要是在os_cpu.h文件中針對(duì)相應(yīng)的內(nèi)核對(duì)象進(jìn)行去使能處理,即將全部對(duì)應(yīng)項(xiàng)的預(yù)定義值由1u改為0u即可[5]。
4.1 任務(wù)空間合理優(yōu)化
由于μC/OS-III在系統(tǒng)初始化時(shí),會(huì)進(jìn)行一定的空間預(yù)分配,可通過(guò)應(yīng)用需要評(píng)估可能的優(yōu)先級(jí)需求數(shù),適當(dāng)加以余量,確定最大優(yōu)先級(jí)數(shù),并修改os_cpu.h文件中OS_CFG_PRIO_MAX的預(yù)定義值(如由缺省的64u改為16u等),從而改變系統(tǒng)內(nèi)核中OSPrioTbl[i]、OSRdy List[i]等所占用空間的大小。在μC/OS-III中,在創(chuàng)建每個(gè)任務(wù)時(shí),需單獨(dú)指定任務(wù)控制塊,且每個(gè)任務(wù)都有獨(dú)立的堆棧,其大小可單獨(dú)設(shè)定,并在任務(wù)生存期始終占據(jù)著內(nèi)存空間,其優(yōu)化方法是,借助所統(tǒng)計(jì)的對(duì)應(yīng)任務(wù)堆棧的使用情況,結(jié)合限值和預(yù)留余量(如30%),為每個(gè)任務(wù)確定合理的堆棧大小。
4.2 優(yōu)化分析
為了方便對(duì)比,所有測(cè)試均不加編譯優(yōu)化選項(xiàng),測(cè)試結(jié)果如表3所列。表中信息表明,通過(guò)裁減不必要的內(nèi)核對(duì)象,可有效減少系統(tǒng)對(duì)ROM和RAM的要求;調(diào)整優(yōu)先級(jí)數(shù)和改變堆棧大小,對(duì)ROM沒(méi)影響,但對(duì)RAM有明顯影響;由于const數(shù)組是放在RO數(shù)據(jù)區(qū)中,static和不修飾數(shù)組是放在RW數(shù)據(jù)區(qū)中,如果不必要,一些大的常量數(shù)組需加const修飾,以減少對(duì)RAM的要求。

表3 μC/OS-III自身空間優(yōu)化測(cè)試
本文針對(duì)MDK開(kāi)發(fā)工具鏈,將實(shí)時(shí)操作系統(tǒng)μC/OS -III移植到中低端配置的Cortex-M系列處理器,在進(jìn)行后續(xù)應(yīng)用開(kāi)發(fā)時(shí),對(duì)遇到的存儲(chǔ)器空間不足的問(wèn)題尋求解決辦法。實(shí)驗(yàn)表明,綜合利用開(kāi)發(fā)工具及應(yīng)用系統(tǒng)的不同優(yōu)化方法,并在開(kāi)發(fā)的不同階段靈活運(yùn)用,效果會(huì)更好。文中所述問(wèn)題和解決辦法對(duì)沒(méi)有用到μC/OS-III的其他應(yīng)用開(kāi)發(fā)過(guò)程具有同樣的參考意義。
25
Memory Optimization in Development Process Based on MDK andμC/OS-III
Wang Chengyi
(College of Information Engineering,Hubei University of Economics,Wuhan 430205,China)
In order to reduce the cost and fully exploit the potential capability of the low end Cortex-M processor,it is necessary to break through the limitation of its memory space.Through the analysis of the problem and the optimized testing,if the microLIB,cross-module optimization,optimization levels can be used reasonably that are provided by MDK,the effective use of memory space can be greatly enhanced.At the same time,the application system based onμC/OS-III will carry out a series of cutting and optimization according to the needs.The test results show that the optimization effect is obvious.
MDK;μC/OS-III;Cortex-M;memory
TP316
A