C中的__IO和静态关键字有什么用?
我正在查看为STM32F微控制器编写的一些代码,我在初始化变量之前发现了这些关键字.我想知道使用这个“__IO”& “静态”关键字?
代码行是这样给出的: static __IO uint32_t sysTickCounter; 解决方法
__IO / volatile
欢迎来到该网站. __IO不是C关键字. __IO是volatile的宏 – 在STM32标准外设库头文件中定义.例如,在core_cm4.h中(可能在CMSIS子文件夹中),您会发现 #define __IO volatile (如果使用gcc的-E选项仅使用预处理器阶段,则可以看到宏的扩展.) 反过来,volatile关键字通常应用于变量,以防止编译器“优化它”.这在嵌入式系统中很有用 – 可能在中断中使用变量 – 编译器优化可能会导致问题. 简短的例子…… int main(void) { int ms = 0; ms++; while (1); return 0; } 这是生成的程序集(使用sdcc编译器用于PIC12f629目标).如您所见,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关键字的效果取决于声明变量的范围. >文件范围 – 变量的范围仅限于当前编译单元(通常是文件加上其#included头文件). 笔记 >正如vlk在评论中指出的那样,volatile的另一个重要用途是访问外设寄存器(尽管在这种情况下你会使用指针). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |