嵌入式C语言学习---类型修饰符
一、类型修饰符可以修饰变量存放的范围,对内存存放资源位置的限定
类型修饰符有:
auto register static const extern volatile
(资料图片)
相当于把变量放在可读可写的内存区域,也是最常见的!
例如: auto int a;
如果这个区域用{ }包围,表示在栈空间!
限制变量定义在寄存器上的修饰符,一些快速访问的变量可以用register
register int a;
编译器会尽量的安排CPU的寄存器去存放这个4个字节的,如果寄存器不足时,a还是放在内存(存储器)中。
&(取地址符号)对register不起作用
内存【存储器】 寄存器
Ox100 RO,R2
例如:
#include <>
int main()
{
register int a ;
a= 0x10;
printf ("the a is %dn^,&a) ;
return 0;
}
程序运行的结果是:
error: address of register variable 'a’ requested
说明给register int a 取地址出错了。
静态
应用场景:
修饰3种数据:
1)、函数内部的变量
int fun()
{
int a; ===> static int a;
}
2)、函数外部的变量
int a; ====> static int a;
int fun()
{
}
3)、函数的修饰符
int fun();===> static int fun();
外部声明
常量的定义
修饰只读的变量
const int a= 100;
但是还是可以通过其他方式修改变量a的值
告知编译器编译方法的关键字,不优化编译,在嵌入式底层用的较多
修饰变量的值的修改,不仅仅可以通过软件,也可以通过其他方式(硬件,外部的用户)
例如:int a = 100;
while( a==100 );
mylcd();
---------------------------
汇编假设如下:
[a] : a的地址
f1: LDR RO, [a]
f2: CMP R0, #100
f3: JMPeq f1 (没有优化会跳转到f1,进行循环,但是和内存打交道,速度相对慢)
--->JMPeq f2(编译的过程中会自动优化,直接跳到f2进行循环)
f4: mylcd();
但是往往可能因为触碰了外部的键盘修改了a的值,这样的优化就会有问题,所以此种情况下,应该要使用volatile int a = 100;
关键词: