单片机岗位常见面试问题——C语言(1)
一、static关键字
1.static关键字的作用?
static是被声明为静态类型的变量,存储在静态区(全局区)中,其生命周期为整个程序。静态局部变量,其作用域为一对{ }内,静态全局变量,其作用域为当前文件。静态函数,其作用域为当前文件,不能作为接口暴露给其他文件。静态变量如果没有被初始化,则自动初始化为0。
2.为什么 static变量只初始化一次?
对于所有的对象(不仅仅是静态对象),初始化都只有一次,而由于静态变量具有“记忆”功能,初始化后,一直都没有被销毁,都会保存在内存中的静态区,所以不会再次初始化。存放在静态区的变量的生命周期一般比较长,它与整个程序“同生死、共存亡”,所以它只需初始化一次。而auto变量,即自动变量,由于它存放在栈区,一旦函数调用结束,就会立刻被销毁。
二、const关键字
1.定义变量(全局变量、局部变量)为常量
当const修饰局部变量时,存储在栈中,生命周期为函数调用期间,编译器会保护它不能被直接修改,但是还可以通过指针间接修改它的值。
当const修饰全局变量时,存储在flash的rodata区域,生命周期为整个程序运行期间,有编译器和硬件的双重保护, 可能因为试图写入只读内存区域而崩溃,导致段错误(非法内存保护)。
3.修饰指针
常量指针与指针常量,* (指针)和 const(常量) 谁在前先读谁 ;*象征着地址,const象征着内容;谁在前面谁就不允许改变。
常量指针:不能通过这个指针改变变量的值
指针常量:指针本身是个常量,不能在指向其他的地址
3.修饰函数的参数
表示在函数体内不能修改这个参数的值。
三、volatile关键字
1.详解:
CPU读取数据时,会从指定地址处取值并搬运到CPU通用寄存器中处理,对于频繁的操作,编译器会将代码的汇编指令进行优化,这个关键字就是告诉编译器每次存取该变量的时候都要从内存去存取而不是使用它之前在寄存器中的备份。
2.作用:
防止编译器对变量进行优化,每次从内存或对应外设寄存器中取值放入CPU通用寄存器后进行操作 。
例子如下:
// 比如要往某一地址送两指令:
int *ip = 0x12345678; //设备地址
*ip = 1; //第一个指令
*ip = 2; //第二个指令
// 编译器可能优化为:
int *ip = 0x12345678; //设备地址
*ip = 2; //第二个指令
// 造成第一条指令被忽略
volatile int *ip = 0x12345678; //设备地址
*ip = 1; //第一个指令
*ip = 2; //第二个指令
3.场合:
寄存器、临界区访问的变量、中断函数访问的全局或static变量
4.Note:
对于高性能的单片机比如cortex m7系列和cortex A系列存在cache缓存,从内存到cpu需要经过cache,此时用volatile修饰可能起不到作用,因为volatile只是对编译器的约束,如果cache没有更新,那么实际上搬运到寄存器的值来自于cache缓存,这个时候需要禁用cache。#通信硬件知识分享#
包括c语言常见知识和语法,数据结构,通信协议,STM32,计算机体系结构和硬件,freertos等等