您的位置 首页 发布

单片机C语言中volatile的效果

一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变

一个界说为volatile的变量是说这变量或许会被意想不到地改动,这样,编译器就不会去假定这个变量的值了。精确地说便是,优化器在用到这个变量时有必要每次都小心肠从头读取这个变量的值,而不是运用保存在寄存器里的备份。下面是volatile变量的几个比如:
1). 并行设备的硬件寄存器(如:状况寄存器)
2). 一个中止服务子程序中会访问到的非主动变量(Non-automatic variables)
3). 多线程使用中被几个使命同享的变量
答复不出这个问题的人是不会被雇佣的。我以为这是区别C程序员和嵌入式体系程序员的最基本的问题。嵌入式体系程序员常常同硬件、中止、RTOS等等打交道,所用这些都要求volatile变量。不懂得volatile内容将会带来灾祸。
假定被面试者正确地答复了这是问题(嗯,置疑这否会是这样),我将略微深究一下,看一下这家伙是不是直正懂得volatile彻底的重要性。
1). 一个参数既可所以const还可所以volatile吗?解说为什么。
2). 一个指针可所以volatile 吗?解说为什么。
3). 下面的函数有什么过错:
int square(volatile int *ptr)
{
return *ptr * *ptr;
}
下面是答案:
1). 是的。一个比如是只读的状况寄存器。它是volatile因为它或许被意想不到地改动。它是const因为程序不应该企图去修正它。
2). 是的。虽然这并不很常见。一个比如是当一个中服务子程序修该一个指向一个buffer的指针时。
3). 这段代码的有个恶作剧。这段代码的意图是用来返指针*ptr指向值的平方,可是,因为*ptr指向一个volatile型参数,编译器将发生相似下面的代码:
int square(volatile int *ptr)
{
int a,b;
a = *ptr;
b = *ptr;
return a * b;
}
因为*ptr的值或许被意想不到地该变,因而a和b或许是不同的。成果,这段代码或许返不是你所希望的平方值!正确的代码如下:
long square(volatile int *ptr)
{
int a;
a = *ptr;
return a * a;
}
//———————————–

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/fabu/261310.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部