姓名:王重月 学号:21021211019 学院:电子工程学院
转自:(30条消息) 嵌入式面经_Oliver.H的博客-CSDN博客_嵌入式面经
【嵌牛导读】volatile、引用指针、static等知识。
【嵌牛鼻子】volatile,引用、指针
【嵌牛提问】volatile有什么含义?引用和指针有什么区别?
【嵌牛正文】volatile原理:
Volatile意思是“易变的”,应该解释为“直接存取原始内存地址”比较合适。 “易变”是因为外在因素引起的,像多线程,中断等;
C语言书籍这样定义volatile关键字:volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,告诉编译器对该变量不做优化,都会直接从变量内存地址中读取数据,从而可以提供对特殊地址的稳定访问。。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。(简洁的说就是:volatile关键词影响编译器编译的结果,用volatile声明的变量表示该变量随时可能发生变化,与该变量有关的运算,不要进行编译优化,以免出错)
下面是volatile变量的几个例子:
1). 并行设备的硬件寄存器(如:状态寄存器)
2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
3). 多线程应用中被几个任务共享的变量
回答不出这个问题的人是不会被雇佣的。我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。嵌入式系统程序员经常同硬件、中断、RTOS等等打交道,所用这些都要求volatile变量。不懂得volatile内容将会带来灾难。
几个问题:
1)一个参数既可以是const还可以是volatile吗?
可以的,例如只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
2) 一个指针可以是volatile 吗?
可以,当一个中服务子程序修改一个指向buffer的指针时。
3). 下面的函数有什么错误:
这段代码的目的是用来返指针ptr指向值的平方,但是,由于ptr指向一个volatile型参数,编译器将产生类似下面的代码:
由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下
注意:频繁地使用volatile很可能会增加代码尺寸和降低性能,因此要合理的使用volatile。
引用和指针有什么区别
1)引用必须被初始化,指针不必。
2)引用初始化以后不能被改变,指针可以改变所指的对象。
3)不存在指向空值的引用,但是存在指向空值的指针。
.h头文件中的ifndef/define/endif 的作用?
防止该头文件被重复引用。
全局变量和局部变量的区别?
1.全局变量储存在静态数据区,局部变量在堆栈中。
2.全局变量的生命周期是整个函数区间,局部变量的生命周期是声明该变量的函数区间。
全局变量和静态全局变量的区别?
1.全局变量和静态全局变量都存储在静态数据区
2.全局变量的作用域是整个函数,静态全局变量的作用域是**声明该变量的模块*
3.static全局变量只初使化一次*
static函数与普通函数?
static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
问:A.c 和B.c两个c文件中使用了两个相同名字的static变量,编译的时候会不会有问题?这两个static变量会保存到哪里(栈还是堆或者其他的)?
答:static的全局变量,表明这个变量仅在本模块中有意义,不会影响其他模块。
他们都放在数据区,但是编译器对他们的命名是不同的。
如果要使变量在其他模块也有意义的话,需要使用extern关键字。
不能做switch()的参数类型?
不支持float,double,string
————————————————
版权声明:本文为CSDN博主「Oliver.H」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43253519/article/details/107523751