Le registre de configuration d'un périphérique a cette structure :
- Bits 0-1 : mode (0=off, 1=lent, 2=normal, 3=rapide)
- Bit 2 : interruption activée
- Bits 3-7 : réservés
Écris les macros et le code pour :
- Définir les constantes de mode
- Lire le mode actuel
- Changer le mode sans toucher aux autres bits
- Activer/désactiver l'interruption
Solution :
#include <stdio.h>
#include <stdint.h>
/* Stub for playground simulation */
#define MODE_MASK 0x03u
#define IRQ_BIT 2
void changer_mode(uint8_t *reg, uint8_t nouveau_mode)
{
*reg = (*reg & ~MODE_MASK) | (nouveau_mode & MODE_MASK);
}
/* 4. Activer/desactiver l'interruption */
void activer_irq(uint8_t *reg)
{
*reg |= (1u << IRQ_BIT);
}
void desactiver_irq(uint8_t *reg)
{
*reg &= ~(1u << IRQ_BIT);
}
/* Test si l'IRQ est activee */
int irq_active(uint8_t reg)
{
return (reg >> IRQ_BIT) & 1;
}
int main(void)
{
uint8_t reg = 0x00;
changer_mode(®, 2);
printf("Mode = %u (attendu 2)\n", reg & MODE_MASK);
activer_irq(®);
printf("IRQ active = %d (attendu 1)\n", irq_active(reg));
desactiver_irq(®);
printf("IRQ active = %d (attendu 0)\n", irq_active(reg));
return 0;
}
Solution copiée dans l'éditeur.