naa*_*sif 3 c microcontroller static stm32 keyword
我正在查看为STM32F微控制器编写的一些代码,我在初始化变量之前发现了这些关键字.我想知道使用这个" __IO "和" 静态 "关键字有什么意义?
代码行是这样给出的:
static __IO uint32_t sysTickCounter;
Run Code Online (Sandbox Code Playgroud)
__IO/volatile欢迎来到该网站.__IO不是C关键字.__IO是一个宏volatile- 在STM32标准外设库头文件中定义.例如,在core_cm4.h(可能在CMSIS子文件夹中),你会发现
#define __IO volatile
Run Code Online (Sandbox Code Playgroud)
(如果使用gcc's -E选项仅使用预处理器阶段,则可以看到宏的扩展.)
的volatile关键字,反过来,通常施加到一个变量,以防止编译器"优化出来".这在嵌入式系统中很有用 - 可能在中断中使用变量 - 编译器优化可能会导致问题.
简短的例子......
int main(void) {
int ms = 0;
ms++;
while (1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是生成的程序集(使用sdccPIC12f629目标的编译器).如您所见,ms变量已经"优化".
_main:
; 2 exit points
_00113_DS_:
; .line 18; "main.c" while (1)
GOTO _00113_DS_
RETURN
; exit point of _main
Run Code Online (Sandbox Code Playgroud)
另一方面,如果我们将变量声明为volatile......
volatile int ms = 0;
ms++;
// etc.
Run Code Online (Sandbox Code Playgroud)
相关说明保留:
_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
Run Code Online (Sandbox Code Playgroud)
staticstatic关键字的效果取决于声明变量的范围.
#included头文件).volatile是访问外设寄存器(尽管在这种情况下你会使用指针).