一、描述

在开发嵌入式过程中,常会看到_IO 修饰符,这两个修饰符是在Core_cm3.h中被重定义:

/* IO definitions (access restrictions to peripheral registers) */
#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              */  

在嵌入式处理器中,为加速访问变量,有时变量的值是直接存储在寄存器,而当某些中断或硬件改变了内存中的值时,程序却读取的是寄存器的值,因此该值不是最新的值,在开启程序优化后,在实时处理一些任务的时候可能会导致致命错误。

例如有一下代码,我们需要对变量i进行操作,一旦开启了优化,编译器可能直接将i=1 赋值语句给优化掉。

uint8_t i;
......
i = 1;
i = 0;
......

二、用法

volatile关键字用于声明变量不被编译器优化,总是从该变量在内存中的地址处去获取数据。volatile修饰的变量,访问该数据任何时候都会直接访问该地址处内容,即通过cache提高访问速度的优化被取消 。

通常用于取绝对地址的数据:例如,要取位于0x20000000处的数据,使用*((volatile unsigned int*) 0x20000000)即可,就是内存映射机制。

具体分析:(volatile unsigned int*) 0x20000000表示把0x20000000的地址指代的数据强制转换成volatile unsigned int类型,此时可以用指针来表示例如ptr:

unsigned int * ptr = (volatile unsigned int*) 0x20000000;

通过*ptr即可取得数据。

用宏定义声明操作该变量的值:

#define VAL *((volatile unsigned int*) 0x20000000)

程序中就可以用VAL这个变量操作该地址的数据。

嵌入式开发中关键字_IO 和 volatile的用法相关推荐

  1. 嵌入式开发中对(*(volatile unsigned long *)) 的理解

    一.说明 (*(volatile unsigned long *)) 这个语句对于不同的计算机体系结构,设备可能是端口映射,也可能是内存映射的.如果系统结构支持独立的IO地址空间,并且是端口映射,就必 ...

  2. 嵌入式开发中数值常量如何转化为内存地址?

    作者 | 李肖遥       责编 | 欧阳姝黎 最近在使用 Nordic 的最新蓝牙芯片 nRF52832 开发过程中,因为做一些测试涉及到对内存地址的操作,有(*(volatile unsigne ...

  3. 嵌入式开发中的C语言知识点

    嵌入式开发中的C语言知识点 1.关键字 2.数据类型 3.内存管理和存储架构 4.指针和数组 5.结构类型和对齐 6.预处理机制 1.关键字 几乎每一门语言中都有关键字,具有特殊功能,C语言也不例外, ...

  4. c语言改变cmd 字体大小_嵌入式开发中常见3个的C语言技巧

    原文:https://www.cnblogs.com/CrazyCatJack/p/6080266.html 1.指向函数的指针 指针不光能指向变量.字符串.数组,还能够指向函数.在C语言中允许将函数 ...

  5. 嵌入式开发中DSP与FPGA的关系

    嵌入式开发中DSP与FPGA的关系 常所说的单片机侧重于控制,不支持信号处理,属于低端嵌入式处理器,arm可以看做是低端单片机升级版,支持操作系统管理,更多接口如网卡,处理能力更强;fpga是可编程逻 ...

  6. 嵌入式开发中常用的几种通信接口总结

    关注.星标公众号,直达精彩内容 在嵌入式系统中,板上通信接口是指用于将各种集成电路与其他外围设备交互连接的通信通路或总线. 以下内容为常用板上通信接口:包括I2C.SPI.UART.1-Wire: I ...

  7. 嵌入式开发中C语言编程要点简述!

    在嵌入式Linux的C语言开发中,C语言的基本编程依然是最重要的内容.除此之外,与一般的C语言编程相比,嵌入式Linux的C语言编程有以下一些要点: 1.库函数与系统调用 在进行C语言编程的时候,使用 ...

  8. 理解嵌入式开发中的一些硬件相关的概念

    为什么80%的码农都做不了架构师?>>>    做嵌入式系统开发,经常要接触硬件.做嵌入式开发对数字电路和模拟电路要有一定的了解.这样才能深入的研究下去.下面我们简单的介绍嵌入式开发 ...

  9. 浅析嵌入式开发中的RAM和ROM

    在嵌入式开发中常常会遇到RAM,ROM,flash,内存等等一些问题,先梳理一下备用. 1.ROM:只读存储器.优点:容量大,掉电不丢失:缺点:读取速度慢.事实上,"只读"定义不准 ...

最新文章

  1. kubeadm源码分析(内含kubernetes离线包,三步安装)
  2. javascript-高级用法
  3. 高等数学上-赵立军-北京大学出版社-题解-练习2.3
  4. python写入并获取剪切板内容_python写入并获取剪切板内容
  5. html自动图片墙,基于html5实现的图片墙效果
  6. 如何查看linux的资源,Linux系统资源查看(示例代码)
  7. 拓端tecdat|R语言对巨灾风险下的再保险合同定价研究案例:广义线性模型和帕累托分布Pareto distributions分析
  8. 2021-06-22 超链接伪类
  9. ASP.NET Core WebApi AspNetCoreRateLimit 限流中间件学习
  10. CheckMarx源代码安全测试工具
  11. 极域电子书包课堂管理系统怎么控屏_极域电子教室使用说明
  12. opencv cv2 python RGB BGR 颜色表 配色
  13. ubuntu 16.04和window双系统 启动项顺序修改
  14. 解决SQLyog连接MySQL数据库时报2058错误
  15. antd菜单使用动态图标
  16. 【Storm】【二】Storm和流处理简介
  17. Word中题注按章节不同编号
  18. 阿里携“骑呗”入局共享单车,好戏即将开始
  19. 996的压力下,程序员还有时间做副业吗?
  20. 使用 GCM 网络管理工具优化电池使用

热门文章

  1. checkboxlist与数组结合用的技
  2. 什么从什么写短句_从什么到从什么造句
  3. python django用户登录系统_Django实现用户注册登录
  4. c oracle 记录,ORACLE 19c 操作相关记录
  5. ajax拼接显示不同样式,Ajax重点整理
  6. c语言程序设计学生程序查询,《c语言程序设计报告-学生信息管理系统》.doc
  7. mysql 水平拆分实例_2021先定个小目标?搞清楚MyCat分片的两种拆分方法和分片规则!(二):水平拆分实例解析和代码实现!...
  8. mysql 列数据显示转成行数据显示_Mysql的列修改成行并显示数据的简单实现
  9. java资源争夺_所有满足类似需求,争夺同类资源的组织和个人统称为(   )。...
  10. Java 异常处理机制