volatile在嵌入式系统中应用中的迷惑?
网上有人是这么说的:“1、中断服务程序中修改的供其它程序检测的变量需要加volatile;2、多任务环境下各任务间共享的标志应该加volatile;3、存储器映射的硬件寄...
网上有人是这么说的:“1、中断服务程序中修改的供其它程序检测的变量需要加volatile;2、多任务环境下各任务间共享的标志应该加volatile;3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义”
能举个具体的例子吗,特别是对于第1和第三条说明举例 展开
能举个具体的例子吗,特别是对于第1和第三条说明举例 展开
展开全部
也在持续的学习volatile并完善中…这里说说我的理解(参考《C语言深度解剖》):
首先看看这个例子:
int i = 10;
int j = i; ①
int k = i; ②
由于编译器对代码进行优化(听说优化功能是可以关掉的),由于①②两条语句间i没有被用作左值另行赋值,编译器认为i的值没有改变;在执行①语句的时候,从内存中取出i赋给j,而在继续执行②语句的时候,继续用这个取出的值赋给k——而问题出在这里,如果在执行①之后,中断来了,改变了i的值,这时候跳出中断继续执行②的话,赋给k的还是之前取出的那个值,并不是被中断改变的那个新的值;而如果i声明了volatile类型的话,编译器不会对它进行优化,这样每次用i来给其他变量j、k赋值的时候,都是“不厌其烦”地冲内存中取一遍i的值,这样,即使中断或者其他共享进程改变了这个volatile类型的i值,每次用它的时候都能确保用到它的最新的值。
加油!
首先看看这个例子:
int i = 10;
int j = i; ①
int k = i; ②
由于编译器对代码进行优化(听说优化功能是可以关掉的),由于①②两条语句间i没有被用作左值另行赋值,编译器认为i的值没有改变;在执行①语句的时候,从内存中取出i赋给j,而在继续执行②语句的时候,继续用这个取出的值赋给k——而问题出在这里,如果在执行①之后,中断来了,改变了i的值,这时候跳出中断继续执行②的话,赋给k的还是之前取出的那个值,并不是被中断改变的那个新的值;而如果i声明了volatile类型的话,编译器不会对它进行优化,这样每次用i来给其他变量j、k赋值的时候,都是“不厌其烦”地冲内存中取一遍i的值,这样,即使中断或者其他共享进程改变了这个volatile类型的i值,每次用它的时候都能确保用到它的最新的值。
加油!
展开全部
在嵌入式中的意思是不优化,即地址不变,尤其是在设置寄存器的时候,一定要用上的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
volatile的意思是说明这个变量是可能被别的程序或者本程序的其他线程修改的,这样编译器就不能优化它,每次读取都从地址中获取。如果不这样声明的话编译器可以把它缓冲在寄存器中的,这样别的程序修改了它,而寄存器里面的值却是原先的,会发生你不想要的结果。而上面三种情况都是这种可能在本程序或者本线程外被修改的情况,所以要加它。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询