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

一、环境

gd32f450i + keil + ST-link

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

运行时的系统时钟为200MHz

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

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

STM32 KEIL使用仿真器计算程序运行时间_第1张图片

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

STM32 KEIL使用仿真器计算程序运行时间_第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

STM32 KEIL使用仿真器计算程序运行时间_第3张图片

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

四、分析

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

STM32 KEIL使用仿真器计算程序运行时间_第4张图片

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

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

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

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

你可能感兴趣的:(stm32,单片机,arm)