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?

  1. ADe waarde van *odr kan niet worden gewijzigd, terwijl odr zelf door interrupts kan veranderen, dus wordt het bij elk gebruik opnieuw gelezen
  2. BDoordat volatile is toegevoegd, wordt de read-modify-write van *odr |= 1u << 5 één bewerking die niet kan worden onderbroken
  3. 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.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over Basis van programmeren in C

  1. Welke beschrijving van ongedefinieerd gedrag in de zin van de C-standaard is juist?
  2. int en unsigned int zijn 32 bits. Welke van de volgende bewerkingen is volgens de C-standaard ongedefinieerd gedrag?
  3. Als de bovenstaande functie met gcc met ingeschakelde optimalisatie wordt gecompileerd, kan de controle if (p == NULL) worden verwijderd. Wat is de reden?
  4. Wat legt de C-standaard vast over de grootte van het type int?
  5. In embedded programma's wordt een variabele die de waarde van een 32-bits randapparaatregister bevat, vaak gedeclareerd met uint32_t uit stdint.h in plaats van unsigned int. Wat is de belangrijkste reden?