[英]c program - struct pointer
我对rtc_set_alarm(RTC_0, (RTC[RTC_0].rtc_ccvr + ALARM));
行有疑问rtc_set_alarm(RTC_0, (RTC[RTC_0].rtc_ccvr + ALARM));
在下面的main()
中。
在rtc_set_alarm()
的第二个参数中,我理解RTC
是指向地址0xB0000400的struct
类型的指针。 然后,它使用.rtc_ccvr
访问结构的第一个成员。
我的问题是,为什么有必要使用RTC_0
的的enum rtc_t
。
我认为这只是RTC.rtc_ccvr
吗?
抱歉,我是struct指针的新手。
** Number of RTC controllers. */
typedef enum { RTC_0 = 0, RTC_NUM } rtc_t;
/** RTC register map. */
typedef struct {
RW uint32_t rtc_ccvr; /**< Current Counter Value Register */
RW uint32_t rtc_cmr; /**< Current Match Register */
RW uint32_t rtc_clr; /**< Counter Load Register */
RW uint32_t rtc_ccr; /**< Counter Control Register */
RW uint32_t rtc_stat; /**< Interrupt Status Register */
RW uint32_t rtc_rstat; /**< Interrupt Raw Status Register */
RW uint32_t rtc_eoi; /**< End of Interrupt Register */
RW uint32_t rtc_comp_version; /**< End of Interrupt Register */
} rtc_reg_t;
/* RTC register base address. */
#define RTC_BASE (0xB0000400)
/* RTC register block. */
#define RTC ((rtc_reg_t *)RTC_BASE)
//--------------------------------------------------------------------------
//function declaration
int qm_rtc_set_alarm(const rtc_t rtc, const uint32_t alarm_val)
//--------------------------------------------------------------------------
int main(void)
{
#define ALARM (RTC_ALARM_MINUTE / 6)
rtc_set_alarm(RTC_0, (RTC[RTC_0].rtc_ccvr + ALARM));
}
因此,您可以拥有多个RTC。 要访问第二个,您将使用
rtc_set_alarm(RTC_1, (RTC[RTC_1].rtc_ccvr + ALARM));
它与该结构内部的字段无关,它使用哪个结构
让我们检查一下代码。 您可能知道enum
只是给数字命名的一种方式,因此enum
每个值都转换为整数RTC_0
在此代码中与0
完全相同。 因此调用:
rtc_set_alarm(RTC_0, (RTC[RTC_0].rtc_ccvr + ALARM));
与...相同
rtc_set_alarm(RTC_0, (RTC[0].rtc_ccvr + ALARM));
现在什么是RTC
? 它是一个指向结构的指针,但是没有关于rtc_reg_t
类型的寄存器集多少的信息。 因此,如果您有三个这样的寄存器组,则这样做同样有效:
rtc_set_alarm(RTC_0, (RTC[2].rtc_ccvr + ALARM));
因此,写入RTC[RTC_0]
的目的是显式访问第一个RTC控制器的寄存器,并以相同的方式访问其他寄存器(如果有)。 在您的示例中,只有一个,并且rtc_set_alarm
可能检查您是否没有访问索引RTC_NUM
或更高。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.