powerpc_003_代码执行时间测量调试与改进

            前面两次小结都是理论性的,这一次做一个实践性的小结。使用S32DS进行软件调试,同时进一步优化之前关于软件执行时间的测试。

            调试,最简单方式就是查看我们关注的信息,比如变量和寄存器,看看他们的值有没有按照我们预期的变化。不过,这套工具似乎不支持相应信息的自动刷新,如果要查看的话需要让程序停住才能够查看。

            之前我们写了一个简单的时间测试函数,使用的汇编代码。查看的方式可以查看通用寄存器5,因为我们的计数器变化存储在这个寄存器中。在函数执行的入口处打断点,查看到的计数器变化:

            为什么差值不是5,查看了一下说明是因为流水线因素导致。几次测试,感觉这个结果似乎不是我预期的。为了验证这个功能的可用性,打算重新设计软件。

            这次打算借用实现了C语言封装的几个汇编操作:

            上面是对特殊寄存器的操作函数。再查看一下所需要的特殊寄存器的编号:

            程序修改如下:

/*

 * main implementation: use this 'C' sample to create your own application

 *

 */

 

#include "derivative.h" /* include peripheral declarations */

#include "compiler_api.h"

 

#define TBL_SPR_RD 268

#define TBL_SPR_WT 284

#define TBU_SPR_RD 269

#define TBU_SPR_WT 285

#define HID0_SPR   1008

 

uint32_t time_counter1;

uint32_t time_counter2;

 

extern void xcptn_xmpl(void);

void TimeBaseMeasurement_Init(void);

 

void TimeBaseMeasurement_Init(void)

{

    uint32_t val_32bit_temp = 0U;

 

    /* init TBU and TBL */

    MTSPR(TBL_SPR_WT,0);

    MTSPR(TBU_SPR_WT,0);

    /* enable time base function */

    val_32bit_temp = MFSPR(HID0_SPR);

    val_32bit_temp |= 0x4000;

    MTSPR(HID0_SPR,val_32bit_temp);

}

 

void Test(void)

{

    ;

    ;

    ;

    ;

    ;

}

 

int main(void)

{

    xcptn_xmpl ();              /* Configure and Enable Interrupts */

   

    TimeBaseMeasurement_Init();

 

    /* Loop forever */

    for(;;)

    {

        time_counter1 = MFSPR(TBL_SPR_RD);

             Test();

        time_counter2 = MFSPR(TBL_SPR_RD);

    }

}

 

            经过上面的修改,我依然没有测试成功。但是,我似乎发现了一个规律,那就是两个数字其实是在有规律的增加。观察之后,我简单得出一个猜测:其实程序是OK的,这两个时间测试寄存器的特殊之处在于程序停在断点之后,计数器依然在变化。

        于是,程序设计为两个计数器求差。而监控方式上,从原来的断点查看改成实时查看。这样,主要的功能代码修改如下:

 

            测试查看结果:

            通过上面的结果看得出,纯粹的这个读取中间其实就有18个时钟周期的时间消耗,如果力求准确,在最终的时间中应该把这个数值删除。现在只是一个粗略的测试,后面的测试时间包括这一部分执行时间,接下来测试Test函数的执行时间:

            数值十分稳定,就是这么长时间。进一步修改测试,执行两次Test函数。

            从上面的结果看,增加的数值跟上次差不多。测试软件应该来说是准确的。

反汇编Linux/Windows OS运行的32位/64位程序/动态库文件,CPU类型:ARM PowerPC MIPS X86 操作菜单选择:文件解析 Alx+P ELF文件解析 Alt+E 另有CORE文件解调用栈、文本比较等功能。V2.0.3相对上一版本,完善ARM64、X8664、PPC64反汇编、ko反汇编,完善反汇编文本文件比较、IQ数据解析,修复小BUG;V2.0.2相对上一版本,完善ARM64、X8664反汇编、ARM64位core文件调用栈,完善文本文件比较、增加高亮、查找功能,修复小BUG;V2.0.0相对上一版本,完善ARM64反汇编、ARM64位core文件调用栈,完善C++符号名字解析,支持工具运行在英文版OS;V1.26.01相对上一版本,增加ARM64反汇编、64位core文件解析;V1.26.00相对上一版本,增强EXE反汇编,增加dbx老邮件解析、二维码功能;V1.25.07相对上一版本,增加二进制反汇编、IQ数据解析功能,完善MIPS反汇编,修复小BUG;V1.25.05相对上一版本,增加内存数据按数据类型解析功能;V1.25.04相对上一版本,完善X86反汇编,修复小BUG;V1.25.02相对上一版本,COREDUMP统计、匹配目标文件等相关功能优化,修复小BUG;V1.25.00相对上一版本,相关功能支持动态库文件,查询代码支持无符号目标文件+有符号目标文件,COREDUMP统计、与问题单关联、目标文件/CORE文件/问题单同步;V1.24.02相对上一版本,针对进程主动捕捉异常的信息定制处理进一步完善COREDUMP文件解析与应用,增强软件管理;V1.24.01相对上一版本,进一步完善COREDUMP文件解析与应用,提供部分ARM Thumb指令反汇编;V1.24.00相对上一版本,进一步完善COREDUMP文件解析与应用,提供堆栈调用关系分析;V1.23.03相对上一版本,提供32位X86反汇编;V1.23.02相对上一版本,提供源代码行查询指令地址,OBJ/COREDUMP文件解析,sprintf函数参数特定检查,完善文件拖放操作,修复小BUG;V1.23.01相对上一版本,提供ELF文件指令修改,修复ARM MLS指令反汇编错误等BUG;V1.23.00相对上一版本,提供程序地址对应源代码行查询,修复MIPS调试信息错误;V1.22相对上一版本,修复MIPS小端字节序反汇编错误,网上最新版本提示;V1.21相对上一版本,菜单调整,完善64位ELF文件解析,解析调试信息;另部分增强功能的菜单操作设有密码,如有兴趣欢迎咨询。欢迎大家反馈相关软件使用过程中的问题!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值