5

我有以下一段代码。它是由我的 IDE 生成的,我正在尝试理解它。

#define TRGMR (*(volatile union un_trgmr *)0xF0250).trgmr

根据数据手册,这里的定时器管理器位于 0xF0250 位置。但我无法理解的是语法。

union un_trgmr {
    unsigned char trgmr;
    __BITS8 BIT;
};

我知道指针。但我真的无法理解到底在做什么。有人可以帮我吗?顺便说一下 BITS8 是另一个具有位域的结构,如下所示:

typedef struct {
    unsigned char no0 :1;
    unsigned char no1 :1;
    unsigned char no2 :1;
    unsigned char no3 :1;
    unsigned char no4 :1;
    unsigned char no5 :1;
    unsigned char no6 :1;
    unsigned char no7 :1;
} __BITS8;
4

1 回答 1

10

这只是一种在固定地址访问内存映射寄存器的方法0xF0250。您可以通过联合字段访问寄存器的各个位BIT,或通过该字段访问整个 8 位寄存器trmgr。只是让您可以方便地访问后者#define,以便您可以编写,例如

TRMGR = 0x3f; // write 0x3f to timer manager register

注意使用volatile- 这是内存映射 I/O 寄存器的常用技术,以确保读取/写入始终按预期发生并且不会被优化掉(因为它们可能与正常的内存位置一样)。

于 2013-07-21T09:59:42.347 回答