[PIC®/AVR®/dsPIC®产品] avr atmega128,调用不了编写的延时程序

[复制链接]
 楼主| 两只袜子 发表于 2025-2-17 23:00 | 显示全部楼层 |阅读模式
自己编写了一个延时子程序,在主程序中调用时运行不了,但是直接将延时程序中的延时语句拿到主程序可以用。而且在调用自己编写的延时子程序时,编译时必须选为M103模式,并用128模式下载,这样才可以运行自己编写的延时子程序,很是不解,求大神解惑
huahuagg 发表于 2025-2-21 18:16 | 显示全部楼层
// 失效的子程序调用
void delay_ms(uint16_t ms) {
    while(ms--) _delay_ms(1); // 编译器可能优化循环结构
}

// 有效的直接调用
_delay_ms(500); // 直接调用AVR Libc内置延时
huahuagg 发表于 2025-2-21 18:16 | 显示全部楼层
  1. #include <avr/io.h>
  2. #include <util/delay_basic.h>

  3. __attribute__((noinline, optimize("O0")))
  4. void safe_delay_ms(uint16_t ms) {
  5.     for(volatile uint16_t i=0; i<ms; i++) {
  6.         _delay_loop_2(3000); // 精确校准值(F_CPU=16MHz时)
  7.     }
  8. }
花间一壶酒sd 发表于 2025-2-23 00:12 | 显示全部楼层
使用 volatile 关键字防止延时子程序被优化。
小明的同学 发表于 2025-2-23 10:18 | 显示全部楼层
是不少放在了主程序后面了,另外没有在前面声明函数?你放到主函数前试试,或者将声明放在程序前面去。
yuliangren 发表于 2025-3-6 16:25 | 显示全部楼层
ATmega128 有两种编译模式:M103 模式 和 ATmega103 兼容模式。这两种模式会影响芯片的寄存器和内存映射
hhdhy 发表于 2025-3-6 17:33 | 显示全部楼层
M103 模式,ATmega128 以 ATmega103 兼容模式运行,部分寄存器和功能受限。正常模式,ATmega128 以全功能模式运行,支持所有寄存器和功能
gra22ce 发表于 2025-3-6 18:20 | 显示全部楼层
确保在编译时选择 ATmega128 的正常模式,而不是 M103 模式。在编译器(如 AVR Studio 或 Atmel Studio)中正确设置芯片型号为 ATmega128,并禁用 M103 兼容模式。
eleg34ance 发表于 2025-3-6 19:33 | 显示全部楼层
延时子程序的实现可能存在问题,例如:使用了不正确的寄存器或变量。延时循环未优化,导致编译器优化后失效。延时子程序未正确处理中断或全局变量。
twinkhahale 发表于 2025-3-6 22:50 | 显示全部楼层
一般建议使用 _delay_ms() 或 _delay_us() 函数(需包含 <util/delay.h>),这些函数是 AVR Libc 提供的标准延时函数。如果必须自己编写延时子程序,确保使用 volatile 关键字防止编译器优化
hight1light 发表于 2025-3-7 09:10 | 显示全部楼层
ATmega128 的熔丝位配置可能影响程序运行。例如:时钟源配置错误:如果时钟源配置不正确,延时子程序的时间计算会出错。
suiziq 发表于 2025-3-7 10:19 | 显示全部楼层
如果启用了 M103 兼容模式,芯片会以 ATmega103 的模式运行,导致部分功能不可用
tiakon 发表于 2025-3-7 11:27 | 显示全部楼层
检查并正确配置熔丝位:保时钟源配置正确(如使用外部晶振或内部 RC 振荡器)。禁用 M103 兼容模式(清除 M103C 熔丝位)。使用编程工具(如 AVRDUDE 或 Atmel Studio)读取和修改熔丝位
nuan11nuan 发表于 2025-3-7 13:15 | 显示全部楼层
如果延时子程序中使用了局部变量或递归调用,可能导致堆栈溢出,尤其是在资源有限的嵌入式系统中。减少局部变量的使用,尽量使用全局变量或静态变量。确保堆栈空间足够,避免递归调用
星星点点didi 发表于 2025-3-7 18:00 | 显示全部楼层
编译器可能会优化掉未使用的代码,导致延时子程序失效。使用 volatile 关键字声明延时循环中的变量,防止编译器优化。在编译器设置中禁用优化(如 -O0),或调整优化级别。
纠结的那些年 发表于 2025-3-24 19:10 | 显示全部楼层
栈空间不足的问题?
原来是wjc 发表于 2025-4-25 15:47 | 显示全部楼层
在编写延时函数时,如果涉及到全局变量或中断相关的功能,可能会因为中断或者其他外部因素导致延时的控制逻辑被中断或改变,从而导致延时不准或者无法正常执行。
原来是wjc 发表于 2025-4-25 15:48 | 显示全部楼层
可以检查是否在延时函数中使用了全局变量或者中断操作。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2122

主题

8117

帖子

11

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

2122

主题

8117

帖子

11

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