您的位置 首页 芯闻

嵌入式C语言中const与volatile的用法详解

const最主要的特点就是只读,有常量、常量指针,如果不是特别小心的分析C语言语句的书写格式,再加上指针的使用,就特别容易弄错。volatile

const最主要的特色便是只读,有常量、常量指针,假如不是特别当心的剖析C言语句子的书写格局,再加上指针的运用,就特别简单弄错。
volatile关键字是一个类型修饰符,用它声明的类型变量表明能够被某些编译器不知道的要素更改,比方:操作体系、硬件或许其它线程等。遇到这个关键字声明的变量,编译器对拜访该变量的代码就不再进行优化,然后能够供给对特别地址的安稳拜访;假如不运用valatile,则编译器将对所声明的句子进行优化。之所以优化是因为拜访寄存器要比拜访内存单元快得多。可是优化之后简单呈现问题,例如现在要直接对内存地址单元的内容修正,假如持续运用未通过valatile声明的变量,则读到的值有或许是寄存器中未通过修正的值,但原意是要读发生变化后的数值,所以会呈现意想不到的过错。而经valatile声明的变量,每次拜访该变量时都会从内存单元中从头读取。
const常常用于声明不希望被其它程序修正的常量;volatile常常用于声明因意外而或许发生改动的变量。
下面具体剖析两个变量的用法:
1、const
关键字const有什么含义?
我只需一听到被面试者说:“const意味着常数”,我就知道我正在和一个业余者打交道。其实只需能说出const意味着“只读”就能够了。虽然这个答案不是彻底的答案,但我承受它作为一个正确的答案。假如应试者能正确答复这个问题,我将问他一个附加的问题:
下面的声明都是什么意思?
const int a;
int const a;
const int *a;
int * const a;
int const * a const;
前两个的作用是相同,a是一个常整型数;第三个意味着a是一个指向常整型数的指针(也便是,整型数是不行修正的,但指针能够);第四个意思a是一个指向整型数的常指针(也便是说,指针指向的整型数是能够修正的,但指针是不行修正的);最终一个意味着a是一个指向常整型数的常指针(也便是说,指针指向的整型数是不行修正的,一起指针也是不行修正的)。假如应试者能正确答复这些问题,那么他就给我留下了一个好形象。
2、volatile
关键字volatile有什么含义?并给出三个不同的比如。
一个界说为volatile的变量是说该变量或许会被意想不到地改动,这样,编译器就不会去假定该变量的值了。精确地说,优化器在用到该变量时有必要每次都当心肠从头读取这个变量的值,而不是运用保存在寄存器里的备份。下面是volatile变量的几个比如:
(1) 并行设备的硬件寄存器(如:状况寄存器)
(2) 一个中止服务子程序中会拜访到的非主动变量
(2) 多线程使用中被几个使命同享的变量
答复不出这个问题的人是不会被雇佣的。我以为这是区别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/news/xinwen/257557.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部