Basis van programmeren in C
#define GPIO_BASE 0x40020000u
volatile uint32_t *const odr =
(volatile uint32_t *)(GPIO_BASE + 0x14);
*odr |= 1u << 5;Een uitgangsregister van een microcontroller wordt gedeclareerd en gebruikt zoals hierboven. Welke beschrijving van deze declaratie is juist?
- ADe waarde van *odr kan niet worden gewijzigd, terwijl odr zelf door interrupts kan veranderen, dus wordt het bij elk gebruik opnieuw gelezen
- BDoordat volatile is toegevoegd, wordt de read-modify-write van *odr |= 1u << 5 één bewerking die niet kan worden onderbroken
- CHet adres waarnaar odr wijst, kan niet worden veranderd, en lees- en schrijfacties via odr worden niet weggelaten, maar precies zo vaak uitgevoerd als ze zijn geschreven
Antwoord en toelichting tonen
Antwoord: C. Het adres waarnaar odr wijst, kan niet worden veranderd, en lees- en schrijfacties via odr worden niet weggelaten, maar precies zo vaak uitgevoerd als ze zijn geschreven
const staat rechts van *, dus de pointer odr zelf kan niet worden veranderd en wijst altijd naar hetzelfde registeradres. Het uint32_t waarnaar hij wijst, is volatile, dus de compiler laat lees- en schrijfacties van *odr niet weg en voegt ze niet samen, en voert precies zoveel toegangen uit als er zijn geschreven. volatile maakt bewerkingen echter niet atomair, dus tussen het lezen en het schrijven van *odr |= … kan een interrupt optreden. Als hetzelfde register ook door een interrupt handler wordt bewerkt, schakel dan gedurende die bewerking de interrupts uit, of gebruik een speciaal register om bits te zetten.