求助avr单片机子程序问题
1个回答
2018-03-30 · 知道合伙人互联网行家
关注
展开全部
你这个问题其实和AVR单片机没关系,任何一个MCU都可以采用类似的代码。
在C语言里,有值传递这个概念,这是因为编译器会优化程序,为变量做一个拷贝值。这样呢,cpu在计算这个值时,直接去取拷贝值,而不用去计算这个值的地址,然后寻址,再去取这个值,从而节省了一定的指令周期。但是,有一个隐患,这个变量的拷贝值和这个变量的真实值不一定是一样的。比如,当中断发生时,cpu会将所有变量入栈去执行中断服务子程序,然后返回到主程序。在这个过程中,如果中断服务子程序修改了某个公共变量,主程序是不知道的,因为主程序会调用入栈前的拷贝值。
volatile就是告诉编译器,不要优化,不要拷贝,而是让cpu寻址取值。
FLAG是一个全军变量,它既在主程序中使用,又在串口接收中断服务程序中使用,所以要用volatile修饰,告诉cpu取真实值
在C语言里,有值传递这个概念,这是因为编译器会优化程序,为变量做一个拷贝值。这样呢,cpu在计算这个值时,直接去取拷贝值,而不用去计算这个值的地址,然后寻址,再去取这个值,从而节省了一定的指令周期。但是,有一个隐患,这个变量的拷贝值和这个变量的真实值不一定是一样的。比如,当中断发生时,cpu会将所有变量入栈去执行中断服务子程序,然后返回到主程序。在这个过程中,如果中断服务子程序修改了某个公共变量,主程序是不知道的,因为主程序会调用入栈前的拷贝值。
volatile就是告诉编译器,不要优化,不要拷贝,而是让cpu寻址取值。
FLAG是一个全军变量,它既在主程序中使用,又在串口接收中断服务程序中使用,所以要用volatile修饰,告诉cpu取真实值
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询