搜索
bottom↓
回复: 2

地址总线/数据总线的疑惑

[复制链接]

出0入0汤圆

发表于 2012-10-10 17:00:33 | 显示全部楼层 |阅读模式
如下宏定义:
  1. #define  MEM_VAL_SET_INT32U_LITTLE(addr, val)                  do { (*(((CPU_INT08U *)(addr)) + 0)) = ((CPU_INT08U)((((CPU_INT32U)(val)) & (CPU_INT32U)0x000000FFu) >> (0u * DEF_OCTET_NBR_BITS))); \
  2.                                                                     (*(((CPU_INT08U *)(addr)) + 1)) = ((CPU_INT08U)((((CPU_INT32U)(val)) & (CPU_INT32U)0x0000FF00u) >> (1u * DEF_OCTET_NBR_BITS))); \
  3.                                                                     (*(((CPU_INT08U *)(addr)) + 2)) = ((CPU_INT08U)((((CPU_INT32U)(val)) & (CPU_INT32U)0x00FF0000u) >> (2u * DEF_OCTET_NBR_BITS))); \
  4.                                                                     (*(((CPU_INT08U *)(addr)) + 3)) = ((CPU_INT08U)((((CPU_INT32U)(val)) & (CPU_INT32U)0xFF000000u) >> (3u * DEF_OCTET_NBR_BITS))); } while (0)
复制代码
其中数据类型定义:
  1. typedef  unsigned  char        CPU_INT08U;                      /*  8-bit unsigned integer                              */
复制代码
  1. typedef  unsigned  int         CPU_INT32U;                      /* 32-bit unsigned integer                              */
复制代码
  1. #define  DEF_OCTET_NBR_BITS                                8u
复制代码
通过宏定义名称可以看出是将32位无符号数以小端模式(低字节低地址)放置到某个地址,

假设芯片是32位地址总线和数据总线的ARM核,假设addr = 0x10000000,假设val=0x12345678,拿第三条语句:
(*(((CPU_INT08U *)(addr)) + 2)) = ((CPU_INT08U)((((CPU_INT32U)(val)) & (CPU_INT32U)0x00FF0000u) >> (2u * DEF_OCTET_NBR_BITS)));

我的疑惑:
1,(*(((CPU_INT08U *)(addr)) + 2)) 保证了0x10000002(一个字节)地址是被写的目的地址,但是地址总线是32位的,出现在地址总线上的是32根信号,32根信号是不是会殃及临近的空间?如果不会,是不是说所有的处理器寻址都是字节寻址的或者有字节寻址的能力?

2,((((CPU_INT32U)(val)) & (CPU_INT32U)0x00FF0000u) >> (2u * DEF_OCTET_NBR_BITS)));语句得到数据0x00000034,
((CPU_INT08U)((((CPU_INT32U)(val)) & (CPU_INT32U)0x00FF0000u) >> (2u * DEF_OCTET_NBR_BITS)));得到数据0x34,那么出现在数据总线上的到底是32根信号的0x00000034还是8根信号的0x34?

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2012-10-11 12:29:06 | 显示全部楼层
怎么有20多人查看却没有半个人说句话

出350入477汤圆

发表于 2012-10-11 14:05:46 | 显示全部楼层
wangxj_nemo 发表于 2012-10-11 12:29
怎么有20多人查看却没有半个人说句话

如果你是为了连接外部器件而问这个问题,答案由你所用的单片机的外部总线控制器决定。
某些总线控制器要求16位外设的A0接单片机的A0,某些总线控制器要求16位外设的A0接单片机A1(也就是外部地址被移位,单片机的A0不用)。
如果单片机外总线是16位数据,通常会有2个BYTE选择线,分别选择高BYTE和低BYTE。如果单片机外总线是32位,则有4个BYTE选择线。
只读一个BYTE的时候,比如这个BYTE是奇数,那么到底是用数据总线的最低BYTE加上完整地址来读,还是用移位后的地址加上高BYTE选择线来读也是由你的单片机的外部总线控制器决定的。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-10 07:39

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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