STM32 KEIL使用仿真器计算程序运行时间

一、环境

gd32f450i + keil + ST-link

编译器版本:V5.06 ,优化等级 -o0

运行时的系统时钟为200MHz

二、如何让仿真的时候可以显示正确的时间。

1. 在仿真器配置界面里设置core clock与单片机的运行时钟相同

2. 开启仿真后就可以看到时间运行时间

3. 但是上面的时间最小的分辨率为10ns,以GD32F450 200MHz主频为例,一个时钟周期为5ns,所以如果想要更精确的时间那么在第一步仿真器配置上,应当适当缩小,那么仿真得到的时间就以相应的倍数增大了。

三、验证

1. 写一段简单的代码去让GPIO翻转,通过示波器查看

代码如下:

    for(;;) {
        GPIO_BC(GPIOB) = GPIO_PIN_15;
        for(int i = 1000; i != 0; --i);
        GPIO_BOP(GPIOB) = GPIO_PIN_15;
        for(int i = 1000; i != 0; --i);  
    } 

通过仿真器运行一个循环为45.12us

 测得波形为45.1us,考虑到有测量误差,认为还是很准确的。

四、分析

上面的C代码通过反汇编得到以下的汇编代码

 不算NOP,里面一个周期指令为 MOV、ADD、SUB,BEQ、CMP 其余的指令为两个周期指令。

从上到下,通过计算的到一共 6 (第一个赋值)+ 4005(第一个for循环) + 6 (第二个赋值) + 5006(第二个for循环) = 9023 个指令

一个指令周期为5ns,那么一共是 9025* 5ns = 45.115us,与上面测的一致。 

通过上面的计算可以发现:如果以C语言的角度去考虑会认为:高电平的时间和低电平的时间应该相等才对。但从波形上看显然是不相等的,通过计算也可以得到第二个for循环比第一个for循环多了1001个时钟周期!所以有时候程序出了问题,又找不到问题,可以查看反汇编。

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值