一种嵌入式设备上的性能调试方法技术

技术编号:26030929 阅读:12 留言:0更新日期:2020-10-23 21:08
本发明专利技术涉及一种嵌入式设备上的性能调试方法。其特征在于是通过编译器插桩的方法对函数的入口和出口进行插桩,结合轻量级PMU库达到函数级统计效果,获取系统中每个函数的开销并输出采集的结果;再读取之前输出的采集结果文件创建csv文件,解析之前保存的每个函数的记录数据,读取对应的工程的符号表信息、根据函数地址及符号表信息获取函数名称,把每个函数的性能采集数据及函数名称写入csv文件中,并保存,再在csv文件中根据每一项具体的新能数据,分析个函数的开销,找到瓶颈函数。本发明专利技术能够迅速定位性能瓶颈函数及系统原因,达成性能优化目标。

【技术实现步骤摘要】
一种嵌入式设备上的性能调试方法
本专利技术涉及一种嵌入式设备上的性能调试方法。
技术介绍
随着物联网技术的发展,各种嵌入式设备越来越多,嵌入式设备上软件也越来越复杂;而目前市面上嵌入式设备所运行的操作系统各种各样,freertos、ucos、threadx、nucleus、pikeos、nxp、linux,也有一些基于微内核架构的OS,如L4等。这些系统如Linux自带了非常丰富的调试性能调试工具如perf等,但是大部分系统并没有提供性能调试手段或者性能调试工具。目前有些嵌入式设备上甚至只有非常简单的支持多任务的系统,完全没有性能调试框架的;但是嵌入式设备又对性能和成本的追求一直在提升,所以需要对嵌入式设备上的运行的程序做不断的优化,从而达到性能最佳。目前嵌入式设备上的性能调试更多的通过task的角度来分析,即从任务调度的角度来分析;在调度器内部增加一些调试信息,从而确定是哪个任务占用了大部分系统时间;在确定任务后再分析任务流程,通过增加trace信息从而找到性能瓶颈的代码及数据。Linuxperf是基于采样的,在某种程度上无法做到精确定位;譬如你要去采集cachemiss的行为,但perf无法精确的让你知道每个函数发生cachemiss的次数。
技术实现思路
本专利技术针对现有技术存在的缺点,提供一种嵌入式设备上的性能调试方法,能够迅速定位性能瓶颈函数及系统原因,达成性能优化目标。为此,本专利技术采取如下的技术方案:一种嵌入式设备上的性能调试方法,其特征在于是通过编译器插桩的方法对函数的入口和出口进行插桩,结合轻量级PMU库达到函数级统计效果,获取系统中每个函数的开销并输出采集的结果;再读取之前输出的采集结果文件创建csv文件,解析之前保存的每个函数的记录数据,读取对应的工程的符号表信息、根据函数地址及符号表信息获取函数名称,把每个函数的性能采集数据及函数名称写入csv文件中,并保存,再在csv文件中根据每一项具体的新能数据,分析个函数的开销,找到瓶颈函数。作为优选,开始采集时,先初始化采集系统,创建高性能内存池供后续hash表entity分配使用,初始化PMU,设置相关性能采集event,并enable,设置采集开始flag,系统开始采集相关信息,以__cyg_profile_func_enter为每个统计的开始点,为每个函数创建对应的hash表entity,分别记录每个函数的入口和出口对应的性能数据值,并计算相应delta值,同时也记录函数的运行次数等基础数据,并更新到hash表的entity,设置结束采集标志,及设置采集开始的flag=false,发送采集结果获取命令,遍历hash表中的各entity,并根据运行总时间进行快速排序,输出相关结果,保存输出结果到文件中。作为优选,所述的编译器插桩包括自行增加一个编译器插件,所述的插件在代码编译阶段在函数入口及退出的地方插入对应的指令。作为优选,所述的编译器插桩为直接使用编译器参数-finstrument-functions来对函数的入口和出口进行插桩。作为优选,所述的函数的开销包括运行时间、运行次数、cachemissrate的性能关键数据。作为优选,所述的CSV文件为excel文件。本专利技术不依赖操作系统及软件架构,通过编译器插桩的方式结合轻量级PMU库达到函数级统计效果,从而可以获取系统中每个函数的开销,包括运行时间,运行次数,cachemissrate等性能关键数据,从而迅速定位性能瓶颈函数及系统原因,达成性能优化目标。且不需要修改现有任何代码,也不需要操作系统修改。对比业界以采样为基础的性能统计,本专利技术精度更高。根据本专利技术的对于性能统计,并对结果进行分析后,修改对应软件代码,可以有效提升性能30%以上。附图说明图1为本专利技术的系统框架结构示意图。图2为本专利技术采集原理流程示意图。图3为采集具体流程示意图。图4为性能结果分析示意图。图5为统计结果示例1。图6为统计结果示例2。具体实施方式下面结合附图对本专利技术作进一步详细描述。如图1所示,本专利技术涉及一种嵌入式设备上的性能调试方法,其通过编译器插桩的方法对函数的入口和出口进行插桩,结合轻量级PMU库达到函数级统计效果,获取系统中每个函数的开销并输出采集的结果;再读取之前输出的采集结果文件创建csv文件,解析之前保存的每个函数的记录数据,读取对应的工程的符号表信息、根据函数地址及符号表信息获取函数名称,把每个函数的性能采集数据及函数名称写入csv文件中,并保存,再在csv文件中根据每一项具体的新能数据,分析个函数的开销,找到瓶颈函数。所述的函数的开销包括运行时间、运行次数、cachemissrate等性能关键数据。所述的CSV文件为excel文件。如图2-图4所示,1.开始采集时,先初始化采集系统,创建高性能内存池供后续hash表entity分配使用。2.初始化PMU,设置相关性能采集event,并enable。3.设置采集开始flag,系统开始采集相关信息。4.以__cyg_profile_func_enter为每个统计的开始点,为每个函数创建对应的hash表entity。5.分别记录每个函数的入口和出口对应的性能数据值,并计算相应delta值,同时也记录函数的运行次数等基础数据,并更新到hash表的entity。6.设置结束采集标志,及设置采集开始的flag=false。7.发送采集结果获取命令,遍历hash表中的各entity,并根据运行总时间进行快速排序,输出相关结果。8保存输出结果到文件中。所述的编译器插桩可以通过扩展编译器的plugin等方式,自行增加一个编译器插件,目前LLVM和GCC都支持这种方式。通过自行编写的插件可以在代码编译阶段在函数入口及退出的地方插入对应的指令。也可以直接使用编译器参数-finstrument-functions来对函数的入口和出口进行插桩。如图5-图6所示,根据统计结果生成可供分析的数据表格,从表格中不难看出我们的测试程序时间基本上都花在了test1handler上了,所以只需要对test1handler进行分析即可;进一步分析的话我们可以根据生成的数据可以得出IPC,L1Cache的missrate,可供进一步的分析。当然一般来讲我们也可以看看函数测执行次数,得出程序中哪些函数是最频繁使用的从而做内联优化。上述内容仅为本专利技术的较佳实施举例,并不用于限制本专利技术。凡在本专利技术精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本专利技术的保护范围之内。本文档来自技高网...

【技术保护点】
1.一种嵌入式设备上的性能调试方法,其特征在于是通过编译器插桩的方法对函数的入口和出口进行插桩,结合轻量级PMU库达到函数级统计效果,获取系统中每个函数的开销并输出采集的结果;再读取之前输出的采集结果文件创建csv文件,解析之前保存的每个函数的记录数据,读取对应的工程的符号表信息,根据函数地址及符号表信息获取函数名称,把每个函数的性能采集数据及函数名称写入csv文件中,并保存,再在csv文件中根据每一项具体的新能数据,分析个函数的开销,找到瓶颈函数。/n

【技术特征摘要】
1.一种嵌入式设备上的性能调试方法,其特征在于是通过编译器插桩的方法对函数的入口和出口进行插桩,结合轻量级PMU库达到函数级统计效果,获取系统中每个函数的开销并输出采集的结果;再读取之前输出的采集结果文件创建csv文件,解析之前保存的每个函数的记录数据,读取对应的工程的符号表信息,根据函数地址及符号表信息获取函数名称,把每个函数的性能采集数据及函数名称写入csv文件中,并保存,再在csv文件中根据每一项具体的新能数据,分析个函数的开销,找到瓶颈函数。


2.根据权利要求1所述的一种嵌入式设备上的性能调试方法,其特征在于:开始采集时,先初始化采集系统,创建高性能内存池供后续hash表entity分配使用,初始化PMU,设置相关性能采集event,并enable,设置采集开始flag,系统开始采集相关信息,以__cyg_profile_func_enter为每个统计的开始点,为每个函数创建对应的hash表entity,分别记录每个函数的入口和出口对应的性能数据值,并计算相应delta值,同时也记录函...

【专利技术属性】
技术研发人员:徐波岳坚张少倩汤婷
申请(专利权)人:杭州优万科技有限公司
类型:发明
国别省市:浙江;33

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1