1

你好,

我是嵌入式编码的新手。我正在研究 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))
4

1 回答 1

1

这些是宏的声明。它们不是函数,它们不会“返回”任何东西。它们只是一个稍微智能的搜索和替换。

作为对您的评论的回应,HWREG(x)它被替换为(*((volatile unsigned long *)(x)))(这是一个指针引用,即在 address 处获取值x)并x在通过预处理器运行时用其参数替换。

我们可以从中推断出HWREG以某种形式采用某种地址。这将帮助我们弄清楚是什么HWREGBITB

HWREGBITB(x, b)看重它的x价值,

  1. ( ((unsigned long)(x) & 0xF0000000)):清除除最高有效 4 位之外的所有位(假设 long 为 32 位宽)
  2. ( | 0x02000000):将接下来的 4 位设置为值 2。
  3. ( | (((unsigned long)(x) & 0x000FFFFF) << 5)):获取原始数据的低 20 位x并将其向左移动 5 位。然后,或将其放入结果中。
  4. ( | ((b) << 2)): 取b,将其移动 2 位,然后将其与结果相或。
  5. 将最终结果视为地址并使用取消引用它HWREG

您可以使用类似的方法来计算其他宏的含义。

它在硬件方面的具体作用取决于它正在访问的硬件以及外围设备上的寄存器是什么。如果我不得不猜测,我会说它正在 AXI 总线上进行某种事务。

于 2013-03-12T08:37:55.550 回答