提高二十四专业技能的“完全数据表”
Write by Liupin 2010-4-9
嵌入式软件的设计通常完成单个模块的软件功能。 对于release,通常需要更完整的数据表。 从中对关键功能和资源的要求,例如CPU加载,内存大小.如何为软件提供更完整的数据表? 在这篇文章中,我会更详细地介绍。 首先,让我们看看几家公司的数据表。 主要以编解码项目为例。 例如,MP3解码器。
首先,让我们看看spiritDsp在网站上提供的数据表信息。 我个人认为这是一家非常规范的公司。 不仅优化了编解码器的性能,而且每个文档都很丰富。 spirit-MP3 -解码器- data sheet.pdf
33558 www.spirit DSP.com/data sheets/spirit-MP3-decoder-data sheet.pdf
以Feature、specificationsandresourcerequirements为例。 要查看更完整的数据表,请查看上面的链接。
罗列Datasheet中包含的内容。
1 )主要特点
2 )规范,这一部分可以没有,但总体上我们将简要介绍编解码器。 这些都是用合适的spec
取得。
3 )资源请求
这一部分有很多版本,有的像spirit这样详细,有的只有MIPS/Code size/RW size/RO size,有的只有堆栈/heap size。
MIPS/mcps—- cpuloadingparameter
程序存储器大小
rw内存大小
RO memorysize等
3如何完善自己的编码数据表
1 )功能和规范很容易填写。 编码规格和要求手册中有详细说明。
2 )资源请求
这一部分往往难以填写完整和准确,这一部分是本blog重点探索的。
探索MIPS与MCPS的区别
For the platform of ADS,themipsandthemcpsareallretrievedfromthesoftsimulink.themcpscanbegotasfollowingformula 3360
MIPS=total _ instrunctions/(play _ time * 10 ^ 6;
MPs=total _ cycles/(play _ time * 10 ^ 6;
Gernerally speaking,wecancernwiththemcpsjustfortherealdevice,wecanestimatethemcpsaccordingtothefollowingformula 3360
MCPS=(decoded_time/play_time ) ) *dominant_frequency_CPU;
where the play _ timehassometodowiththesamplerateforaudioandtheframerateforvideo。
从上面的内容可以看出MCPS和MIPS的区别。 平时常用实用的是MCPS,它可以直接反应CPU的加载和功耗。
考虑到这些复杂因素,很难确定MCPS和MIPS之间的转换关系,因为一个指令可能需要多个Cycles,并且可能与pipeline stall发生跳转
二.探索模拟器与设备获取the mcps的差异
现在,等待MCPS的方法有两种:一种是在simulator环境(如RVDS4.0 )中获取这些数据,另一种是在实际设备上运行。 一种方法是等待某个系统的实际perform
ance 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先染色,然后再做测试就能获取这个数据。