Static
static在C语言中是一个多义的关键字。
它的含义取决于它的上下文。
Static关键字一共有三种用途:
- 用于函数内部声明局部变量。
此时static关键字的作用是改变局部变量的存储类型,从自动变量修改为静态变量。也就是说,这个局部变量不再存储在堆栈或者寄存器中了,而是存储在编译时编译器分配的一个静态空间地址中。这个变量的作用域没变,只有声明它的函数内部才能访问。同时拥有静态变量和局部变量的特征。 - 用于函数定义。
此时这个函数就只能在该函数的C文件中引用了,其他的C文件不能调用这个函数。这种做可以起到封装的效果,将局部的、私有的函数或变量声明为static。 - 用于声明全局变量。
与用于函数类似,这个全局变量的作用于将局限在声明该变量的C语言内部。
volatile
volatile 关键字告诉编译器该变量是随时可能发生变化的,每次使用它的时候必须从原内存中取出他的值,因而编译器生成的汇编代码会从原内存地址中读取数据使用。
编译器在优化的过程中可能会把频繁使用的变量备份一份,放在CPU内部寄存器中,这样可以快速访问,但是当原内存地址中的值被修改时(比如DMA直接修改内存中的值),CPU内部寄存器的值却没有修改,这样就会产生意想不到的结果。这时就需要使用volatile了。
一般来说都会忘记加volatile,记得加volatile的也是非常了解volatile的,这里的建议是,在调试的时候遇到了意想不到的结果是可以尝试一下添加volatile
volatile一般用在如下的几个地方:1、中断服务程序中修改的供其它程序检测的变量需要加volatile;2、多任务环境下各任务间共享的标志应该加volatile;3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;另外,以上这几种情况经常还要同时考虑数据的完整性(相互关联的几个标志读了一半被打断了重写),在1中可以通过关中断来实现,2中可以禁止任务调度,3中则只能依靠硬件的良好设计了。