您好,
我是嵌入式编码的新手。我正在研究ARM lm3s8962控制器。
任何人都可以向我解释下面的代码是做什么的吗?它正在实施比特敲击,但我想知道它是如何实现的。
//*****************************************************************************
//
// Macros for hardware access, both direct and via the bit-band region.
//
//*****************************************************************************
#define HWREG(x) \
(*((volatile unsigned long *)(x)))
#define HWREGH(x) \
(*((volatile unsigned short *)(x)))
#define HWREGB(x) \
(*((volatile unsigned char *)(x)))
#define HWREGBITW(x, b) \
HWREG(((unsigned long)(x) & 0xF0000000) | 0x02000000 | \
(((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2))
#define HWREGBITH(x, b) \
HWREGH(((unsigned long)(x) & 0xF0000000) | 0x02000000 | \
(((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2))
#define HWREGBITB(x, b) \
HWREGB(((unsigned long)(x) & 0xF0000000) | 0x02000000 | \
(((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2))
答案 0 :(得分:1)
这些是宏的声明。它们不是功能,它们不会返回&#39;任何东西。他们只是一个稍微聪明的搜索和替换。
在回复您的评论时,HWREG(x)
将替换为(*((volatile unsigned long *)(x)))
(这是一个指针参照,即获取地址x
处的值)和替代x
及其参数当它通过预处理器运行时。
我们可以从中推断HWREG
以某种形式提供某种地址。这有助于我们了解HWREGBITB
的作用。
HWREGBITB(x, b)
获取x
值,
((unsigned long)(x) & 0xF0000000)
):清除除最高有效4位之外的所有位(假设long为32位宽)| 0x02000000
):将接下来的4位设置为值2。| (((unsigned long)(x) & 0x000FFFFF) << 5)
):获取原始x
的低20位,并将其向左移5位。然后,将其输入结果。| ((b) << 2)
):取b
,将其移位2位,然后将其移入结果中。HWREG
您可以使用类似的方法来计算其他宏的含义。
它在硬件方面的具体作用取决于它所访问的硬件以及外设上的寄存器。如果我不得不猜测,我会说它在AXI总线上进行某种交易。