stm32经典笔试题_STM32笔试题笔记
⼀个变量既可以定义为const也可以定义为volatile(√)
例如只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
⼀个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。
精确地说就是,优化器在⽤到这个变量时必须每次都⼩⼼地重新读取这个变量的值,⽽不是使⽤保存在寄存器⾥的备份。
volatile修饰符告诉complier变量值可以以任何不被程序明确指明的⽅式改变,最常见的例⼦就是外部端⼝的值,
它的变化可以不⽤程序内的任何赋值语句就有可能改变的,这种变量就可以⽤volatile来修饰,complier不会优化掉它。
const修饰的变量在程序⾥⾯是不能改变的,但是可以被程序外的东西修改,就象上⾯说的外部端⼝的值,
如果仅仅使⽤const,有可能编译器会优化掉这些变量,加上volatile就万⽆⼀失了。
#include
int main (void)
{
register static int i = 0;
printf ("%d\n", i);
return 0;
}
报错如下:
error: multiple storage class in declaration of `i'
error: invalid register name for 'i'
-->声明“ i”时有多个存储类
register和static关键字如下解释:
register修饰的变量,将该变量尽可能存放在CPU中的寄存器中。可省去CPU从内存抓取数据的时间,提⾼了运⾏效率。
register使⽤时注意事项:
(1):只能修饰局部变量,不能修饰全局变量。不能修饰函数。
(2):不能取这个变量的地址。(register修饰的变量,是将变量保存在CPU的寄存器中,⽽不在内存中,只有内存中才能取地址)
(3):只能修饰CPU能接收的数据类型。意味着寄存器变量是⼀单个变量,变量长度应该⼩于寄存器长度。
static修饰的变量存储在内存中全局数据区中的静态区;修饰局部变量,延长局部变量的⽣命周期,⽣
命周期直到整个程序执⾏结束,但是不改变局部变量的作⽤域。修饰全局变量和函数,改变全局变量和函数的作⽤域。
static的作⽤:
(1):修饰全局变量,该变量只能被本⽂件调⽤,不能被别的⽂件调⽤。
(2):修饰函数,这个函数只能被本⽂件内被其他函数调⽤,不能被别的⽂件调⽤。
总结:register和static不能⼀起使⽤修饰⼀个变量,相当于定义了⼀个变量在两个区域(内存和CPU寄存器中)