wangxj_nemo 发表于 2012-10-10 17:00:33

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

如下宏定义:#defineMEM_VAL_SET_INT32U_LITTLE(addr, val)                  do { (*(((CPU_INT08U *)(addr)) + 0)) = ((CPU_INT08U)((((CPU_INT32U)(val)) & (CPU_INT32U)0x000000FFu) >> (0u * DEF_OCTET_NBR_BITS))); \
                                                                  (*(((CPU_INT08U *)(addr)) + 1)) = ((CPU_INT08U)((((CPU_INT32U)(val)) & (CPU_INT32U)0x0000FF00u) >> (1u * DEF_OCTET_NBR_BITS))); \
                                                                  (*(((CPU_INT08U *)(addr)) + 2)) = ((CPU_INT08U)((((CPU_INT32U)(val)) & (CPU_INT32U)0x00FF0000u) >> (2u * DEF_OCTET_NBR_BITS))); \
                                                                  (*(((CPU_INT08U *)(addr)) + 3)) = ((CPU_INT08U)((((CPU_INT32U)(val)) & (CPU_INT32U)0xFF000000u) >> (3u * DEF_OCTET_NBR_BITS))); } while (0)
其中数据类型定义:typedefunsignedchar      CPU_INT08U;                      /*8-bit unsigned integer                              */
typedefunsignedint         CPU_INT32U;                      /* 32-bit unsigned integer                              */
#defineDEF_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?

wangxj_nemo 发表于 2012-10-11 12:29:06

怎么有20多人查看却没有半个人说句话{:mad:}

redroof 发表于 2012-10-11 14:05:46

wangxj_nemo 发表于 2012-10-11 12:29 static/image/common/back.gif
怎么有20多人查看却没有半个人说句话

如果你是为了连接外部器件而问这个问题,答案由你所用的单片机的外部总线控制器决定。
某些总线控制器要求16位外设的A0接单片机的A0,某些总线控制器要求16位外设的A0接单片机A1(也就是外部地址被移位,单片机的A0不用)。
如果单片机外总线是16位数据,通常会有2个BYTE选择线,分别选择高BYTE和低BYTE。如果单片机外总线是32位,则有4个BYTE选择线。
只读一个BYTE的时候,比如这个BYTE是奇数,那么到底是用数据总线的最低BYTE加上完整地址来读,还是用移位后的地址加上高BYTE选择线来读也是由你的单片机的外部总线控制器决定的。
页: [1]
查看完整版本: 地址总线/数据总线的疑惑