延时函数中的volatile

本文介绍了一种在程序中实现延时功能的方法,并详细解释了如何通过添加volatile关键字来确保循环中的计数器不被编译器优化,从而达到预期的延时效果。

今天调试程序时候,写了一个延时函数竟然发现没有延时作用,如下:


  static void delay(void) //static 作用:函数隐藏    变量持久和默认0
{

unsigned int i, j;

for(i=0; i<5000; i++)
for(j=0; j<1000; j++);
}

注:调试时没有延时作用


解决办法:

static void delay(void) //static 作用:函数隐藏    变量持久和默认0
{
volatile  unsigned int i, j;

for(i=0; i<5000; i++)
for(j=0; j<1000; j++);
}

注:当加上volatile关键字时,不对无符号整型i, j进行优化。问题就解决了

虽然给定的参考引用中未提及Atmega延时函数的写法,但一般在Atmega单片机中,有多种方式可以实现延时函数。 ### 软件延时 软件延时是通过执行一些无实际意义的指令来消耗时间,从而达到延时的目的。以下是一个简单的Atmega软件延时函数的示例代码: ```c #include <avr/io.h> // 简单的软件延时函数 void delay_ms(unsigned int ms) { unsigned int i, j; for (i = 0; i < ms; i++) { for (j = 0; j < 1000; j++) { // 空操作,消耗时间 __asm__("nop"); } } } int main(void) { // 初始化相关操作 // 调用延时函数 delay_ms(1000); // 延时1秒 return 0; } ``` ### 定时器延时 使用定时器可以实现更精确的延时。以下是一个使用定时器0实现延时的示例: ```c #include <avr/io.h> #include <avr/interrupt.h> volatile unsigned int timer_overflows = 0; // 定时器0溢出中断服务函数 ISR(TIMER0_OVF_vect) { timer_overflows++; } // 延时函数,单位为毫秒 void delay_ms(unsigned int ms) { // 设置定时器0为正常模式 TCCR0A = 0; // 设置预分频器为1024 TCCR0B = (1 << CS02) | (1 << CS00); // 使能定时器0溢出中断 TIMSK0 = (1 << TOIE0); // 全局中断使能 sei(); timer_overflows = 0; unsigned int target_overflows = ms * (F_CPU / 1024 / 256); while (timer_overflows < target_overflows) { // 等待定时器溢出达到目标次数 } // 关闭定时器0 TCCR0B = 0; } int main(void) { // 初始化相关操作 // 调用延时函数 delay_ms(1000); // 延时1秒 return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值