数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 4381|回复: 8

[C51] C语言宏定义语句求教

[复制链接]
发表于 2021-4-28 23:13:51 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
初学C语言,看到例程有1句这样的宏定义,大概意思是扩展RAM  xdata的某个地址强制定义为某个标识符.  但不明白详细语法。 如下
//-------------------------
#define I2CCFG          (*(unsigned char volatile xdata *)0xfe80)

//------------------------
我能理解的部分如下
#define   是预处理关键词,强制定义
I2CCFG  是标识符
0xfe80   是外扩展RAM的地址
xdata   是寄存器类型,即外扩展RAM
unsigned char   是数据类型

--------------------------------------
第一个  * 号是指针,   那第二个 * 号在这里是什么意思?  volatile  在这里是什么意思?   怎么理解整句   (*(unsigned char volatile xdata *)0xfe80)  的意思???

谢谢

发表于 2021-4-29 00:20:25 | 显示全部楼层
本帖最后由 inthsunshine 于 2021-4-29 00:24 编辑

C的基本概念啊

第一个*   取指针变量的值
第二个*   强制类型转换,把0xfe80转为常数指针

外扩RAM地址为0xfe80对应的单字节无符号整数, 同时禁止编译器优化

打赏

参与人数 2家元 +40 收起 理由
wenxueroom + 20 精彩回帖
广东梁百万 + 20

查看全部打赏

回复 支持 1 反对 0

使用道具 举报

发表于 2021-4-29 01:59:19 | 显示全部楼层
如果你学过汇编语言,看反汇编文件就知道什么意思了。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x

打赏

参与人数 2家元 +25 收起 理由
上官梦舞 + 5 原本我也是一知半解,看完你这个瞬间明了。.
广东梁百万 + 20

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2021-4-29 07:20:05 | 显示全部楼层
volatile禁止缓存,告诉编译器这个变量会自己变(常指外部寄存器)

打赏

参与人数 1家元 +20 收起 理由
广东梁百万 + 20

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2021-4-29 07:28:07 | 显示全部楼层
整句   (*(unsigned char volatile xdata *)0xfe80)

意思就是:用变量I2CCFG存取内存地址为0xfe80的一个字节

打赏

参与人数 1家元 +20 收起 理由
广东梁百万 + 20

查看全部打赏

回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-29 08:48:01 来自手机浏览器 | 显示全部楼层
mmxx2015 发表于 2021-4-29 01:59
如果你学过汇编语言,看反汇编文件就知道什么意思了。

上面这句反汇编程序我完全了解,只是在c语言的语法表达上还未明(只知道大概功能作用),
回复 支持 反对

使用道具 举报

发表于 2021-4-29 10:36:40 | 显示全部楼层
volatile 表示"禁止编译器优化"有点儿笼统
它的作用有如下两点:
1-绕过片上缓存,强制读取
2-禁止指令重排序

一般用于寄存器、并发访问、容易出现分支预测错误的语句,只能限制地址不能限制复杂数据结构

这个关键字 Java用得特别非常多:lol:

如果只为看懂语法,可以选择无视这个关键字。

打赏

参与人数 1家元 +20 收起 理由
广东梁百万 + 20

查看全部打赏

回复 支持 1 反对 0

使用道具 举报

发表于 2021-4-29 12:43:40 | 显示全部楼层
  1. #define I2CCFG          (*(unsigned char volatile xdata *)0xfe80) //这样写不直观,但是通用性好,多种IDE都可以使用

  2. unsigned char volatile xdata I2CCFG _at_ 0xFE80;//跟下面一样,volatile在这里可有可无
  3. unsigned char xdata I2CCFG _at_ 0xFE80;//一个鸟样,这样写更直观,但是通用性不好,只能在keil里面使用
复制代码

打赏

参与人数 1家元 +20 收起 理由
广东梁百万 + 20 謝謝分享

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2021-5-27 14:41:05 | 显示全部楼层
(*(unsigned char volatile xdata *)0xfe80)   

1.  (unsigned char volatile xdata *)  告诉编译器0xfe80 地址存的是 unsigned char volatile xdata 类型,volatile 禁止优化;
2. 通过要是“*” 向这块地址 存 读数据;
                                                                       
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-8-3 00:19 , Processed in 1.326002 second(s), 19 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表