barriers / 阅读 / 详情

求助:关于嵌入式C程序#define inportw(addr) (*(volatile U16 *)(addr))的定义

2023-06-19 21:03:41
共4条回复
Chen
* 回复内容中包含的链接未经审核,可能存在风险,暂不予完整展示!
(*(volatile unsigned long *)详解
(*(volatile unsigned long *)
对于不同的计算机体系结构,设备可能是端口映射,也可能是内存映射的。如果系统结构支持独立的IO地址空间,并且是端口映射,就必须使用汇编语言完成实际对设备的控制,因为C语言并没有提供真正的“端口”的概念。如果是内存映射,那就方便的多了。
以 #define IOPIN (*((volatile unsigned long *) 0xE0028000)) 为例:作为一个宏定义语句,define是定义一个变量或常量的伪指令。首先( volatile unsigned long * )的意思是将后面的那个地址强制转换成 volatile unsigned long * ,unsigned long * 是无符号长整形,volatile 是一个类型限定符,如const一样,当使用volatile限定时,表示这个变量是依赖系统实现的,以为着这个变量会被其他程序或者计算机硬件修改,由于地址依赖于硬件,volatile就表示他的值会依赖于硬件。
volatile 类型是这样的,其数据确实可能在未知的情况下发生变化。比如,硬件设备的终端更改了它,现在硬件设备往往也有自己的私有内存地址,比如显存,他们一般是通过映象的方式,反映到一段特定的内存地址当中,这样,在某些条件下,程序就可以直接访问这些私有内存了。另外,比如共享的内存地址,多个程序都对它操作的时候。你的程序并不知道,这个内存何时被改变了。如果不加这个voliatile修饰,程序是利用catch当中的数据,那个可能是过时的了,加了 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只是个常量,不是指针更不是变量。

来自:http://www.o*****.com/posts/list/918.htm
LocCloud

这个不就是类型转换的一个宏定义么?

目的是把addr地址中的整形值取出来。

addr 和 a ,b啥的都一样,

当然也可以写成#define inportw(a) (*(volatile U16 *)(a))。

通用的C语言,跟环境没啥关系。

黑桃云

1) 首先这是一个宏定义,即用前者定义为后者,所以可以在程序中用前者代替后者: 2)这个宏定义是带参数的宏,所以有点像函数的形式,但因为这行代码前有#define,是预定义,不是C语句,所以它不是函数; 3)宏定义展开,即用后者具体地实现前者,后者的括号为了确保代换式总正确; 4)将addr强制转换为指定类型的地址,然后指向这个地址的存储单元。所以总意思是:存储器从addr地址处取值。

北境漫步

1) 首先这是一个宏定义,即用前者定义为后者,所以可以在程序中用前者代替后者:

2)这个宏定义是有带参数的宏,所以有点像函数的形式,但因为这行代码前有#define,是预定义,所以它不是函数;

3)宏定义展开,即用后者具体地实现前者,后者的括号为了确保代换式总正确;

4)将addr强制转换为指定类型的地址,然后指向这个地址的存储单元。

所以这个宏定义在程序中执行的动作是:存储器从addr地址处取值。

相关推荐

addr是什么意思

== address n. 地址
2023-06-19 17:33:072

电脑上的addr是什么软件?重点是可不可以卸载

PPS在线看电视直播安装的一个插件,addr是改进后的POP3模块插件。可以卸载,不卸载也无妨。通常方法卸载不掉的,找到addr安装文件夹,右键使用360强力删除即可。不知能否对你有帮助,祝你好运,望采纳,谢啦!!
2023-06-19 17:33:183

addr是什么文件

  addr不是软件,是PPS影音的插件模块。  addr是PPS在线看电视时,所装的一个插件改进后的POP3模块,直接删除是删除不掉的。  找到它所在的位置,把它整个文件夹删除,如果有删除不了的,也可以使用360文件粉碎机来粉碎它,将需要粉碎的文件拖拽进文件粉碎机,即可完全粉碎。但要注意你是否真要删除,因为360粉碎机删除的东西是不可恢复的。
2023-06-19 17:34:271

地址的英文单词address的缩写是addr还是add

是 add 一般英文单词的缩写都是三个,比如说月份和星期不都是三个字母的缩写吗,eg :Monday 缩写成Mon,一般情况是在缩写的后面加一个实心点,但是很多英国人都不写,所以现在很多点也就省略不写了!
2023-06-19 17:34:341

地址的英文缩写?ADDr.? ADD.?ADR.?

地址 [dì zhǐ]address (ADDR; ADR)
2023-06-19 17:34:411

跳转指令中地址空间字段addr的作用

您想问的是跳转指令中地址空间字段addr的作用是什么吗?跳转指令中地址空间字段addr的作用是:读写从站的数据地址。addr是运行阶段在堆栈中分配内存空间时读写从站的数据地址用的。
2023-06-19 17:34:481

addr属于哪个头文件

addr属于:#include<netdb.h>struct addrinfo{int ai_flags;int ai_family; //AF_INET,AF_INET6,UNIX etcint ai_socktype; //STREAM,DATAGRAM,RAWint ai_protocol; //IPPROTO_IP, IPPROTO_IPV4, IPPROTO_IPV6 etcsize_t ai_addrlen;//length of ai_addrchar* ai_canonname; //full hostnamestruct sockaddr* ai_addr; //addr of hoststruct addrinfo* ai_next;}value of ai_falgs:AI_PASSIVE: Socket address is intended for `bind".AI_CANONNAME:Request for canonical name.AI_NUMERICHOST: Don"t use name resolution.AI_V4MAPPED: IPv4 mapped addresses are acceptable.AI_ALL: Return IPv4 mapped and IPv6 addresses.AI_ADDRCONFIG:Use configuration of this host to choose
2023-06-19 17:34:561

电池组上的addr是什么意思?

这是address(地址)的缩写,请参考!
2023-06-19 17:35:141

地址address的简写是add还是add?

1、是 add 一般英文单词的缩写都是三个,比如说月份和星期不都是三个字母的缩写吗,eg :Monday 缩写成Mon,一般情况是在缩写的后面加一个实心点,但是很多英国人都不写,所以现在很多点也就省略不写了!2、一般方便的话,是ADD比较好。但系统中读取字段的时候,有存在通用词,所以,如果有想冲突的,后者比较好。如果没有冲突重复的,前者是最好的了。3、一般缩写为add.或者addr.两个后面都有点!因为这个加点是为了区别add(add这个单词的意思是“加”)。后面如果要加地址,应当写为add.:或者addr.:(建议写为后一个)有点有冒号!
2023-06-19 17:35:221

c语言中addr[m]什么意思

addr[m]表示取数组或指针addr的第m个数据的值注:一些数组编译时就会确定其取值的内存地址 故此表达式不适于这类数组
2023-06-19 17:35:311

C语言中 if(addr&0x80)什么意思?这里addr是一个8位数据

addr & 0x80 是位与表达式,0x80的二进制码是1000 0000,用0x80和addr进行与(&)操作,意味着将addr中低7位清零,仅保留最高的1位。那么,if(addr&0x80)的意思就是判断addr的最高位是否为1。加入addr代表地址线的话,这条语句的含义就是检测8位地址线的第7位(最低位为0位)是否置1了。
2023-06-19 17:35:401

汇编语言 程序段将数据段中首地址为ADDR

ax ax di lodsb你试试看对么.mov ax,data ;数据段地址赋给AXmov ds,ax ;再赋给DS和ESmov es,axmov si,offset addr ;得到ADDR的偏移赋给SImov di,si ;把ADDR的偏移赋给DIcld ;置方向位 mov cx,N ;一共有多少个数据NEXT:lodsb ;把ds:si的值加载给al 同时si加1inc al ;al加1stosb ;把al的值存入es:di的位置loop NEXT ;这个你懂吧
2023-06-19 17:35:481

为什么前面用address ,后面用addr 都是地址的意思。用法有什么区别吗?

有区别,一个是指 主机地址 ,另一个是指 网络地址字节顺序
2023-06-19 17:35:572

wireshark的过滤器 ip.addr、ip.src和ip.dst有什么不同?

针对wireshark最常用的自然是针对IP地址的过滤。其中有几种情况:  (1)对源地址为192.168.0.1的包的过滤,即抓取源地址满足要求的包。   表达式为:ip.src == 192.168.0.1  (2)对目的地址为192.168.0.1的包的过滤,即抓取目的地址满足要求的包。   表达式为:ip.dst == 192.168.0.1  (3)对源或者目的地址为192.168.0.1的包的过滤,即抓取满足源或者目的地址的ip地址是192.168.0.1的包。   表达式为:ip.addr == 192.168.0.1,或者 ip.src == 192.168.0.1 or ip.dst == 192.168.0.1  (4)要排除以上的数据包,我们只需要将其用括号囊括,然后使用 "!" 即可。   表达式为:!(表达式)
2023-06-19 17:36:081

addr1r2是什么意思

addr1r2的意思是将r1中的数与(r2)指示的主存单元中的数相加,相加的结果直接传送到r1中。addr1r2是addr1,(r2)指令周期信息流,是将r1中的数与(r2)指示的主存单元中的数相加,相加的结果直接传送到r1中。
2023-06-19 17:36:141

我的电脑启动时显示CLIENT MAC ADDR:

client(客户端)mac addr(物理地址),意思就是说你电脑的网卡地址是:14:78:98:F4:8E。 MAC(Media Access Control, 介质访问控制)地址是识别LAN(局域网)节点的标识。网卡的物理地址通常是由网卡生产厂家烧入网卡的EPROM(一种闪存芯片,通常可以通过程序擦写),它存储的是传输数据时真正赖以标识发出数据的电脑和接收数据的主机的地址。 也就是说,在网络底层的物理传输过程中,是通过物理地址来识别主机的,它一般也是全球唯一的。比如,著名的以太网卡,其物理地址是48bit(比特位)的整数,如:44-45-53-54-00-00,以机器可读的方式存入主机接口中。以太网地址管理机构(IEEE)将以太网地址,也就是48比特的不同组合,分为若干独立的连续地址组,生产以太网网卡的厂家就购买其中一组,具体生产时,逐个将唯一地址赋予以太网卡。 形象的说,MAC地址就如同我们身份证上的身份证号码,具有全球唯一性。 如何获取本机的MAC? 对于数量不多的几台机器,我们可以这样获取MAC地址:在Windows 98/Me中,依次单击“开始”→“运行” →输入“winipcfg”→回车。即可看到MAC地址。 在Windows 2000/XP中,依次单击“开始”→“运行”→输入“CMD”→回车→输入“ipconfig /all”→回车。即可看到MAC地址 怎么在启动时不加载它呢?我想启动时不显示这个东西?我不知道,我的电脑不会显示,也许是你那里设置有问题,你用什么方式上网的,你看看端口的设置。
2023-06-19 17:36:231

(addr+7)&(~7)什么意思 c语言

假设addr是字节型变量addr中存放的数加7得到的结果与7取反的数进行与运算,~7=~00000111B=11111000B效果是清除addr中存放的数加7的结果的二进制最低三位,保留高位
2023-06-19 17:36:441

(addr>>24)&0xff什么意思

addr应该是32位int型的吧,这句意思是把addr右移24位和0xff作按位与运算,也就是将addr的最高8位与11111111按位与。
2023-06-19 17:36:521

verilog中addr定义为red型变量,addr[3:0]=-3,addr是操作数时,他的值是()

A操作数为负数时,采用补码。addr的原码为4‘b1011,反码为4"b1100,补码为4"b1101.
2023-06-19 17:37:001

51单片机的RAM地址设置LcdWriteCmd(addr|0x80),括号里的|是什么意思

括号里面的|是“或”运算符。也就是将addr最高位置1。
2023-06-19 17:37:082

安卓手机里address0.addr是什么文件啊?可不可以删除啊?

address0.addr很明显是android应用生成的缓存文件,可以删除。Android中,SDcard中的文件都可以删除删除方式:在手机上点击文件管理。点击SD卡,选择address0.add目录,长按删除即可。将手机或者SD卡连接电脑,在电脑上删除即可。
2023-06-19 17:37:161

Python data,addr=recv(2048)什么意思

这个要贴具体代码看看哈。大致的意思是,后面recv是个函数,接收了一个2048的参数;这个函数有两个返回值,一个是data,一个是addr
2023-06-19 17:37:242

addr = (_bss_end + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1);什么意思?

对于PAGE_SIZE的值为2的n次幂,如4096,经过addr = (_bss_end + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1);操作之后,得到的addr的值按照PAGE_SIZE即4096大小对齐,addr的值是PAGE_SIZE的倍数,并且是刚好大于_bss_end值。若_bss_end是PAGE_SIZE的倍数,则addr=_bss_end。举个例子:_bss_end=100,PAGE_SIZE=64,上述计算后,addr=128,刚好是64的倍数,且大于100,若_bss_end=128,则addr=128个人见解,高手请指点
2023-06-19 17:37:311

西门子put指令addr和sd地址一样可以吗

可以。put指令addr和sd地址一样不会混乱,输入输出参数不会重复,这样才不会冲突。也不会导致系统错乱问题。
2023-06-19 17:37:381

数字电路addr [12: 0]里的12: 0各表示什么意思

就是表示地址总线A12~A0,供13根线,8K寻找空间。 32位数据总线的D31~D16高16位,低16位是D15~D0。
2023-06-19 17:38:391

C51 单片机1602的问题,为什么addr=0x80+x;addr=0xc0+x;0x80、0xc0是哪里来的???

你仔细看看这个就知道了 它就是从那个字节开始显示的意思 你看看手册吧
2023-06-19 17:38:474

#define ADDR (*(volatile long *) addr) 可以解释一下这条语句吗

这个可以简单地理解为:在内存中指定的地址addr处,定义一个变量ADDR ,所以以后对这个变量ADDR的操作,就相当于对addr地址特殊功能寄存器的操作。
2023-06-19 17:38:584

电脑出现addr(1)error do,怎么办呢?

系统运行错误。先卸载掉这个程序,在重新安装,并关掉在系统登陆时启动程序即可
2023-06-19 17:39:081

利用addr2line分析堆栈异常

最近在调屏过程中遇到开不了机的情况,卡在Android启动过程中,从日志分析只能看到堆栈信息,无法看到具体报错行,为此,需要借助addr2line工具定位信息。 logcat输出如下: 先查看这行栈信息看有没发现:#01 pc 0002c591 /vendor/lib/hw/hwcomposer.amlogic.so 怎么查看呢?address2line 是android ndk工具里自带有,目录在 C:UsersMoternAppDataLocalAndroidSdk dk-bundle oolchainsarm-linux-androideabi-4.9prebuiltwindows-x86_64inarm-linux-androideabi-addr2line.exe 使用方法如下: ①.根据报错日志找到报错的库文件,如我要查看这行“#01 pc 0002c591 /vendor/lib/hw/hwcomposer.amlogic.so”, 在系统编译出的symbols符号表找到对应文件,/vendor/lib/hw/hwcomposer.amlogic.so对应的则是 out argetproductw400symbolsvendorlibhwhwcomposer.amlogic.so ②.address2line 命令行格式: arm-linux-androideabi-addr2line -e 【file】-s -f -C [addr(s)] file:表示要分析的库文件,这里是out argetproductw400symbolsvendorlibhwhwcomposer.amlogic.so addr表示栈地址,这里是0002c591 . 输出如下: 这样我们可以看到程序在DualDisplayPipe.cpp第35行报错。 查看DualDisplayPipe.cpp,可以猜测程序报错是因为配置了双屏,而实际程序获取到屏幕数并没有两个,故抛出异常,我们再查看dts是否配置了双屏确认猜测。果然,配置的是“dual”双屏,改成单屏“default”,重新编译烧录,顺利进入Android桌面。
2023-06-19 17:39:181

ADDR0,#DATA如何实现

之间的关系要用二进制才能实现。例如:以ADDr2,r1,r0为例,r1和r0分别作为ALU的DATA和ACCUM输入,r2作为ALU_OUT输出,OPCODE则输入ADD对应的二进制数据。因此ADD的运算过程本质是通过ALU运算单元来完成。实际上汇编语言本身是给人看的,只不过是一种更加贴近底层,直接操作寄存器的代码。汇编语言在运行之前同样需要经过编译过程生成.obj的二进制机器语言,随后存放在存储器中。当CPU运行到ADD这部分汇编语言对应的二进制语言的时候,实际上是使用下面所示的ALU(ArithmeticandLogicUnit)进行运算处理。根据OPCODE的不同,ALU还能完成除了ADD以外的其他功能,比如AND、XOR、JMP等功能。
2023-06-19 17:39:271

网络编程addr.sin_addr.s_addr

看结构体定义啊,首先变量addr,它是一个结构体,一般为struct sockaddr_in类型,然后这个结构体有结构体struct in_addr的成员sin_addr,这个结构体有成员s_addr,整个数据的访问就变为addr.sin_addr.s_addr
2023-06-19 17:39:361

((uchar) &addr) 是什么意思

C语言中,把addr的地址转换为uchar类型
2023-06-19 17:39:442

单片机中addr是什么意思

单片机中addr是内存地址变量名。单片机的addr是一个内存地址变量名。addr属于整型表达式。
2023-06-19 17:40:101

电脑上的addr是什么软件?重点是可不可以卸载

电脑上的addr是PPS在线看电视直播安装的一个插件,可以卸载的。1、首先打开软件管理应用程序,进入到软件管理的首页中。2、然后在首页的窗口中,点击打开“卸载”设置选项。3、然后在弹出来的窗口中,找到addr插件。4、找到之后,就点击后面的“一键卸载”选项。5、等待卸载完成就可以了。
2023-06-19 17:40:191

电脑上的addr是什么软件?重点是可不可以卸载

电脑上的addr是PPS在线看电视直播安装的一个插件,可以卸载的。1、首先打开软件管理应用程序,进入到软件管理的首页中。2、然后在首页的窗口中,点击打开“卸载”设置选项。3、然后在弹出来的窗口中,找到addr插件。4、找到之后,就点击后面的“一键卸载”选项。5、等待卸载完成就可以了。
2023-06-19 17:40:571

地址的英文单词address的缩写是addr还是add ?

add.(要加後面的点)shenzheng就可以了另:addr.是缩写的意思.全拼是abbreviation.
2023-06-19 17:41:331

ADDR 什么意思?

ADDR是ADDress Register的缩写,意为:地址寄存器.
2023-06-19 17:41:401

Addr是什么软件可以删除吗

可以删除!不过一般很难删掉,上次我用的是360粉碎机删的!
2023-06-19 17:41:482

地址的英文缩写?ADDr.ADD.ADR.

地址 [dì zhǐ] address (ADDR; ADR)
2023-06-19 17:42:061

电池上ADDR什么意思?

这是address(地址)的缩写,请参考!
2023-06-19 17:42:151

addr是啥词性

这个单词看不大懂啊。sorry。
2023-06-19 17:42:232

data=~*addr是什么意思?

addr先进行取值运算,然后按位取反,结果赋值给data
2023-06-19 17:42:301

微机原理中lea ds,addr什么意思

lea ds,addr ;将变量addr的有效地址偏移量装入DX寄存器
2023-06-19 17:43:311

serv_addr.sin_addr = *((struct in_addr *)host->h_addr);请高手详细解释一下这句话?非常感谢!!!!

不懂语法还是?
2023-06-19 17:43:381

请各位大神解答一下ENLED,ADDR1是什么意思啊

address1的缩写,意思是地址,真实地址,地址线。望采纳!
2023-06-19 17:43:441

单片机编程里的addr3=1,这里的1是什么意思?

#include <reg52.h> typedef unsigned char uint8; typedef unsigned int uint16; sbit ENLED = P1^4; sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit ADDR3 = P1^3; main() { uint16 i; while(1) { ENLED = 0; ADDR0 = 0; ADDR1 = 1; ADDR2 = 1; ADDR3 = 1; P0=0x7F; for(i=0;i<10000;i++); ENLED = 0; ADDR0 = 0; ADDR1 = 1; ADDR2 = 1; ADDR3 = 1; P0=0xBF; for(i=0;i<10000;i++); ENLED = 0; ADDR0 = 0; ADDR1 = 1; ADDR2 = 1; ADDR3 = 1; P0=0xDF; for(i=0;i<10000;i++); ENLED = 0; ADDR0 = 0; ADDR1 = 1; ADDR2 = 1; ADDR3 = 1; P0=0xEF; for(i=0;i<10000;i++); ENLED = 0; ADDR0 = 0; ADDR1 = 1; ADDR2 = 1; ADDR3 = 1; P0=0xF7; for(i=0;i<10000;i++); ENLED = 0; ADDR0 = 0; ADDR1 = 1; ADDR2 = 1; ADDR3 = 1; P0=0xFB; for(i=0;i<10000;i++); ENLED = 0; ADDR0 = 0; ADDR1 = 1; ADDR2 = 1; ADDR3 = 1; P0=0xFD; for(i=0;i<10000;i++); ENLED = 0; ADDR0 = 0; ADDR1 = 1; ADDR2 = 1; ADDR3 = 1; P0=0xFE; for(i=0;i<10000;i++); }
2023-06-19 17:43:531

sym32程序的BIT_ADDR(GPIOA_ODR_Addr,n)里的n是什么意思?

n代表你要操作的IO口,比如说你要操作GPIO_Pin_10,那n的值就给10。
2023-06-19 17:44:011

单片机MOV R0,#ADDR0是什么意思

#ADDR0代表一个8位立即数,这条指令就是把这个数送到R0寄存器中。比如:MOV R0,#40H
2023-06-19 17:44:161

add a,addr的操作控制序列中的rd ,是什么意思

RD的意思就是Read也就是读指令的意思。RD的上一句已经将MAR中的存放的地址通过地址总线送出所以这一句应该是Read读指令。然后下一句再通过数据总线将数据回送。
2023-06-19 17:44:231

西门子PLC的addr地址可以用00001吗?

可以啊,但是没有必要把,这个只有在PLC与PLC或者是PLC与其它控制系统通讯才会用到的啊
2023-06-19 17:44:311