Bitmap arm控制器lm3s8962

Bitmap arm控制器lm3s8962,bitmap,arm,cortex-m3,texas-instruments,Bitmap,Arm,Cortex M3,Texas Instruments,嗨 我不熟悉嵌入式编码。我在ARM lm3s8962控制器上工作 有人能给我解释一下下面的代码在做什么吗?它正在实现bit-bang,但我想知道它是如何实现的 //***************************************************************************** // // Macros for hardware access, both direct and via the bit-band region. // //**********

我不熟悉嵌入式编码。我在ARM lm3s8962控制器上工作

有人能给我解释一下下面的代码在做什么吗?它正在实现bit-bang,但我想知道它是如何实现的

//*****************************************************************************
//
// 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(x)\
(*((易失性无符号长*)(x)))
#定义HWREGH(x)\
(*((易失性无符号短*)(x)))
#定义HWREGB(x)\
(*((易失性无符号字符*)(x)))
#定义HWREGBITW(x,b)\
HWREG((无符号长)(x)和0xf000000)0x020000000\

(((unsigned long)(x)&0x000FFFFF)这些是宏的声明。它们不是函数,也不会“返回”任何内容。它们只是稍微聪明一点的搜索和替换

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

我们可以由此推断,
hwregb
采用某种形式的地址。这将帮助我们了解
HWREGBITB
的作用

HWREGBITB(x,b)
接受它的
x

  • ((无符号长)(x)&0xF0000000)
    ):清除除最高有效4位以外的所有位(假设长为32位宽)
  • | 0x020000
    ):将接下来的4位设置为值2

  • |)((unsigned long)(x)&0x000FFFFF)这些是宏的声明。它们不是函数,也不会“返回”任何内容。它们只是稍微聪明一点的搜索和替换

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

    我们可以由此推断,
    hwregb
    采用某种形式的地址。这将帮助我们了解
    HWREGBITB
    的作用

    HWREGBITB(x,b)
    接受它的
    x

  • ((无符号长)(x)&0xF0000000)
    ):清除除最高有效4位以外的所有位(假设长为32位宽)
  • | 0x020000
    ):将接下来的4位设置为值2

  • |)((unsigned long)(x)&0x000FFFFF)呃,有什么可以得到的?它们只是宏/程序员用来做事情的快捷方式。它们自己不做任何事情。感谢您的回复,我想知道这个过程是如何进行的,比如hWREG返回的地址与hwregh和b的情况相同,但是当涉及到HWREGBITB(x,b)时它设置位(如果m没有错)我想知道它是如何设置这个位的,因为我在这么多的移位操作中感到困惑,你能解释一下吗?thanx againUh,有什么可以得到的?它们只是宏/程序员的快捷方式。它们自己不做任何事情。谢谢你的回复,我想知道这个过程是如何进行的,就像hWREG返回相同的地址一样hwregh和b是这样的,但是当涉及到HWREGBITB(X,b)时,它设置了位(如果m没有错的话),我想知道它是如何设置这个位的,因为我在这么多的移位操作中感到困惑,你能解释一下吗?thanx againit是访问内存的,例如gHWREGBITW(&g_ulFlags,0)^=1;这里是切换位,现在您可以清楚它是如何访问它的。简单地说,这些宏让您像访问变量一样访问硬件寄存器。只需将
    gHWREGBITW(&g_ulFlags,0)^=1
    想象成类似
    var^=1
    。它是访问内存,例如gHWREGBITW(&g_ulFlags,0)^=1;这里是切换位,现在您可以清楚它是如何访问它的。简单地说,这些宏让您像访问变量一样访问硬件寄存器。只需将
    gHWREGBITW(&g_ulFlags,0)^=1
    想象成类似
    var^=1