加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C中的__IO和静态关键字有什么用?

发布时间:2020-12-16 09:21:14 所属栏目:百科 来源:网络整理
导读:我正在查看为STM32F微控制器编写的一些代码,我在初始化变量之前发现了这些关键字.我想知道使用这个“__IO” “静态”关键字? 代码行是这样给出的: static __IO uint32_t sysTickCounter; 解决方法 __IO / volatile 欢迎来到该网站. __IO不是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的另一个重要用途是访问外设寄存器(尽管在这种情况下你会使用指针).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读