问题描述
- 一道面试题,不是很清楚这个例子怎么解答,求大神帮助.
- 提问是 这段代码有什么问题, 有什么解决思路。(我其实连问题都没看出来,代码可以编译)
// Memory-mapped peripheral
#define STATUS_REG_ADDR 0x12345678 // 32-bit status register
#define DATA_REG_ADDR 0x1234567C // 32-bit data register// Status register bits
#define BUSY_BIT_MASK 0x00000080 // Busy bit == '1' while peripheral busyuint32_t get_value()
{
while (((*(uint32_t*)STATUS_REG_ADDR) & BUSY_BIT_MASK) == 1)
;return *(uint32_t*)DATA_REG_ADDR;
}
解决方案
首先忙碌标志位是第8位,0000 0000 0000 0000 0000 0000 1000 0000
其次是判断标志位是否为1,那么状态寄存器地址取忙碌标志位的值是用按位与操作,得到状态寄存器第八位的值,如果忙碌,则第八位是1,
如果空闲,第八位是0,所以判断的结果不应该是1,而是0000 0000 0000 0000 0000 0000 1000 0000,即((*(uint32_t*)STATUS_REG_ADDR) & BUSY_BIT_MASK) == BUSY_BIT_MASK
在一个判断逻辑问题,标志位为忙时能取数据还是标志位为闲时能取数据的问题。
解决方案二:
我又试了下 之前把调试程序写错了 这儿下变成了 在调用get_value()的时候 出现针对 0x1234567C 也就是DATA_REG_ADDR 内存不能为read的出错
这段程序应该是想问这个导致这个内存出错的原因吧 还是?
解决方案三:
原来问题在于 返回值强制转换 引起的 虽然我不知道为什么 如果直接返回DATA_REG_ADDR 就不会有内存报错了.