#define GPBCON (*(volatile unsigned *)0x56000010) 的理解

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

对于不同的计算机体系结构,设备可能是端口映射,也可能是内存映射的。如果系统结构支持独立的IO地址空间,并且是端口映射,就必须使用汇编语言完成实际对设备的控制,因为C语言并没有提供真正的“端口”的概念。如果是内存映射,那就方便的多了。

          以 #define IOPIN   (*((volatile unsigned long *) 0xE0028000))   为例:作为一个宏定义语句,define是定义一个变量或常量的伪指令。首先( volatile unsigned long * )的意思是将后面的那个地址强制转换成 volatile unsigned long * ,unsigned long * 是无符号长整形,volatile 是一个类型限定符,如const一样,当使用volatile限定时,表示这个变量是依赖系统实现的,以为着这个变量会被其他程序或者计算机硬件修改,由于地址依赖于硬件,volatile就表示他的值会依赖于硬件。

      volatile 类型是这样的,其数据确实可能在未知的情况下发生变化。比如,硬件设备的终端更改了它,现在硬件设备往往也有自己的私有内存地址,比如显存,他们一般是通过映象的方式,反映到一段特定的内存地址当中,这样,在某些条件下,程序就可以直接访问这些私有内存了。另外,比如共享的内存地址,多个程序都对它操作的时候。你的程序并不知道,这个内存何时被改变了。如果不加这个voliatile修饰,程序是利用cache当中的数据,那个可能是过时的了,加了 voliatile,就在需要用的时候,程序重新去那个地址去提取,保证是最新的。归纳起来如下:

1. volatile变量可变 允许除了程序之外的比如硬件来修改他的内容  

2. 访问该数据任何时候都会直接访问该地址处内容,即通过cache提高访问速度的优化被取消 

 

       对于((volatile unsigned long *) 0xE0028000)为随硬件需要定义的一种地址,前面加上“*”指针,为直接指向该地址,整个定义约定符号IOPIN代替,调用的时候直接对指向的地址寄存器写内容既可。这实际上就是内存映射机制的方便性了。其中volatile关键字是嵌入式系统开发的一个重要特点。上述表达式拆开来分析,首先(volatile unsigned long *) 0xE0028000的意思是把0xE0028000强制转换成volatile unsigned long类型的指针,暂记为p,那么就是#define A *p,即A为P指针指向位置的内容了。这里就是通过内存寻址访问到寄存器A,可以读/写操作。

 

对于(volatile unsigned char *)0x20我们再分析一下,它是由两部分组成:

 1)(unsigned char *)0x20,0x20只是个值,前面加(unsigned char *)表示0x20是个地址,而且这个地址类型是unsigned char ,意思是说读写这个地址时,要写进unsigned char 的值,读出也是unsigned char 。

 2)volatile,关键字volatile 确保本条指令不会因C 编译器的优化而被省略,且要求每次直接读值。例如用while((unsigned char *)0x20)时,有时系统可能不真正去读0x20的值,而是用第一次读出的值,如果这样,那这个循环可能是个死循环。用了volatile 则要求每次都去读0x20的实际值。

 

那么(volatile unsigned char *)0x20是一个固定的指针,是不可变的,不是变量。而char   *u则是个指针变量。

 再在前面加"*":*(volatile unsigned char *)0x20则变成了变量(普通的unsigned char变量,不是指针变量),如果#define i (*(volatile unsigned char *)0x20),那么与unsigned char i是一样了,只不过前面的i的地址是固定的。

 

那么你的问题就可解答了,(*(volatile unsigned char *)0x20)可看作是一个普通变量,这个变量有固定的地址,指向0x20。而0x20只是个常量,不是指针更不是变量。

转载于:https://my.oschina.net/u/920274/blog/2251389

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

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

相关文章

三极管基本参数介绍与放大电路分析

全称为半导体三极管,也称双极型晶体管、晶体三极管,是一种电流控制电流的半导器件,作用是把微弱信号放大成幅度值较大的电信号, 也用作无触点开关。 两个PN结的排列方式有两种:PNP和NPN。 三个端点依序称为射极&#…

eclipse启动了tomcat,但是浏览器打不开欢迎页

tomcat在eclipse中启动成功,主页却打不开 症状: tomcat在eclipse里面能正常启动,而在浏览器中访问http://localhost:8080/不能访问,且报404错误。同时其他项目页面也不能访问。 关闭eclipse里面的tomcat,在tomcat安装目…

三极管放大电路三种类型

根据三极管三个电极与输入输出端子的连接方式,可归纳为三种:共发射极电路、共基极电路和共集电极电路; 三种电路的共同点:各有两个回路,一个输入回路一个输出回路,两个回路有一个公共 端,而公…

MOS管的米勒效应简介

一、米勒平台介绍 Mos管的三极都会存在以下 的三个电容,分别是:Cgs,Cgd,Cds。 米勒电容指的是Cgd。米勒效应在MOS驱动中臭名昭著,他是由MOS管的米勒电容引发的米勒效应,在MOS管开通过程 中,GS电压上升到某一电压值后GS电压有一段稳定值(图中t2~t3阶段),过后Vgs电压…

PopupWindow 使用详解(二) Popwindow 制作常见花哨效果

帝都几日降温,终于被撂倒了。but 只要一息尚存就得不断进步!于是,写出 《PopupWindow 使用详解》的第二篇 笔记,先奉上 第一篇链接: 《PopupWindow 使用详解(一) 中文API 文档 赠送 ListPopupWindow 中文 A…

近距离无线通信技术对比

定义:无线通信是利用电磁波信号在自由空间中传播的特性进行信息交换的一种通信方式。 优点:成本低、无物理线路,不受工业环境限制,环境适应能力强; 故障诊断简单,可远程诊断,扩展性强&#xff…

看不清的融资迷局 二线玩家字节跳动在打什么主意?

互联网似乎对离经叛道者总是多一分关注,吃瓜心态随着时间的推进越来越浓烈。 其中,今日头条成了“看热闹”时代最佳的“演员”之一,供看客消遣:其母公司字节跳动一个融资传闻从8月炒到了10月,即便是媒体通过信源确认这…

第3章-动态基础分析实验

Lab 3-1 Question: 1.先对文件使用PEID进行查壳,显示文件被加壳处理过 2.使用Dependency Walker查看文件导入函数,文件只有一个DLL而且只有一个导入函数Exitprocess 3.使用Strings程序查看字符串,发现可疑字符串。 4.动态分析前期准备 4.1 对系统进行初始…

C语言变长数组data[0]【总结】

C语言变长数组data[0]【总结】 1、前言 今天在看代码中遇到一个结构中包含char data[0],第一次见到时感觉很奇怪,数组的长度怎么可以为零呢?于是上网搜索一下这样的用法的目的,发现在linux内核中,结构体中经常用到data…

Excel 转为 MySQL 语句

一、方法 一、假设你的表格有A、B、C三列数据,希望导入到你的数据库中表格table,对应的字段分别是col1、col2、col3 二、在你的表格中增加一列,利用excel的公式自动生成sql语句,具体方法如下: 1、增加一列(…

CentOS7下安装zookeeper3.4.9

获取zookeeper官方安装包 1 wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.9/zookeeper-3.4.9.tar.gz 解压该文件包 1 tar zxf zookeeper-3.4.9.tar.gz 进入conf文件夹并创建新配置文件 1 cd zookeeper-3.4.9/conf 2 vi zoo.cfg 在config文件中加…

union 和 struct 的区别与联系

union ( 共用体):构造数据类型,也叫联合体 用途:使几个不同类型的变量共占一段内存(相互覆盖) struct ( 结构体 ):是一种构造类型 用途: 把不同的数据组合成一个整体——自定义数据类型 主要区别&#x…

Android系统中标准Intent的使用

Android系统用于Activity的标准Intent 1.根据联系人ID显示联系人信息 Intent intentnew Intent(); intent.setAction(Intent.ACTION_VIEW);//显示联系人信息 intent.setData(Uri.parse("content://contaccts/people/492")); startActivity(intent); 2.根据联系人ID显…

开关电源简介

1. 基本分类 DC-DC BULK电源 DC-DC BOOST电源 DC-DC BULK/BOOST电源 DC-DC BOOST/BYPASS电源 2. 典型拓扑结构 BULK电路拓扑 降压型电源 串联关系在开关管S导通时,二极管VD负极电压高于正极反偏截止,此时电流经过电感L向电容和负载供电&#x…

电感基础与选型介绍

电感是一种常见的被动元件,常用在LC振荡电路、中低频的滤波电路,DCDC能量转换电路中,其应用频率一般不超过50MHz。 1.电感的主要作用 通直流,阻交流阻交流变化,保持电流稳定----楞次定律滤波 2.电感的主要分类 3.电…

[题解]Codeforces Round #519 - B. Lost Array

【题目】 B. Lost Array 【描述】 Bajtek有一个数组x[0],x[1],...,x[k-1]但被搞丢了,但他知道另一个n1长的数组a,有a[0]0,对i1,2,...,n。由此可以找到数组x[0],x[1],...,x[k-1]的一些可能情况,即满足这个关系的数组x[0],x[1],...,…

LeetCode 24 Swap Nodes in Pairs (交换相邻节点)

题目链接: https://leetcode.com/problems/swap-nodes-in-pairs/?tabDescriptionProblem: 交换相邻的两个节点如上图所示,递归进行交换。从最尾端开始,当最尾端只有一个节点时,停止交换否则执行 swap(head.next) 参考代码&#x…

Netra基于Rdk平台的软件框架设计

Netra(DM8168)处理器是个多核处理器,每个核之间相互独立却又相互关联,如何高效简洁地利用每个核完成一套系统功能是非常关键的,RDK这套软件平台就是针对这种多核平台设计的一套多通道视频应用方案,主要用于…

电感啸叫原因与应对措施

大部分硬件工程师应该都遇到过,PCBA上电后出现“滋滋滋”的叫声,其声响或大或小,或时有时无,或深沉或刺耳,或变化无常者皆有。该现象我们称为“啸叫”,一般分为电感啸叫和电容啸叫。 其中电感啸叫最为常见,尤其在DCDC电路中,大部分是因为 器件参数选择不合理 导致的。…