__IO和静态关键字在C语言中有什么用?



我检查了一些为STM32F微控制器编写的代码,发现在初始化变量之前使用了这些关键字。我想知道使用这个">__IO"&">静态"关键字?

代码行是这样给出的:

static   __IO   uint32_t   sysTickCounter; 

__IO/volatile

__IO不是C关键字。__IO是STM32标准外设库头文件中定义的volatile的宏。例如,在core_cm4.h(可能在CMSIS子文件夹中(中,您会发现

#define     __IO    volatile

(如果使用gcc-E选项仅使用预处理器阶段,则可以看到宏的扩展。(

反过来,volatile关键字通常应用于变量,以防止编译器"优化它"。这在嵌入式系统中很有用——在嵌入式系统上,变量可能会在中断中使用——编译器优化可能会导致问题。

简短的例子。。。

int main(void) {
int ms = 0;
ms++;
while (1);
return 0;
}

这是生成的程序集(使用针对PIC12f629目标的sdcc编译器(。正如您所看到的,ms变量已经"优化"。

_main:
; 2 exit points
_00113_DS_:
;   .line   18; "main.c"    while (1)
GOTO    _00113_DS_
RETURN
; exit point of _main

另一方面,如果我们将变量声明为volatile。。。

volatile int ms = 0;
ms++;
// etc.

保留相关指令:

_main:
; 2 exit points
;   .line   16; "main.c"    volatile int ms = 0;
CLRF    _main_ms_1_5
CLRF    (_main_ms_1_5 + 1)
;   .line   19; "main.c"    ms++;
INCF    _main_ms_1_5,F
BTFSC   STATUS,2
INCF    (_main_ms_1_5 + 1),F
_00113_DS_:
;   .line   21; "main.c"    while (1)
GOTO    _00113_DS_
RETURN
; exit point of _main

static

static关键字的效果取决于声明变量的范围。

  • 文件范围-变量的范围仅限于当前编译单元(通常是一个文件及其#included头文件(
  • 块范围(例如在函数内(-变量在程序期间保留在内存中。(对于函数,这意味着变量的值在对该函数的后续调用之间保留。(

备注

正如vlk在评论中指出的,volatile的另一个重要用途是访问外围寄存器(尽管在这种情况下会使用指针(

最新更新