1TMTHEARCHITECTUREFORTHEDIGITALWORLD性能分析议程代码和数据的大小ARMulator周期计算ARMulator实时仿真其他ARMulator的问题编译器的优化级别C/C++编译器的优化级别是可以选择的.-O0(debug版的默认值,-g)除了一些简单的代码转换之外,关闭了大部分的优化有最好的调试信息,是没有优化的代码.-O1大部分的优化.带有满意的调试信息,同时有好的代码密度.-O2(默认)全部优化.有限的调试信息,但有最好的代码密度.代码密度和执行速度的平衡可以使用选项-Ospace(默认)或–Otime来选择.利用-g选项来包括源代码调试信息.应用代码和数据的大小CodeRODataRWDataZIDataDebug4220604102406824ObjectTotals26056728027210000LibraryTotals===================================================================CodeRODataRWDataZIDataDebug3027678841051216824GrandTotals===================================================================TotalROSize(Code+ROData)31064(30.34kB)TotalRWSize(RWData+ZIData)10516(10.27kB)TotalROMSize(Code+ROData+RWData)31068(30.34kB)ReadOnly(只读)ZeroInitialized(零初始化)ReadWrite(读写)armlink提供两个可选择项来提供相关的信息:-infosizes(所有目标的大小)-infototals(总体大小)RAMROM其他大小的考虑连接器的输出表明了应用最小的ROM和RAM的需求.栈和堆需要额外的RAM空间.把栈放在零等待状态-32位的片上内存将比在8位或16位上的片外内存性能更高.你也可以把代码从ROM里拷贝到RAM里运行,这样将增加RAM空间.ELF文件的代码/数据的大小可以使用以下选项得到:fromelf-z.库文件的代码/数据的大小可以使用以下选项得到:armar-sizes.练习1在这个练习部分,我们将看到,C编译器的不同优化级别对于一些简单的应用代码的影响.(theDhrystone2.1benchmark)这些信息是连接时用-infototals选项时得到的.议程代码和数据大小ARMulator周期计算ARMulator实时仿真其他ARMulator问题周期计算(1)ARMulator可以通过执行应用程序来计算周期.可以产生Sequential,Non-sequential,Coprocessor等周期信息.可以使用调试器来显示:print$statistics(armsd/ADW/ADU/AXD),或者ViewDebuggerInternals(ADW/ADU/AXD)对消逝的(增加的)周期计算的输出:ViewDebuggerInternals或者print$statistics_inc_w(ADW/ADU),或者ViewDebuggerInternalsAddNewReferencePoint(AXD)你可以使用这些信息来分析子程序的调用问题.例子输出(ARM940T)周期计算(2)例子输出(ARM7TDMI)AMBA(ASB)只有地址周期ReferencePoint(s)NumberofinstructionsCoreCyclesNon-SeqCyclesInternalCyclesCoproCyclesTotalCyclesSeqCycles练习部分2这一部分里,我们可以看到由ARMulator产生的周期信息.我们将比较两种不同的内存拷贝的性能,一种使用LDR/STR指令,令一种使用LDM/STM(IA)指令.议程代码和数据大小ARMulator周期计算ARMulator实时仿真其它的ARMulator问题实时仿真为了得到时间统计表,ARMulator需要以下信息:处理器的类型,例如ARM7TDMI内核的时钟频率与处理器连接的内存的信息(地址,宽度.速度)指定时钟频率:对于armsd,利用命令行选项‘-clock’,例如armsd-clock25MHzprog.axf对于AXD/ADW/ADU,选择OptionsConfigureDebugger,接着配置ARMulate目标环境速度(inMHz).ARMulator配置可以通过调试器(OptionsConfigureDebugger)来实现简单的配置配置文件里的高级配置armulate.dsc“固定的”核的类型和功能例如.TCM/Cache大小default.ami全局核配置信息例如.MCCFG控制时钟设置,页表使用等.peripherals.ami外部的配置例如.MMU/MPU配置,semihosting默认值,堆栈基地址等.ProcessorClockSpeedEndianessMemoryMap内存配置(1)如果没有指定映象文件:ARMulator将利用4Gb,32-bit,零等待状态,读/写内存映象.为了指定一个‘实际’的系统内存映象,可以使用一个映象文件.WriteStartAddress(Hex)LengthofArea(Hex)AreanameAreaWidth(Bytes)Timing(ns)non-seq/sequentialAccess(R/RW/-)Read0000000000020000CODE2R150/100150/1001000000000008000DATA4RW100/65100/65内存配置(2)ARMulator仿真了一个基本的内存控制器.适当加入一些等待状态,这依赖于内存速度和时钟频率.启动的旗语说明(在其他事件中)例如:Numberofwaitstates(variousaccesstypes)AreaLocationAccessrightsAreaWidthARMulatedClockSpeedEndianess(Big/Little)ARMulatedProcessorARM7TDMI,BIU,Bigendian,Semihosting,DebugCommsChannel,25.0MHz,4GB,Mapfile,Timer,Profiler,Tube,Millisecond[25000cycles_per_millisecond],Pagetables,IntCtrl,Tracer,RDICodesequencesMemorymap:10000000..10007fff,32-Bit,wr,waitstates:RN=2/1WN=2/1RS=1WS=1RIS=2/1WIS=2/100000000..0001ffff,16-Bit,-r,waitstates:RN=3/2WN=AbtRS=2WS=AbtRIS=3/2WIS=3/2观察仿真时间当执行仿真时,调试器一直追踪着流逝的仿真时间.这可以通过以下方法来观察:通过应用程序从汇编语言:利用semihostingSWISYS_CLOCK从C/C++语言:利用库函数clock()通过调试器利用调试器内部的变量$clockt1=clock();main_loop();t2=clock();time_taken=t2-t1;练习部分3这一部分主要讨论了ARMulator里的映象文件的使用和检查了是怎样影响代码的性能的.我们将再次使用Dhrystone2.1代码.议程代码和数据大小ARMulator周期计算ARMulator实时仿真其它ARMulator的问题带有缓存内核的ARMulation(1)在没有缓存的内核上,指令和数据的执行时间是“可预见的”在有缓存的内核上,还有其它的一些因素也会影响指令和数据的执行时间:指令有没有缓存?数据地址有没有缓存?写缓冲器(WB)有没有被用完?内核是否支持streaming?是否有TLB错过(如果有MMU的话)?你可以配置ARMulator来报告缓存,写缓冲器(WB)和TLB信息详细细节可以参考“DebugTargetGuide”带有缓存内核的ARMulation(2)在某些内核上,ARMulator可能报告零N-cycle(non-seq)例如:带有AMBA接口的内核(720T,940T,等)ARMulator只能显示AMBA周期类型:地址(A)连续的(S)非连续的访问是有一个A-周期,紧接着是一个S-周期“合并的I-S”周期练习部分4这一部分将会看到缓存是怎样影响代码的性能的(利用Dhrystone例子).参考资料为了得到更详细的信息,请察看以下资料:ADS编译和库文件用户手册第2章:C和C++编译器第3章:ARM编译器参考ADSLinkerandUtilitiesGuide第2-6章:ARM连接定位器ADSDebugTargetGuide第2章:ARMulator基本知识第3章:ARMulator模式第4章:ARMulator参考ADSAXDandarmsdDebuggersGuide第5章:AXD调试器