【问题标题】:arm controller lm3s8962手臂控制器 lm3s8962
【发布时间】:2013-03-12 04:57:28
【问题描述】:

嗨,

我是嵌入式编码的新手。我正在研究 ARM lm3s8962 控制器。

谁能向我解释一下下面的代码在做什么?它正在实现 bit banging,但我想知道它是如何实现的。

//*****************************************************************************
//
// 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))

【问题讨论】:

  • 呃,有什么可以得到的?它们只是做事的宏/程序员快捷方式。他们不靠自己做任何事情。
  • 感谢您的回复,我想知道这个过程是如何进行的,就像 hWREG 返回地址一样,hwregh 和 b 也是如此,但是当涉及到 HWREGBITB(X,b) 时设置位(如果 m 没有错)我想知道它是如何设置这个位的,因为我对这么多移位操作感到困惑,你能解释一下吗?再次感谢

标签: bitmap arm cortex-m3 texas-instruments


【解决方案1】:

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

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

我们可以由此推断HWREG 采用某种形式的某种地址。这将帮助我们弄清楚HWREGBITB 的作用。

HWREGBITB(x, b) 接受它的 x 值,

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

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

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

【讨论】:

  • 访问内存,例如gHWREGBITW(&g_ulFlags, 0) ^= 1;在这里它正在切换位,现在你能清楚它是如何访问它的吗?
  • 简单地说,这些宏让您可以像访问变量一样访问硬件寄存器。只需将gHWREGBITW(&amp;g_ulFlags, 0) ^= 1 视为var ^= 1 之类的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-12
  • 2014-09-07
相关资源
最近更新 更多