了解C中的低级初始化

时间:2013-07-21 09:56:57

标签: c

我有以下代码。它是由我的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;

1 个答案:

答案 0 :(得分:10)

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

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

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