二十四 提高专业技能之 “完整DataSheet”
Write by Liupin 2010-4-9
在嵌入式软件设计中,往往你完成一个单独模块的软件功能,在release时往往要一张较为完整的datasheet,从这中能获取主要feature和对资源的要求,如CPU loading, Memeory size. 如何为软件提供一较为完整的datasheet? 在这篇文章中,我将较为详细的介绍。先来看看一些公司的datasheet,主要是以Codec project为例,如MP3 decoder.
- 先来看看spiritDsp 在其网站上提供的Datasheet 信息。个人认为这是一家非常规范的公司,不仅仅其优化Codec性能在行内是首屈一指的,而且各项文档也是很完善。
SPIRIT-MP3-Decoder-Datasheet.pdf
http://www.spiritdsp.com/datasheets/SPIRIT-MP3-Decoder-Datasheet.pdf
例举Feature,Specifications and Resource Requirements, 如大家要看更为完整的datasheet就看上面的linking.
2 罗列一下Datasheet包括的内容。
1) 主要的特点
2) Specification,这一部分可有可无的,就是整体简单介绍一下Codec。这些在相应的spec都能
获取。
3) ResourceRequirements
这一部分有很多版本,有的像spirit这样很详细的,有的就只要MIPS/Code size/RW size/RO size,有的还会把stack/heap size 也加入。
MIPS/MCPS---- CPU loading parameter
ProgramMemory size
RW memorysize
RO memorysize 等
3 怎么完善自己Codec Datasheet
1) Featureand Specification 是很容易填写的,在codec spec and requirement book 中都会有详细的说明。
2) ResourceRequirements
这部分往往很难填写的完整和准确,这一部分是本blog重点探究的东西。
探究一:MIPS 与 MCPS 区别
For the platform of ADS, the MIPSand the MCPS are all retrieved from the soft simulink. The MCPS can be got asfollowing formula:
MIPS = total_instrunctions/(play_time*10^6);
MCPS = total_cycles/(play_time*10^6);
Gernerally speaking, we can concern with the MCPS just for the realdevice, we can estimate the MCPS according to the following formula:
MCPS = (decoded_time/play_time) *dominant_frequency_CPU;
where the play_time has some to do with thesample rate for audio and the frame rate for video.
从上面的可以知道MCPS和MIPS的不同。平时用得较多且实用的是MCPS, 这个能直接反应出CPU loading和 功耗。
由于一条指令可能要多个Cycles, 还有就是可能出现pipeline stall 和 跳转,考虑这些复杂的因素,导致很难确定MCPS与MIPS的转换关系,但我们还能得到不同ARM系列的CPI(每条指令的平均时钟周期数) 值来大致转换MCPS and MIPS.
探究二:Simulator and device get the MCPS 差异
现在等到MCPS往往有二种方式,一种是在simulator环境下,如RVDS4.0下得到这些数据,另一种放到实际的devices上跑,等到在某一系统中的实际performance data.
Simulator performance testing: 只是简单模拟CPU对算法的执行情况,对单纯的算法时间性能较准确的测试。
Devices performance testing: 由于实际的设备中,往往有CPU不是全力在工作,所以实际CPU MHz是一个比峰值小的值,这也是导致二个值的误差原因。
Standalone performance testing: 考虑到实际的CPU和系统,测试出来的值往往比simulator所得到的值偏大。同时实际系统中,由于系统还在跑很多别的系统程序,还有Cache的影响导致测出的数据不准确或每次测得的值发生变化。所以应该多测试几次,在测试Codec performance时,最好不要运行别的系统程序。
探究三:时间性能参数怎样测才会准,以及如何比较这些数据。
例如,同时的MP3 decoder, 不同的公司会提供不同的MCPS Datasheet,那如何判别那个Codec性能好。由于测试的码流和测试的平台不一样,往往导致这些MCPS数据没有什么可比性,只能做一下参考。
要得到更加准确和有参考价值的MCPS数据,那应该指定码流和测试的平台,这样才能得到相对准确的数据。
探究三:如何得到memory size.
1)首先弄清应该要列举那几种size, 也就是嵌入式系统更关注那几个size. 我认为有以下几个。
Program size/Code size ---- 这个是衡量Codec要多少bss 段memory, 往往有些系统会要求这个值应该小于多少的。
RO size --- 这个也就是constant table size
RW size --- 这个应该是malloc space, 也就是heap, 这个值很重要,嵌入式系统拿到这个值就知道Codec在运行中对memory需求size.
还有一个 Stack: 这个也很关键,有的application或CPU对这个参数也有自己的限定,所以也应该要把这个值拿到。
2 ) 如何获取这些值。
分二种情况,一种是在VS2005/VS2008; 一种是在RVDS下。 个人觉得在RVDS下较为方便和准确
二种情况下都是通过生成对应的Map文件来实现的。
VS2005/VS2008:打开如下编译选项:
RVDS 下,在IDE或makefile中,加如下编译选项:
LFLAGS += --map --info totals --symbols --list ./test.map
RVDS下将会生成test.map文件,文件中有会有如下信息,我们通过这些信息就有得到很多size.
==============================================================================
Image component sizes
Code (inc.data) RO Data RW Data ZI Data Debug
888 208 48 0 40960 10995 Object Totals
8 4 48 0 0 0 (incl. Generated)
0 0 0 0 0 1 (incl. Padding)
51036 934 27836 680 524 16284 Library Totals
10 0 0 0 0 0 (incl. Padding)
==============================================================================
Code (inc.data) RO Data RW Data ZI Data Debug
51924 1142 27884 680 41484 18788 Grand Totals
51924 1142 27884 608 41484 18788 ELF Image Totals(compressed)
51924 1142 27884 608 0 0 ROM Totals
==============================================================================
TotalRO Size (Code + RO Data) 79808 ( 77.94kB)
TotalRW Size (RW Data + ZI Data) 42164 ( 41.18kB)
Total ROMSize (Code + RO Data + RW Data) 80416 ( 78.53kB)
==============================================================================
3) 如何得到stack size.
Stack 也就是函数的局部变量所占空间的大小,在VS2005/VS2008下还没有很好的方法来获取这个数据,在RVDS下有如下方法,通过对stack先染色,然后再做测试就能获取这个数据。