汪成義
(湖北經(jīng)濟(jì)學(xué)院信息工程學(xué)院,武漢430205)
基于MDK和μC/OS-III的開發(fā)過程存儲空間優(yōu)化
汪成義
(湖北經(jīng)濟(jì)學(xué)院信息工程學(xué)院,武漢430205)
為了降低成本,充分挖掘低端Cortex-M處理器的潛在能力,需要突破其存儲器空間不足的限制。通過分析問題與優(yōu)化測試得知,如果能合理利用開發(fā)工具M(jìn)DK提供的微代碼庫、交叉模塊優(yōu)化、分級優(yōu)化等優(yōu)化手段,可以大大提升存儲器空間的有效利用率。與此同時(shí),基于實(shí)時(shí)操作系統(tǒng)μC/OS-III的應(yīng)用系統(tǒng)可以根據(jù)需要進(jìn)行一系列裁減、優(yōu)化。測試結(jié)果表明,其優(yōu)化效果明顯。
MDK;μC/OS-III;Cortex-M;存儲器
MDK是ARM公司微控制器開發(fā)工具(Microcontroller Development Kit)的簡稱,其核心是集項(xiàng)目管理、源碼編輯、系統(tǒng)調(diào)試、外圍電路仿真于一身的集成開發(fā)環(huán)境μVision[1],以及針對不同硬件平臺的編譯鏈接工具。實(shí)時(shí)操作系統(tǒng)μC/OS-III最典型的應(yīng)用平臺是基于ARM公司不同架構(gòu)的Cortex-M系列處理器,Cortex-M主要應(yīng)用于對成本以及功耗較為敏感的微控制器或終端設(shè)備,其產(chǎn)品從低端到高端又分為Cortex-M0、Cortex-M0+、Cortex-M1、Cortex-M3、Cortex-M4到Cortex-M7等子系列,不同芯片公司的子系列往往又有多個(gè)型號的處理器。在激烈的市場競爭中,到底是為滿足越來越復(fù)雜的應(yīng)用而選擇高配置處理器,還是為降低成本而選擇較低配置的處理器,一直是個(gè)令人糾結(jié)的問題,而當(dāng)應(yīng)用系統(tǒng)中引入實(shí)時(shí)操作系統(tǒng)后(如μC/OS-III),片內(nèi)存儲器空間消耗增大,空間問題成為型號應(yīng)用限制的關(guān)鍵問題之一。本文主要以低成本的中低端配置處理器為研究對象,分析在μC/OS-III應(yīng)用開發(fā)過程中可能會遇到的存儲器空間不足的問題及不同環(huán)節(jié)的解決辦法。
在產(chǎn)品開發(fā)過程中,為了實(shí)現(xiàn)產(chǎn)品的功能需要提供足夠的程序存儲空間和運(yùn)行空間,還要為產(chǎn)品的功能擴(kuò)展、軟件升級與維護(hù)預(yù)留一定的空間。對中低端處理器來說,成本降低了,但存儲器空間可能面臨不足,表現(xiàn)如下:
(1)處理器存儲空間自身不足
對于低端Cortex-M處理器,存儲空間在32 KB的Flash存儲器/8 KB的SDRAM存儲器以下,對于中端Cortex-M處理器,存儲空間在256 KB的Flash存儲器/ 64 KB的SDRAM存儲器以下。Micrium公司在其網(wǎng)站已提供了針對十幾家微控制器廠商不同型號芯片的μC/ OS-III版本,其一般要求128 KB的Flash存儲器/32 KB 的SDRAM存儲器或以上,個(gè)別型號的配置為64 KB的Flash存儲器/16 KB的SDRAM存儲器。在實(shí)際應(yīng)用中,若用戶任務(wù)較多,并且有圖形用戶界面、網(wǎng)絡(luò)協(xié)議、數(shù)據(jù)庫等,如果不作優(yōu)化處理,空間要求會快速提高,則要求256 KB的Flash存儲器/64 KB的SDRAM存儲器或以上,若如此,沒有成本優(yōu)勢,且功能擴(kuò)展也會受限。
(2)不合理消耗導(dǎo)致的空間不足
在基于ARM公司的MDK開發(fā)工具進(jìn)行應(yīng)用開發(fā)的過程中,若不充分利用MDK對ARM處理器優(yōu)化,或利用的不恰當(dāng),會導(dǎo)致空間的不必要消耗?;讦藽/OS-III的應(yīng)用系統(tǒng)設(shè)置不合理或變量定義不恰當(dāng),也會引起不必要的空間消耗。當(dāng)處理器型號選定之后,μC/OS-III應(yīng)用開發(fā)空間問題的解決主要依賴開發(fā)工具參數(shù)的合理設(shè)置和軟件自身空間消耗安排的合理化,下面就此展開分析。
2.1 存儲器空間占用信息
考慮到空間分布與硬件平臺緊密相關(guān),下面就以NXP公司基于Cortex-M3的LPC1347微控制器為分析對象,其片內(nèi)有64 KB的Flash存儲器,8 KB(IRAM0)+2 KB(IRAM1)+2 KB(USB IRAM)即共計(jì)16 KB的RAM存儲器[2],并設(shè)定μC/OS-III的優(yōu)先級數(shù)為64個(gè),建立2個(gè)系統(tǒng)任務(wù)和2個(gè)用戶任務(wù)的最基本應(yīng)用情形,以此作為下面分析空間變化情況的參考基準(zhǔn)。測試時(shí),所用工具鏈?zhǔn)荕DK-ARM Standard Version 5.11.0.0版本,對應(yīng)Arm Link的版本是V5.04.0.49。構(gòu)造對象(指編譯并鏈接)后輸出信息為“Program Size:Code=34820-RO data= 1748 RW-data=216 ZI-data=8964”,查看對應(yīng)生成的map文件,發(fā)現(xiàn)含有涉及空間的詳細(xì)信息,最后三行信息如圖1所示。
圖1 map文件中的存儲器空間信息
圖中信息說明,該工程所生成的應(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的存儲器結(jié)構(gòu)和Arm-Link對存儲器映像的分布規(guī)律,將圖1中信息進(jìn)一步總結(jié)為如圖2所示映像分布。
其中,加載視圖是根據(jù)映像執(zhí)行之前加載到存儲器的地址,描述映像的區(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)榇鎯臻g不夠,初始化為0的全局變量一部分內(nèi)容映射到起始地址為0x1000 0000的IRAM0 中,一部分內(nèi)容映射到起始地址為0x2000 0000的IRAM1中。由此可知,減少Code和RO數(shù)據(jù)的空間占用,只對ROM有利,減少ZI的空間占用,只對RAM有利,而減少RW的空間占用,對ROM和RAM都有利。
圖2 存儲器映像分布情況
作為ARM公司提供的開發(fā)工具,MDK對ARM架構(gòu)處理器提供了針對性很強(qiáng)的優(yōu)化選擇和細(xì)節(jié)參數(shù)設(shè)置選項(xiàng),與存儲器空間優(yōu)化緊密相關(guān)的主要包括3個(gè)方面的優(yōu)化選項(xiàng)。
3.1 微代碼庫
MDK針對ARM架構(gòu)處理器提供了一套可代替標(biāo)準(zhǔn)庫的微縮型的運(yùn)行庫Micro LIB,它去掉了一些不必要的庫函數(shù),如time()等,同時(shí)也因改造而讓部分庫函數(shù)運(yùn)行起來更慢,如memcpy()等[4],但能顯著減少應(yīng)用系統(tǒng)對Flash存儲器和SDRAM存儲器空間的占用。
3.2 交叉模塊優(yōu)化
MDK的交叉模塊優(yōu)化主要是通過二次編譯的方法,去除未使用的函數(shù),從而減少應(yīng)用系統(tǒng)對Flash存儲器空間的占用。
3.3 C/C++分級優(yōu)化
MDK針對C/C++的應(yīng)用開發(fā)提供了4級優(yōu)化選擇,其關(guān)鍵是在調(diào)試信息的詳細(xì)程度與系統(tǒng)性能之間進(jìn)行不同的選擇。具體見表1。
表1 C/C++分級優(yōu)化選項(xiàng)
在工程文檔不變,通過修改編譯參數(shù)選項(xiàng)的設(shè)置,形成不同組合,并逐一在編譯通過并能正常調(diào)試情況下記錄測試數(shù)據(jù),測試結(jié)果如表2所列。其中,打鉤表示被選中,存儲器空間大小的單位是字節(jié)。
表2中數(shù)據(jù)表明,空間優(yōu)化程度最高的是微代碼庫、交叉模塊優(yōu)化加C/C++的O2優(yōu)化級的組合選項(xiàng)。結(jié)合表1,想要獲得良好的調(diào)試感受,又要有好的空間優(yōu)化率,微代碼庫、交叉模塊優(yōu)化加O0優(yōu)化級的組合選項(xiàng),以及微代碼庫、交叉模塊優(yōu)化加O1優(yōu)化級的組合選項(xiàng),則更具有優(yōu)勢,并在實(shí)踐中得到驗(yàn)證。
表2 編譯參數(shù)對工程空間優(yōu)化的影響
為了支持不同任務(wù)間的調(diào)度,高效地實(shí)現(xiàn)應(yīng)用系統(tǒng)功能,μC/OS-III提供了包括信號量、互斥信號量、消息隊(duì)列、事件標(biāo)志組、軟件定時(shí)器、內(nèi)存分區(qū)等內(nèi)核對象。對一個(gè)實(shí)際的應(yīng)用系統(tǒng)來說,一旦功能、性能要求確定,設(shè)計(jì)方案明確,其所需的操作系統(tǒng)內(nèi)核對象就可以確定,從而可對不需要的內(nèi)核對象進(jìn)行裁減,即可有效降低對代碼空間和內(nèi)存空間的要求。裁減方法主要是在os_cpu.h文件中針對相應(yīng)的內(nèi)核對象進(jìn)行去使能處理,即將全部對應(yīng)項(xiàng)的預(yù)定義值由1u改為0u即可[5]。
4.1 任務(wù)空間合理優(yōu)化
由于μC/OS-III在系統(tǒng)初始化時(shí),會進(jìn)行一定的空間預(yù)分配,可通過應(yīng)用需要評估可能的優(yōu)先級需求數(shù),適當(dāng)加以余量,確定最大優(yōu)先級數(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ì)的對應(yīng)任務(wù)堆棧的使用情況,結(jié)合限值和預(yù)留余量(如30%),為每個(gè)任務(wù)確定合理的堆棧大小。
4.2 優(yōu)化分析
為了方便對比,所有測試均不加編譯優(yōu)化選項(xiàng),測試結(jié)果如表3所列。表中信息表明,通過裁減不必要的內(nèi)核對象,可有效減少系統(tǒng)對ROM和RAM的要求;調(diào)整優(yōu)先級數(shù)和改變堆棧大小,對ROM沒影響,但對RAM有明顯影響;由于const數(shù)組是放在RO數(shù)據(jù)區(qū)中,static和不修飾數(shù)組是放在RW數(shù)據(jù)區(qū)中,如果不必要,一些大的常量數(shù)組需加const修飾,以減少對RAM的要求。
表3 μC/OS-III自身空間優(yōu)化測試
本文針對MDK開發(fā)工具鏈,將實(shí)時(shí)操作系統(tǒng)μC/OS -III移植到中低端配置的Cortex-M系列處理器,在進(jìn)行后續(xù)應(yīng)用開發(fā)時(shí),對遇到的存儲器空間不足的問題尋求解決辦法。實(shí)驗(yàn)表明,綜合利用開發(fā)工具及應(yīng)用系統(tǒng)的不同優(yōu)化方法,并在開發(fā)的不同階段靈活運(yùn)用,效果會更好。文中所述問題和解決辦法對沒有用到μC/OS-III的其他應(yīng)用開發(fā)過程具有同樣的參考意義。
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