2016-11-03 8 views
1

Ich habe Frage in Bezug auf die Linie rtc_set_alarm(RTC_0, (RTC[RTC_0].rtc_ccvr + ALARM)); in main() unten.c Programm - struct Zeiger

Im zweiten Argument von rtc_set_alarm() verstehe ich RTC, ein Zeiger von struct Typ zu sein, der auf die Adresse 0xB0000400 zeigt. Es greift dann auf das erste Mitglied der Struktur zu, indem es .rtc_ccvr verwendet.

Meine Frage ist, warum ist es notwendig RTC_0 der enum rtc_t zu verwenden.

Ich würde denken, dass es nur RTC.rtc_ccvr wäre?

Entschuldigung, ich bin neu zu struct Zeiger.

** 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)); 
} 

Antwort

2

so können Sie mehr als eine RTC haben. Um den zweiten Zugriff Sie

rtc_set_alarm(RTC_1, (RTC[RTC_1].rtc_ccvr + ALARM)); 

Sein nichts mit den Feldern in der Struktur zu tun, verwenden würde, sein, die Struktur

0

verwenden wir den Code ein wenig untersuchen. Sie wissen wahrscheinlich, dass ein enum nur eine Möglichkeit ist, Zahlen Namen zu geben, so dass jeder Wert in einem enum in eine ganze Zahl übersetzt - RTC_0 ist genau das gleiche wie 0 in diesem Code. So der Aufruf:

rtc_set_alarm(RTC_0, (RTC[RTC_0].rtc_ccvr + ALARM)); 

ist identisch mit

rtc_set_alarm(RTC_0, (RTC[0].rtc_ccvr + ALARM)); 

Was ist nun RTC? Es ist ein Zeiger auf eine Struktur, aber es gibt keine Information darüber, wie viele Registersätze des Typs rtc_reg_t dort sind. Also, wenn Sie drei solche Registersätze haben, wäre es gleichermaßen gültig sein zu tun:

rtc_set_alarm(RTC_0, (RTC[2].rtc_ccvr + ALARM)); 

So ist der Zweck RTC[RTC_0] des Schreibens ist explizit für den Zugriff auf den ersten Register des RTC-Controller und andere für den Zugriff auf die gleiche Art und Weise, wenn da waren welche. In Ihrem Beispiel gibt es nur einen, und es ist möglich, dass rtc_set_alarm prüft, ob Sie nicht auf den Index RTC_NUM oder darüber zugreifen.

+0

danke für deine antwort. Das erste Register ist 'rtc_ccvr'. Also würde ich des Gedankens mit 'RTC.rtc_ccvr' sicherstellen, dass auf das erste Register zugegriffen wird. @ pm100 schlägt vor, dass es für den RTC-Controller und nicht für das Register verwendet wird? –

+0

@logitech mouse Ich habe den Wortlaut meiner Antwort verbessert - ja, die '0' ist für den Zugriff auf den ersten * Satz * von Registern, das heißt, die Register des ersten Controllers. – DUman

+0

vielen dank für ihre hilfe –