[经验分享] 单片机延时问题20问

[复制链接]
pixhw 发表于 2025-6-12 21:58 | 显示全部楼层
使用volatile修饰循环变量,防止编译器优化。
plsbackup 发表于 2025-6-12 22:43 | 显示全部楼层
阻塞会导致主程序无法响应中断或执行其他任务
bartonalfred 发表于 2025-6-16 09:45 | 显示全部楼层
通过硬件计时,精度可达微秒级              
adolphcocker 发表于 2025-6-16 12:24 | 显示全部楼层
中断中长时间延时会阻塞其他中断,导致系统异常。
i1mcu 发表于 2025-6-16 14:07 | 显示全部楼层
晶振频率偏差或通信时序错误。              
 楼主| minzisc 发表于 2025-6-16 15:21 | 显示全部楼层
受晶振和编译器影响,难以实现高精度延时。
elsaflower 发表于 2025-6-16 16:30 | 显示全部楼层
循环执行时间受编译器优化              
sesefadou 发表于 2025-6-16 17:47 | 显示全部楼层
不同编译器(Keil、IAR、GCC)对延时函数的优化策略不同:

​​Keil​​:默认开启优化(-O2),可能删除空循环,需用volatile或_nop_()强制保留。
​​GCC​​:优化级别更高(如-Os),需通过__asm__插入汇编指令确保延时。
​​IAR​​:类似Keil,需使用#pragma optimize = none关闭优化。
wengh2016 发表于 2025-6-16 20:09 | 显示全部楼层
// 软件延时(粗略估计,受编译器优化和时钟频率影响)
void delay_ms(unsigned int ms) {
    for (unsigned int i = 0; i < ms; i++) {
        for (volatile unsigned int j = 0; j < 1000; j++); // 调整循环次数
    }
}
wilhelmina2 发表于 2025-6-16 21:48 | 显示全部楼层
编译器优化导致循环被精简。              
elsaflower 发表于 2025-6-16 22:41 | 显示全部楼层
用PWM模块输出特定占空比信号,通过调节周期实现延时
belindagraham 发表于 2025-6-17 10:38 | 显示全部楼层
可以通过定时器中断和任务调度器来实现多任务延时,每个任务有自己的延时计数器。
jonas222 发表于 2025-6-17 11:16 | 显示全部楼层
软件延时是通过程序循环(如for/while)或调用延时函数(如delay_ms())让CPU“空转”,消耗时间以达到延时目的。
bartonalfred 发表于 2025-6-17 11:49 | 显示全部楼层
如何避免延时导致的资源竞争              
primojones 发表于 2025-6-17 12:27 | 显示全部楼层
禁用特定优化选项(如-O0),但慎用以免影响性能。
usysm 发表于 2025-6-17 12:58 | 显示全部楼层
延时时间与晶振频率直接相关。例如12MHz晶振下,机器周期为1μs;6MHz晶振下为2μs。需根据晶振调整循环次数或定时器初值。
 楼主| minzisc 发表于 2025-6-17 14:08 | 显示全部楼层
不同单片机的指令周期、编译器优化规则不同
bartonalfred 发表于 2025-6-17 15:03 | 显示全部楼层
编译器优化可能删除空循环。              
pentruman 发表于 2025-6-17 15:43 | 显示全部楼层
如何计算软件延时的实际时间?              
houjiakai 发表于 2025-6-17 16:21 | 显示全部楼层
用定时器中断实现延时,避免在主循环中阻塞
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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