请教软延时的问题
在main起始就用软延时powerup_delay(),实测延时是8秒。用的是IAR,优化为none。
看了仿真的汇编,while是3个指令,按理G455上电是HSI 8M时钟,这延时8秒怎么算的?
HSI 8M时钟,你得看后面是不是是否还有分频或者倍频,最后看系统时钟是多少 一般来说,软延时函数会使用一个计数器,在循环中逐渐增加计数器的值,直到达到某个预设的目标值。 这个是一个虚值!
尽管优化选项为"None",但编译器可能仍然对代码进行了一定程度的优化。 如果 powerup_delay() 函数中的 while 循环体只包含了一个 nop(无操作指令),那么在一个周期为 1/8MHz(即 0.125μs)的硬件时钟下,每个 nop 指令将消耗 0.125μs。 在8MHz的时钟频率下,每个时钟周期是1/8MHz = 125ns。 优化设置为None,但编译器仍然可能进行一些基本的指令重排或优化,这可能会影响循环的实际执行时间。 如果循环体只有一个 nop,那么 3 个指令将表示 3 个周期,即 0.375μs。 在延时期间,如果有中断发生或其他外部事件影响了处理器的执行流程,那么实际的延时时间可能会受到影响。 IAR编译优化设置为None,这通常意味着编译器不会对代码进行额外的优化,因此我们可以假设汇编代码与C代码的执行效率大致相当。 仿真环境可能与实际硬件环境不同,例如,仿真器可能使用不同的时钟源或执行速度。 需要查看 powerup_delay() 函数中 while 循环体内的所有指令,并计算它们在一个周期内的执行时间。 需要将时钟频率转换为周期数。对于8MHz的时钟,每个周期是1/8MHz = 0.125μs。 一个非常粗略的估计 如果每次while循环迭代消耗3个指令周期,那么在8MHz的时钟下,每次迭代会消耗3个时钟周期的时间。如果我们知道powerup_delay()函数总共执行了多少次这样的迭代,我们就可以用下面的公式来计算总延时:
总延时 = 迭代次数 × 每次迭代的时钟周期数 / 时钟频率 看一下powerup_delay函数里面的代码 将循环体中每个指令的时钟周期数相加,得到每次循环所需的总时钟周期数。然后,乘以循环的次数,得到总时钟周期数。 IAR优化设置为none,意味着编译器不会对代码进行优化,这可能会影响执行速度。 while循环体包含3个指令。每个指令的执行时间取决于具体的处理器架构和时钟周期。