qeeuly 发表于 2024-4-19 15:53

请教软延时的问题

在main起始就用软延时powerup_delay(),实测延时是8秒。
用的是IAR,优化为none。
看了仿真的汇编,while是3个指令,按理G455上电是HSI 8M时钟,这延时8秒怎么算的?



qintian0303 发表于 2024-4-24 17:17

HSI 8M时钟,你得看后面是不是是否还有分频或者倍频,最后看系统时钟是多少

timfordlare 发表于 2024-5-1 21:27

一般来说,软延时函数会使用一个计数器,在循环中逐渐增加计数器的值,直到达到某个预设的目标值。

jobszheng 发表于 2024-5-1 22:51

这个是一个虚值!

maudlu 发表于 2024-5-2 14:38

尽管优化选项为"None",但编译器可能仍然对代码进行了一定程度的优化。

hudi008 发表于 2024-5-2 16:16

如果 powerup_delay() 函数中的 while 循环体只包含了一个 nop(无操作指令),那么在一个周期为 1/8MHz(即 0.125μs)的硬件时钟下,每个 nop 指令将消耗 0.125μs。

mickit 发表于 2024-5-2 17:06

在8MHz的时钟频率下,每个时钟周期是1/8MHz = 125ns。

uytyu 发表于 2024-5-2 17:54

优化设置为None,但编译器仍然可能进行一些基本的指令重排或优化,这可能会影响循环的实际执行时间。

burgessmaggie 发表于 2024-5-2 20:10

如果循环体只有一个 nop,那么 3 个指令将表示 3 个周期,即 0.375μs。

sesefadou 发表于 2024-5-2 21:49

在延时期间,如果有中断发生或其他外部事件影响了处理器的执行流程,那么实际的延时时间可能会受到影响。

benjaminka 发表于 2024-5-3 09:11

IAR编译优化设置为None,这通常意味着编译器不会对代码进行额外的优化,因此我们可以假设汇编代码与C代码的执行效率大致相当。

pmp 发表于 2024-5-3 12:14

仿真环境可能与实际硬件环境不同,例如,仿真器可能使用不同的时钟源或执行速度。

lzbf 发表于 2024-5-3 15:15

需要查看 powerup_delay() 函数中 while 循环体内的所有指令,并计算它们在一个周期内的执行时间。

juliestephen 发表于 2024-5-3 18:15

需要将时钟频率转换为周期数。对于8MHz的时钟,每个周期是1/8MHz = 0.125μs。

macpherson 发表于 2024-5-4 11:23

一个非常粗略的估计               

nomomy 发表于 2024-5-4 22:28

如果每次while循环迭代消耗3个指令周期,那么在8MHz的时钟下,每次迭代会消耗3个时钟周期的时间。如果我们知道powerup_delay()函数总共执行了多少次这样的迭代,我们就可以用下面的公式来计算总延时:

总延时 = 迭代次数 × 每次迭代的时钟周期数 / 时钟频率

chenjun89 发表于 2024-5-5 14:31

看一下powerup_delay函数里面的代码

plsbackup 发表于 2024-5-6 09:31

将循环体中每个指令的时钟周期数相加,得到每次循环所需的总时钟周期数。然后,乘以循环的次数,得到总时钟周期数。

nomomy 发表于 2024-5-6 12:38

IAR优化设置为none,意味着编译器不会对代码进行优化,这可能会影响执行速度。

sdlls 发表于 2024-5-6 15:46

while循环体包含3个指令。每个指令的执行时间取决于具体的处理器架构和时钟周期。
页: [1] 2 3 4
查看完整版本: 请教软延时的问题