for循环延时时间计算

文章目录

  • 前言
  • 一、计算方式
  • 二、for循环
    • 2.1 for循环里定义变量
    • 2.2 codeblock设置C99标准
  • 三、
  • 四、
  • 总结

前言

之前做led点亮的实验,好像是被delay函数影响了,因为delay参数设置的不对,led没有正常闪烁。现在就想搞明白一些。

一、计算方式

1.1 阶段一

百度了一些文档,好像并没有专门取说明这一块的。

然后看了一篇帖子,相对说的比较清晰一些。

他看了for循环的汇编指令,

for(; nCount != 0; nCount–);
0x08000206 E000 B 0x0800020A
0x08000208 1E40 SUBS r0,r0,#1
0x0800020A 2800 CMP r0,#0x00
0x0800020C D1FC BNE 0x08000208

有3个指令,SUBS、CMP、BNE。其中SUBS和CMP都是单指令,BNE是3个机器周期。所以一条for循环一个指令周期需要5个机器周期。机器周期为主频的倒数。

如果时钟频率是72M,(1M = 1 * 10^6),那么机器周期就是t = 1 / 72M。

1s = 1000ms(毫秒),

1ms = 1000us(微秒),

1us= 1000ns(纳秒)。

所以一个机器周期t = 1.39 * 10 ^ -8s = 13.8ns;

一个for循环5个机器周期,所以一个指令周期 t2 = 69ns;

所以如果按照代码里的参数count=0xFFFFF的话, 循环时间就是t = 69ns * 1048575 = 72351675ns = 0.072s。

与预期不符。


2024年1月25日00:05:10更新
在做RCC实验的时候,用protues观察,使用的时钟是72M,在延时中使用0xFFFFF延时,在protues中计算得出t=1370ms-588ms=782ms。跟计算的0.072s很接近啊!
for循环延时时间计算_第1张图片
下面是代码情况

void rcc_led_loop()
{
	led_on();
	Delay_rcc(0xfffff);
	led_off();
	Delay_rcc(0xfffff);
}

以上为更新内容


但是如果主频按照8M来算,使用count = 1600000来for循环,时间为0.9936s。

1.2、阶段2

    STM32系列芯片(Cortex-M3)有三级流水线,指令周期不定,ARM给出的Cortex-M3核单片机的平均执行速度是1.25MIPS/Mhz。

MIPS的全称是Million Instructions Per Second,每秒百万指令(西方或者国际上的计量体系中1M(兆)=100万=1000000);Mhz,是指单片机CPU的主频兆赫兹。
  MIPS/Mhz的意思是(单片机CPU的主频)每兆赫兹下(单片机的指令执行速度)每秒执行1M(兆)条指令。比如,ARM官方给出的STM32F103x系列单片机的平均执行速度是1.25MIPS/Mhz,如果设置单片机A的主频为72MHz,那么单片机A的执行速度=1.25*72=90MIPS,即每秒执行90M条指令,一条指令的执行时间为1/90us=0.011us=11ns。注意,官方说的1.25DMIPS/MHz,是通过测试一些算法来实现的,不是实际测试硬件的结果,只能作为大概的一个参考。
  CPU执行中断时需要时间的,如入栈,出栈,以及其他处理,都需要时间!一般情况下,STM32的中断性能不超过500Khz,也就是中断间隔达到2us一次时,不管你中断函数多精简,基本上CPU就不会干其他什么事情了,因为它都在进出中断了。
  单条指令执行时间:STM32F10X单片机在主频为72MHz下,C语言程序执行一条指令需要的时间可认为10ns~100ns。

目前觉得指令是汇编指令。

1.3 参考

STM32-基于汇编来分析延时-电子工程世界

https://www.cnblogs.com/hanzg/p/16706886.html

二、for循环

2.1 for循环里定义变量

C89不能在for循环定义变量,C99支持。如果用gcc编译程序会报错,gcc是C89标准的。

​​​​​​​​​​for循环延时时间计算_第2张图片

codeblock验证是这样的。

2.1 codeblock设置C99标准

设置compiler设置成C99可以正常编译
​​for循环延时时间计算_第3张图片

应该是选择了GNU GCC Compiler的C99标准

之前还在思考为什么codeblock可以根据代码是C还是C++来选择编译器。今天突然发现了原因

就是设置里面的Toolchain executables菜单下面设置的。

for循环延时时间计算_第4张图片

mingW 是一个开源的 符合 linux 下 c/c++习惯的windows平台的编译器,其集成了gcc。在最新的版本4.7.2 中,支持c++11。

下面这个帖子讲的是static-libgcc的相关知识,比较多,看的晕

Linux 动态库和静态库-CSDN博客

2.2 codeblock设置头文件路径

for循环延时时间计算_第5张图片

2.2 for循环汇编指令

用vs查看for循环汇编指令

开始调试——右击选择转到反汇编

for循环延时时间计算_第6张图片

其中跳转指令会用好几个机器周期。

总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

你可能感兴趣的:(STM32,stm32)