首页 > 其他分享 >volatile的用法

volatile的用法

时间:2024-06-09 16:00:04浏览次数:24  
标签:__ 用法 volatile IO 寄存器 Defines permissions

1.作用

  • 防止编译器优化对该变量的访问过程,确保每次访问都能得到最新的值。
  • 编译器通常会对代码进行优化,例如将变量的值存储在寄存器中,以减少对内存的访问

2.应用

场景:1.硬件寄存器 2.中断服务程序中的变量 3.多线程程序中的共享变量

//stm32f407xx.h
typedef struct
{
  __IO uint32_t LISR;   /*!< DMA low interrupt status register,      Address offset: 0x00 */
  __IO uint32_t HISR;   /*!< DMA high interrupt status register,     Address offset: 0x04 */
  __IO uint32_t LIFCR;  /*!< DMA low interrupt flag clear register,  Address offset: 0x08 */
  __IO uint32_t HIFCR;  /*!< DMA high interrupt flag clear register, Address offset: 0x0C */
} DMA_TypeDef;

//core_cm4.h
#ifdef __cplusplus  // C和C++编译器区分一下 _I 的宏定义
  #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 */

/* 强调用于结构体成员M = member */
#define     __IM     volatile const      /*! Defines 'read only' structure member permissions */
#define     __OM     volatile            /*! Defines 'write only' structure member permissions */
#define     __IOM    volatile            /*! Defines 'read / write' structure member permissions */

3. 解释说明

  • __I、__O、_IO 都表示 volatile,变量访问不可被优化,只是用不同标识符来区别访问权限
  • __I表示输入寄存器,一般只读,__O表示输出寄存器,一般只写,__IO表示可读写寄存器
  • __I:volatile const     __O:volatile    __IO:volatile
  • 输入寄存器:例如一个温度传感器连接到MCU,传感器的输出连接到一个输入寄存器,可以读取该输入寄存器的值获得温度值,当然还有状态信息或其他外部输入信号的应用场景
  • 输出寄存器:用于向外部硬件发送数据,典型的输出寄存器用于控制外设、发送数据或触发特定的硬件操作
  • 输入输出寄存器:用于需要双向数据传输的外设,例如GPIO、U(S)ART、I2C和SPI接口等
  • 根据作用分类可分为:状态寄存器、控制寄存器、数据寄存器,跟MCU总线类似(地址总线、控制总线、数据总线)

标签:__,用法,volatile,IO,寄存器,Defines,permissions
From: https://www.cnblogs.com/lichangyi/p/18239642

相关文章

  • enum用法
    基本用法enumColor{//Color被称为枚举类型RED,//默认是0开始GREEN=5,BLUE};enumColormyColor;//enumColormyColor=RED;//myColor的值现在是0myColor=BLUE;//myColor的值现在是6使用typedef简化代码(推荐)typedefenum{RED,......
  • tcl脚本语言之regexp中转义字符\用法
    在Tcl脚本中,正则表达式(regexp)中使用反斜杠(\)来转义字符,以便这些字符可以被解释为其字面含义或特定的正则表达式语法。以下是详细的用法和示例。基本用法反斜杠(\)在正则表达式中有两种主要用途:转义元字符:将元字符解释为字面字符。表示特殊字符:用于表示特定的非打印字符或预定......
  • const用法详解以及auto用法详解
    const用法详解:主要用途:定义一个不可修改的常量1、修饰变量:语法:const数据类型变量名=值;示例:constintN=3;说明:const修饰的变量必须在声明时初始化,并且之后不能被修改。2、修饰指针2.1、常量指针:语法:数据类型*constp=&a;示例:int*constp=&a;说明:指针本......
  • 数据结构和矩阵细节用法:double、cell和complex #matlab
    建立矩阵用[];矩阵的同一行内的元素用逗号或者空格隔开矩阵的不同行的元素用分号隔开eg.       矩阵     A=123456789在matlab中矩阵A表示为:clc;clear;A=[1,2,3;4,5,6;7,8,9]; %或者A=[123;456;789];小矩阵构建大矩阵假设:A=[......
  • 多选列表用法
    文章目录知识回顾使用方法示例代码我们在上一章回中介绍了扩展内容相关的知识,本章回中将介绍单选列表和复选列表.闲话休提,让我们一起TalkFlutter吧。知识回顾我们在本章回中将介绍单选和复选列表,它们是常用的组件,不只在移动平台中使用,在其它平台上也经常被使用,......
  • 字符串分割处理srttok的用法
    字符串处理srttok的用法strtok函数是C语言中用于分割字符串的一个非常有用的工具。以下是关于strtok函数用法的详细说明:一、函数原型c复制代码char*strtok(char*str,constchar*delim);二、参数说明str:要分割的字符串。首次调用时,它应指向要分割的原始字符串。在后续......
  • ECharts数据集合(dataset)用法一(完整举例)
            数据集(dataset)是专门用来管理数据的组件。虽然每个系列都可以在series.data中设置数据,但是从ECharts4支持数据集开始,更推荐使用数据集来管理数据。因为这样,数据可以被多个组件复用,也方便进行“数据和其他配置”分离的配置风格。毕竟,在运行时,数据是最常改变的,而......
  • 在计算机论文中suppose suggest assume 用法上的区别
    ChatGPT3.5的答案:在计算机论文中,"suppose,""suggest,"和"assume"有不同的用法和含义。它们在表达假设、建议和假定时具有不同的语气和语境。以下是它们的区别和示例:Suppose定义:假设某种情况或前提,通常用于讨论或推理。用法:假设情景:"Supposeweuseamoreefficie......
  • Shell脚本语言用法详解(超详细~)
    Shell目录Shell一、Shell是什么?二、Shell怎么使用?1.变量变量的命名和赋值变量类型变量的作用域只读变量删除变量环境变量系统预定义变量变量的使用特殊变量和位置参数2.运算符3.条件判断4.流程控制if判断case语句for循环while循环5.读取控制台输入6.函数系统函数自定......
  • MySQL GROUP BY 用法介绍
    MySQL中GROUPBY用法简介GROUPBY语句用于结合合计函数,根据一个或多个列对结果集进行分组。可以把分组理解成Excel中的分组。把合计函数理解成Excel中的求和、求平均值等。语法SELECTcolumn1,column2,aggregate_function(column3)FROMtable_nameWHEREcon......