面试题:const 在嵌入式有什么特殊作用?

时间:2020-12-09 12:01:25
原题:const和volatile在c语言中的定义,为什么它们在嵌入式或者实时系统中有非常重要的作用,请举例说明。

7 个解决方案

#1


《程序员面试宝典》

#2


volatile常用于定义代表i/o接口的变量,不允许程序使用该变量的内存拷贝值,因为i/o接口的数据随时可能发生变化。
const一般用于定义只读量-----不允许程序修改!

#3


在嵌入式开发中
const 的数据一般会写在ROM(EPROM)中而非RAM中!!!!!
而volatile一般用于中断中的外部(全局)变量.中断程序可能改变它的值而防编译器做优化.

#4


都说的很好

#5


在嵌入式开发中:
const  声明的为只读变量,程序员不能对其进行修改;
        函数的参数声明为const时,表明此函数不会对这个参数进行修改,
        const能提高程序的可读性,对程序的维护有很大的作用。
        const声明的变量最好在定义的时候就对其赋予初值,不然在后面的程序中是不能改变其的值的。
     例如: const  int  a = 1; 在后面的程序中,程序员不能在改变a的值,如:a = 2;
这样是不允许的。
            const  int *p; 指针P所指向的变量的值不能改变,p的值可以改变;
            int * const p;  指针p所指向的值可以改变,p的值不能改变,
           const  int * const p; 指针p指向的值不能改变,p的值也不能改变;
volatile: 
        在两种特殊的情况下需要使用volatile修饰符:第一种情况涉及到内存映射硬件(memory-mapped hardware,如图形适配器,这类设备对计算机来说就好象是内存的一部分一样),第二种情况涉及到共享内存(shared memory,即被两个以上同时运行的程序所使用的内存)。
你可以去迅雷上下载《C语言编程常见问题解答》里面有很好的讲述。

#6


转载一段话:

例如:
volatile int i=10;
int a = i;
...
//其他代码,并未明确告诉编译器,对i进行过操作

int b = i;
  
volatile 指出 i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取,因而编

译器生成的汇编代码会重新从i的地址读取数据放在b中。而优化做法是,由于编译器发现两次从

i读数据的代码之间的代码没有对i进行过操作,它会自动把上次读的数据放在b中,而不是重新

从i里面读。这样以来,如果i是一个寄存器变量或者表示一个端口数据就容易出错,所以说vola

tile可以保证对特殊地址的稳定访问。

#7


1). 关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的。) 
2). 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。 
3). 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。

#1


《程序员面试宝典》

#2


volatile常用于定义代表i/o接口的变量,不允许程序使用该变量的内存拷贝值,因为i/o接口的数据随时可能发生变化。
const一般用于定义只读量-----不允许程序修改!

#3


在嵌入式开发中
const 的数据一般会写在ROM(EPROM)中而非RAM中!!!!!
而volatile一般用于中断中的外部(全局)变量.中断程序可能改变它的值而防编译器做优化.

#4


都说的很好

#5


在嵌入式开发中:
const  声明的为只读变量,程序员不能对其进行修改;
        函数的参数声明为const时,表明此函数不会对这个参数进行修改,
        const能提高程序的可读性,对程序的维护有很大的作用。
        const声明的变量最好在定义的时候就对其赋予初值,不然在后面的程序中是不能改变其的值的。
     例如: const  int  a = 1; 在后面的程序中,程序员不能在改变a的值,如:a = 2;
这样是不允许的。
            const  int *p; 指针P所指向的变量的值不能改变,p的值可以改变;
            int * const p;  指针p所指向的值可以改变,p的值不能改变,
           const  int * const p; 指针p指向的值不能改变,p的值也不能改变;
volatile: 
        在两种特殊的情况下需要使用volatile修饰符:第一种情况涉及到内存映射硬件(memory-mapped hardware,如图形适配器,这类设备对计算机来说就好象是内存的一部分一样),第二种情况涉及到共享内存(shared memory,即被两个以上同时运行的程序所使用的内存)。
你可以去迅雷上下载《C语言编程常见问题解答》里面有很好的讲述。

#6


转载一段话:

例如:
volatile int i=10;
int a = i;
...
//其他代码,并未明确告诉编译器,对i进行过操作

int b = i;
  
volatile 指出 i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取,因而编

译器生成的汇编代码会重新从i的地址读取数据放在b中。而优化做法是,由于编译器发现两次从

i读数据的代码之间的代码没有对i进行过操作,它会自动把上次读的数据放在b中,而不是重新

从i里面读。这样以来,如果i是一个寄存器变量或者表示一个端口数据就容易出错,所以说vola

tile可以保证对特殊地址的稳定访问。

#7


1). 关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的。) 
2). 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。 
3). 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。