|
如下宏定义:- #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))); \
- (*(((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)
复制代码 其中数据类型定义:- typedef unsigned char CPU_INT08U; /* 8-bit unsigned integer */
复制代码- typedef unsigned int CPU_INT32U; /* 32-bit unsigned integer */
复制代码- #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周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|