[N32G45x] 请教软延时的问题

[复制链接]
 楼主| qeeuly 发表于 2024-4-19 15:53 | 显示全部楼层 |阅读模式
ma, 341, We, HIL, 455, AC
在main起始就用软延时powerup_delay(),实测延时是8秒。
用的是IAR,优化为none。
看了仿真的汇编,while是3个指令,按理G455上电是HSI 8M时钟,这延时8秒怎么算的?

222.png

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个指令。每个指令的执行时间取决于具体的处理器架构和时钟周期。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

43

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部