基于MDK和μC/OS-III的开发过程存储空间优化
2016-11-26汪成义
汪成义
(湖北经济学院信息工程学院,武汉430205)
基于MDK和μC/OS-III的开发过程存储空间优化
汪成义
(湖北经济学院信息工程学院,武汉430205)
为了降低成本,充分挖掘低端Cortex-M处理器的潜在能力,需要突破其存储器空间不足的限制。通过分析问题与优化测试得知,如果能合理利用开发工具MDK提供的微代码库、交叉模块优化、分级优化等优化手段,可以大大提升存储器空间的有效利用率。与此同时,基于实时操作系统μC/OS-III的应用系统可以根据需要进行一系列裁减、优化。测试结果表明,其优化效果明显。
MDK;μC/OS-III;Cortex-M;存储器
引 言
MDK是ARM公司微控制器开发工具(Microcontroller Development Kit)的简称,其核心是集项目管理、源码编辑、系统调试、外围电路仿真于一身的集成开发环境μVision[1],以及针对不同硬件平台的编译链接工具。实时操作系统μC/OS-III最典型的应用平台是基于ARM公司不同架构的Cortex-M系列处理器,Cortex-M主要应用于对成本以及功耗较为敏感的微控制器或终端设备,其产品从低端到高端又分为Cortex-M0、Cortex-M0+、Cortex-M1、Cortex-M3、Cortex-M4到Cortex-M7等子系列,不同芯片公司的子系列往往又有多个型号的处理器。在激烈的市场竞争中,到底是为满足越来越复杂的应用而选择高配置处理器,还是为降低成本而选择较低配置的处理器,一直是个令人纠结的问题,而当应用系统中引入实时操作系统后(如μC/OS-III),片内存储器空间消耗增大,空间问题成为型号应用限制的关键问题之一。本文主要以低成本的中低端配置处理器为研究对象,分析在μC/OS-III应用开发过程中可能会遇到的存储器空间不足的问题及不同环节的解决办法。
1 应用开发过程存在的空间问题
在产品开发过程中,为了实现产品的功能需要提供足够的程序存储空间和运行空间,还要为产品的功能扩展、软件升级与维护预留一定的空间。对中低端处理器来说,成本降低了,但存储器空间可能面临不足,表现如下:
(1)处理器存储空间自身不足
对于低端Cortex-M处理器,存储空间在32 KB的Flash存储器/8 KB的SDRAM存储器以下,对于中端Cortex-M处理器,存储空间在256 KB的Flash存储器/ 64 KB的SDRAM存储器以下。Micrium公司在其网站已提供了针对十几家微控制器厂商不同型号芯片的μC/ OS-III版本,其一般要求128 KB的Flash存储器/32 KB 的SDRAM存储器或以上,个别型号的配置为64 KB的Flash存储器/16 KB的SDRAM存储器。在实际应用中,若用户任务较多,并且有图形用户界面、网络协议、数据库等,如果不作优化处理,空间要求会快速提高,则要求256 KB的Flash存储器/64 KB的SDRAM存储器或以上,若如此,没有成本优势,且功能扩展也会受限。
(2)不合理消耗导致的空间不足
在基于ARM公司的MDK开发工具进行应用开发的过程中,若不充分利用MDK对ARM处理器优化,或利用的不恰当,会导致空间的不必要消耗。基于μC/OS-III的应用系统设置不合理或变量定义不恰当,也会引起不必要的空间消耗。当处理器型号选定之后,μC/OS-III应用开发空间问题的解决主要依赖开发工具参数的合理设置和软件自身空间消耗安排的合理化,下面就此展开分析。
2 空间占用情况分析
2.1 存储器空间占用信息
考虑到空间分布与硬件平台紧密相关,下面就以NXP公司基于Cortex-M3的LPC1347微控制器为分析对象,其片内有64 KB的Flash存储器,8 KB(IRAM0)+2 KB(IRAM1)+2 KB(USB IRAM)即共计16 KB的RAM存储器[2],并设定μC/OS-III的优先级数为64个,建立2个系统任务和2个用户任务的最基本应用情形,以此作为下面分析空间变化情况的参考基准。测试时,所用工具链是MDK-ARM Standard Version 5.11.0.0版本,对应Arm Link的版本是V5.04.0.49。构造对象(指编译并链接)后输出信息为“Program Size:Code=34820-RO data= 1748 RW-data=216 ZI-data=8964”,查看对应生成的map文件,发现含有涉及空间的详细信息,最后三行信息如图1所示。
图1 map文件中的存储器空间信息
图中信息说明,该工程所生成的应用系统占用RAM的大小为9 180字节(即8.96 KB),是RW数据和ZI数据两项之和,占用ROM大小为36 784字节(即35.92 KB),是Code、RO数据和RW数据三项之和。其中,Code为代码大小,RO数据为常数大小,RW数据为已初始化为非零的全局变量大小,ZI数据为未初始化或初始化为零的变量大小。
2.2 映像的加载与执行视图
为便于理解,结合LPC1347的存储器结构和Arm-Link对存储器映像的分布规律,将图1中信息进一步总结为如图2所示映像分布。
其中,加载视图是根据映像执行之前加载到存储器的地址,描述映像的区或节的组成情况;执行视图则是根据映像执行时的地址,描述映像的区或节的组成情况[3]。由图2可知,程序执行前需占用ROM空间大小由RW节 (或区,下同)和RO节(含Code和RO数据)组成,程序执行时,需将ROM中的RW节映射到RAM的RW节,因为存储空间不够,初始化为0的全局变量一部分内容映射到起始地址为0x1000 0000的IRAM0 中,一部分内容映射到起始地址为0x2000 0000的IRAM1中。由此可知,减少Code和RO数据的空间占用,只对ROM有利,减少ZI的空间占用,只对RAM有利,而减少RW的空间占用,对ROM和RAM都有利。
图2 存储器映像分布情况
3 MDK编译参数对空间的优化
作为ARM公司提供的开发工具,MDK对ARM架构处理器提供了针对性很强的优化选择和细节参数设置选项,与存储器空间优化紧密相关的主要包括3个方面的优化选项。
3.1 微代码库
MDK针对ARM架构处理器提供了一套可代替标准库的微缩型的运行库Micro LIB,它去掉了一些不必要的库函数,如time()等,同时也因改造而让部分库函数运行起来更慢,如memcpy()等[4],但能显著减少应用系统对Flash存储器和SDRAM存储器空间的占用。
3.2 交叉模块优化
MDK的交叉模块优化主要是通过二次编译的方法,去除未使用的函数,从而减少应用系统对Flash存储器空间的占用。
3.3 C/C++分级优化
MDK针对C/C++的应用开发提供了4级优化选择,其关键是在调试信息的详细程度与系统性能之间进行不同的选择。具体见表1。
表1 C/C++分级优化选项
4 优化测试与分析
在工程文档不变,通过修改编译参数选项的设置,形成不同组合,并逐一在编译通过并能正常调试情况下记录测试数据,测试结果如表2所列。其中,打钩表示被选中,存储器空间大小的单位是字节。
表2中数据表明,空间优化程度最高的是微代码库、交叉模块优化加C/C++的O2优化级的组合选项。结合表1,想要获得良好的调试感受,又要有好的空间优化率,微代码库、交叉模块优化加O0优化级的组合选项,以及微代码库、交叉模块优化加O1优化级的组合选项,则更具有优势,并在实践中得到验证。
表2 编译参数对工程空间优化的影响
为了支持不同任务间的调度,高效地实现应用系统功能,μC/OS-III提供了包括信号量、互斥信号量、消息队列、事件标志组、软件定时器、内存分区等内核对象。对一个实际的应用系统来说,一旦功能、性能要求确定,设计方案明确,其所需的操作系统内核对象就可以确定,从而可对不需要的内核对象进行裁减,即可有效降低对代码空间和内存空间的要求。裁减方法主要是在os_cpu.h文件中针对相应的内核对象进行去使能处理,即将全部对应项的预定义值由1u改为0u即可[5]。
4.1 任务空间合理优化
由于μC/OS-III在系统初始化时,会进行一定的空间预分配,可通过应用需要评估可能的优先级需求数,适当加以余量,确定最大优先级数,并修改os_cpu.h文件中OS_CFG_PRIO_MAX的预定义值(如由缺省的64u改为16u等),从而改变系统内核中OSPrioTbl[i]、OSRdy List[i]等所占用空间的大小。在μC/OS-III中,在创建每个任务时,需单独指定任务控制块,且每个任务都有独立的堆栈,其大小可单独设定,并在任务生存期始终占据着内存空间,其优化方法是,借助所统计的对应任务堆栈的使用情况,结合限值和预留余量(如30%),为每个任务确定合理的堆栈大小。
4.2 优化分析
为了方便对比,所有测试均不加编译优化选项,测试结果如表3所列。表中信息表明,通过裁减不必要的内核对象,可有效减少系统对ROM和RAM的要求;调整优先级数和改变堆栈大小,对ROM没影响,但对RAM有明显影响;由于const数组是放在RO数据区中,static和不修饰数组是放在RW数据区中,如果不必要,一些大的常量数组需加const修饰,以减少对RAM的要求。
表3 μC/OS-III自身空间优化测试
结 语
本文针对MDK开发工具链,将实时操作系统μC/OS -III移植到中低端配置的Cortex-M系列处理器,在进行后续应用开发时,对遇到的存储器空间不足的问题寻求解决办法。实验表明,综合利用开发工具及应用系统的不同优化方法,并在开发的不同阶段灵活运用,效果会更好。文中所述问题和解决办法对没有用到μC/OS-III的其他应用开发过程具有同样的参考意义。
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