我有以下代码。它是由我的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;
答案 0 :(得分:10)
这只是一种在固定地址0xF0250
访问内存映射寄存器的方法。您可以通过union的BIT
字段访问寄存器的各个位,或通过trmgr
字段访问整个8位寄存器。 #define
只是让您方便地访问后者,以便您可以编写,例如
TRMGR = 0x3f; // write 0x3f to timer manager register
请注意volatile
的使用 - 这是内存映射I / O寄存器的常用技术,可确保读/写始终按预期发生,并且不会被优化(因为它们可能与正常的内存位置一致) )。