2013-03-12 79 views
0

嗨,手臂控制器lm3s8962

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

呃,那里有什么?他们只是宏/程序员快捷方式来做事情。他们自己不做任何事情。 – tangrs 2013-03-12 06:30:58

+0

谢谢你的回复,我想知道过程如何继续,就像hWREG返回hwregh和b的情况一样,但是当涉及到HWREGBITB(X,b)时,它设置了位(如果m不是错)我想知道它是如何设置这一点的,因为我在这么多转换操作中感到困惑,请问你能解释一下吗? thanx再次 – user2159417 2013-03-12 08:11:51

回答

1

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

在回答您的意见,HWREG(x)被替换为(*((volatile unsigned long *)(x)))(这是一个指针,尊重即获得在地址x值)及其参数substitues和x当通过预处理器运行。

我们可以推断,HWREG需要某种形式的地址。这将帮助我们确定HWREGBITB的功能。

HWREGBITB(x, b)需要它x值,

  1. ((unsigned long)(x) & 0xF0000000)):清除了所有的位,除了最显著4个比特(假设多头是32个比特宽)
  2. | 0x02000000):设置在接下来的4位的值设置为2.
  3. | (((unsigned long)(x) & 0x000FFFFF) << 5)):获取原始的x的低20位,并将其向左移5位。然后,或者将其放入结果中。
  4. | ((b) << 2)):取b,将其移位2位并将其放入结果中。
  5. 治疗最终结果为一个地址,并取消对它的引用使用HWREG

您可以使用类似的方法来找出什么其他的宏意思。

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

+0

谢谢tangrs有帮助清除概念 – user2159417 2013-03-12 08:44:39

+0

它是访问内存,例如HWREGBITW(&g_ulFlags,0)^ = 1;在这里它正在切换,现在你可以清楚它是如何访问它的。 – user2159417 2013-03-12 09:08:55

+0

简而言之,这些宏让您可以像访问硬件寄存器一样使用变量。把'gHWREGBITW(&g_ulFlags,0)^ = 1'想象成像'var^= 1'一样。 – tangrs 2013-03-12 23:31:09