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

一、描述

在开发嵌入式过程中,常会看到_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这个变量操作该地址的数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/405520.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

table简单排序

早些时候基于jQuery写的一个table排序&#xff0c;暂时只支持简单的数据类型排序。以后有时间改写成原生js的 直接上代码了&#xff0c;写的不好&#xff0c;纯属记录 tabletable 浏览评论主题作者最后评论 共有精品数200个10023232北京的天气真是干燥&#xff0c;让人觉得不舒…

html循环c for,两层c:forEach循环嵌套

jsp中两级菜单如何用c:forEach输出items要被循环的信息否无begin开始的元素(0第一个元素&#xff0c;1第二个元素)否0end最后一个元素(0第一个元素&#xff0c;1第二个元素)否Last elementstep每一次迭代的步长否1var代表当前条目的变量名称否无varStatus代表循环状态的变量名称…

Gvim 字体大小设置和FencView插件安装

1. GVim更改字体及大小 在命令模式下输入: set guifontlucida\ console:h14 其中&#xff0c;字体名有空格的话&#xff0c;要转义下. 2. FencView插件(Ver4.8)下载位置&#xff1a; http://vim.sourceforge.net/scripts/download_script.php?src_id17381 解压出来后&am…

【原创】俄罗斯方块Tetris version2.1 by yuanfeng1129

#include<windows.h>#include<time.h>#include<stdlib.h>#include"resource.h"#define W 14 //游戏区域宽度#define H 26 //游戏区域高度#define W1 6 //右边状态栏宽度#define BSIZE 25 //游戏方格边长#define Y1 6 //放置照片的纵坐标#define Y2…

怎没用计算机算e的,小E教你们如何用计算机算虚数

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼首先打开计算器电源(ON)注&#xff1a;()代表注释 ( )代表第二功能键1.shift2.(Pol)3.14.shift5.(,)6.07.)8.9.狂按分数线&#xff0c;直到按到顶不动为止(似乎是6个)10.按 (显示Syntax ERROR 不要管它)&#xff0c; AC&#xff0c…

物联网IoT接入技术分类以及华为OC平台特性

一、主流物联网接入技术应用场景划分 4G/5GLTE-V&#xff1a; 传输速率>10Mbps&#xff1b;功耗较高 应用业务&#xff1a;车联网、视频监控、智能机器eMTC/GPRS 传输速率<1Mbps&#xff1b;成本较低&#xff0c;功耗较低 应用业务&#xff1a;穿戴、车辆调度、电子广…

AT91RM9200Linux移植笔记(三)-移植Linux kernel 2.6.17

AT91RM9200Linux移植笔记(三)-移植Linux kernel 2.6.17 手上板子原来自带的是2.4.19的内核&#xff0c; 打算移植新的2.6的内核&#xff0c;从网上下了2.6.17的kernel&#xff0c;下载地址为&#xff1a;http://www.kernel.org/pub/linux/kernel/v2.6/修改PATH环境变量或者Mak…

css html5360百科,div+css

所谓CSS优先级&#xff0c;即是指CSS样式在浏览器中被解析的先后顺序。内联样式(inline style) > ID选择符 > 类选择符(class), 伪类(pseudo-class)和属*(attribute)选择符 > 类别(type)&#xff0c;伪对象(pseudo-element)一,解释:*内联样式(inline style):元素的sty…

Spring学习(10)--- @Qualifier注解

按类型自动装配可能多个bean实例的情况&#xff0c;可以使用Spring的Qualifier注解缩小范围&#xff08;或指定唯一&#xff09;&#xff0c;也可以指定单独的构造器参数或方法参数可用于注解集合类型变量例子&#xff1a; package com.mypackage;import org.springframework.b…

NB模组基本AT指令

1、终端开机命令 ATCFUN0 2、查询软件版本号 ATCGMR 3、查询设备号 ATCGSN1 4、设置设备号 ATNTSETID1,xxxxx 5、设置IOM南向地址 ATNCDPxx.xx.xx.xx 6、设置APN ATCGDCONT1,"IP","xxxx" 7、复位 ATNRB 8、开机 ATCFUN1 9、查询sim卡imsi …

标准SQL注入入侵语句

1.判断有无注入点; and 11 and 12 2.猜表一般的表的名称无非是admin adminuser user pass password 等..and 0<>(select count(*) from *)and 0<>(select count(*) from admin) ---判断是否存在admin这张表3.猜帐号数目 如果遇到0< 返回正确页面 1<返回错误页…

字符编码·ISO8859

From: http://hanwei0143.blog.163.com/blog/static/5192699320071039342262/ 1&#xff0e; 名称的由来 ISO 8859&#xff0c;全称ISO/IEC 8859&#xff0c;是国际标准化组织(ISO)及国际电工委员会(IEC)联合制定的一系列8位字符集的标准&#xff0c;现时定义了15个字符集。 …

友讯(d-link)dwa-525 150m无线台式计算机网卡,D-Link新款台式机无线网卡即将上市

D-Link&#xff0c;日前发布了一款新型wireless N 150M台式机无线网卡——DWA-525。据D-Link中国产品负责人透露&#xff0c;该款网卡在大陆也即将上市&#xff0c;具体上市时间表请广大用户留意官方网站公告以及就近咨询各地经销商。DWA-525是一款单天线wireless N 台式机无线…

寒冰王座(完全背包+多解)

欢迎“热爱编程”的高考少年——报考杭州电子科技大学计算机学院 寒冰王座 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 12875 Accepted Submission(s): 6548 Problem Description不死族的巫妖王发工资拉,死…

深度学习--Matlab使用LSTM长短期记忆网络对负荷进行预测

一、LSTM描述 长短期记忆网络&#xff08;LSTM&#xff0c;Long Short-Term Memory&#xff09;是一种时间循环神经网络&#xff0c;是为了解决一般的RNN&#xff08;循环神经网络&#xff09;存在的长期依赖问题而专门设计出来的&#xff0c;所有的RNN都具有一种重复神经网络…