首页 > 其他分享 >C语言中的volatile

C语言中的volatile

时间:2022-11-13 20:55:05浏览次数:33  
标签:__ typedef const Read C语言 Only volatile

volatile的定义:

Indicates that a variable can be changed by a background routine.
Keyword volatile is an extreme opposite of const.It
 indicates that a variable may be changed in a way which is absolutely unpredictable by analysing the normal program flow (for example, a variable which may be changed by an interrupt handler). This keyword uses the following syntax:

翻译为表示一个变量也许会被后台程序改变,关键字 volatile 是与 const 绝对对立的。它指示一个变量也许会被某种方式修改,这种方式按照正常程序流程分析是无法预知的(例如,一个变量也许会被一个中断服务程序所修改)。

变量如果加上volatile,就会从内存中重新装载内容,而不是从寄存器中拷贝内容。volatile 的作用 是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。

volatile主要由一下几种应用场合:

1). 并行设备的硬件寄存器(如:状态寄存器)

复制代码
#define GPC1CON *((volatile unsigned int*)0xE0200080)
#define GPC1DAT *((volatile unsigned int*)0xE0200084)
#define GPC1PUD *((volatile unsigned int*)0xE0200088)
...........
 typedef const int32_t sc32;  /*!< Read Only */
  typedef const int16_t sc16;  /*!< Read Only */
  typedef const int8_t sc8;   /*!< Read Only */   typedef __IO int32_t  vs32;
typedef __IO int16_t  vs16;
typedef __IO int8_t   vs8; typedef __I int32_t vsc32;  /*!< Read Only */
typedef __I int16_t vsc16;  /*!< Read Only */
typedef __I int8_t vsc8;   /*!< Read Only */ typedef uint32_t  u32;
typedef uint16_t u16;
typedef uint8_t  u8; typedef const uint32_t uc32;  /*!< Read Only */
typedef const uint16_t uc16;  /*!< Read Only */
typedef const uint8_t uc8;   /*!< Read Only */ typedef __IO uint32_t  vu32;
typedef __IO uint16_t vu16;
typedef __IO uint8_t  vu8; typedef __I uint32_t vuc32;  /*!< Read Only */
typedef __I uint16_t vuc16;  /*!< Read Only */
typedef __I uint8_t vuc8;   /*!< Read Only * .............. #ifdef __cplusplus   #define   __I     volatile             /*!< defines 'read only' permissions                 */ #else
  #define   __I     volatile const       /*!< defines 'read only' permissions                 */
#endif
#define     __O     volatile             /*!< defines 'write only' permissions                */
#define     __IO    volatile             /*!< defines 'read / write' permissions              */
复制代码

一个参数既可以是const还可以是volatile吗?

可以的,例如只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。软件不能改变,并不意味着我硬件不能改变你的值,这就是单片机中的应用。

 

2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables) 

复制代码
/*   main.c */
int flag=0;
int main(void)
{
  if(flag==1)
    {do somethings}
  if(flag==2)
        {do somethings}
  return 0;
}
/* interrupt*/
void NVIC_Handler(void)
{
  flag=1;
}
复制代码

在这种情况下,编译器可能会对其做优化,虽然中断服务函数改变了flag的值,但是编译器并没有在变量内存中去读取,而是在寄存器中读取了flag之前的缓存数据。在中断函数中的交互变量,一定要加上volatile关键字修饰,这样每次读取flag的值都是在其内存地址中读取的,确保是我们想要的数据。


3). 多线程应用中被几个任务共享的变量 

原因其实和上面中断一样,要共享标志,又不想让编译器优化了这一点,需要加上该修饰词。

 

简洁的说就是:volatile关键词影响编译器编译的结果,用volatile声明的变量表示该变量随时可能发生变化,与该变量有关的运算,不要进行编译优化,以免出错

标签:__,typedef,const,Read,C语言,Only,volatile
From: https://www.cnblogs.com/rongjiangwei/p/16886923.html

相关文章

  • c语言数据统计
    #include<stdio.h>intmain(){intcount=0;intn,k,i;scanf("%d%d",&n,&k);for(i=n;i<=k;i++){intj=i;while(j>0)......
  • C语言学习--练习--合并两个字符串
    将两个字符串合并追加在一起,类似于python的str1+str2 #include<stdio.h>#include<string.h>#include<stdlib.h>//字符串追加,将两个字符串结合在一起intmain(......
  • 扫雷游戏(C语言版)
    1.test.c#define_CRT_SECURE_NO_WARNINGS1#include"game.h"voidmenu(){printf("******************************\n");printf("*******1.play*******\n");......
  • 计算机等级考试二级C语言程序设计专项训练题——素数及应用
        素数(primenumber)又称质数,有无限个。一个大于1的自然数,除了1和它本身外,不能被其他自然数整除,这样的数就是素数,也就是说一个素数除了1和它本身以外不再有其他的......
  • 计算机等级考试二级C语言程序设计专项训练题——整数的各位数字
         在计算机等级考试二级C语言程序设计试题中,有关一个正整数各位数字的处理是一个重要的考点,这类试题在历年考试试卷的程序填空题和程序设计题中经常出现。一.......
  • 初识C语言(1)
    一、程序指令基概念1.什么是程序?所谓程序就是一组计算机能识别和执行的指令。2.什么是指令?指令是可以被计算机理解并执行的基本操作指令。指令构成程序,程序构成软件。二、计......
  • C语言数据类型转型没有搞明白的点。
    程序员面试宝典第30页,请专家指导下,感谢!1#include<stdio.h>2#defineproduct(x)((x)*(x))3intmain(intargc,char**argv){4printf("Hello,World!\n......
  • 计算机等级考试二级C语言程序设计专项训练题——多项式求值
        在计算机等级考试二级C语言程序设计试题中,多项式求值是一个重要的考点,有关多项式求值的试题在历年考试试卷的程序填空题和程序设计题中经常出现。一.示例讲解......
  • C语言中大小写转换
    查询ascll码表可以知道在计算机中小写字母和大写字母之间相差32,小写转化成大写就减去32,大写转换成小写就加32例题:输入一个小写字母,输出其对应的大写字母。例如输入q[回......
  • C# Volatile
    原文网址:​https://zhuanlan.zhihu.com/p/4330076301.Overview经常研究.NET源码库的小伙伴会经常看到一个关键字volatile,那它在开发当中的作用是什么呢?我们一起来看看官......