Interruptions et ordonnancement
Problème
Considérons le code suivant
void uart_send(char *str) {
while (*str != '\0') {
// Waits to be ready to send next byte
while (UCSR0A & _BV(UDRE0));
// Sends the next byte
UDRE0 = *(str++);
}
}
Ce code fonctionne correctement mais il consomme beaucoup de ressources.
Ordonnancement
Comment réaliser différents tâches simultanéments
Le problème peut être résolu en utilisant un ordonnanceur, c'est-à-dire un système qui permet de définir l'ordre d'exécution des tâches. Cependant il est aussi possible de réaliser des tâches simultanément en utilisant de l'ordonnancement coopératif.
int main() {
setup();
while (1) {
usart_tick();
leds_tick();
}
}
Ici usart_tick() et leds_tick() sont des méthodes coopératives, elles effectueront des calculs et rendront l'exécution en retournant rapidement les données. Voici une façon d'organiser le code précédent en utilisant l'ordonnancement.
static char buffer[128];
static size_t position = 0;
static size_t length = 0;
void uart_send(char *str) {
position = 0;
length = strlen(str);
memcpy(buffer, str, length);
}
void uart_tick() {
if (position < length) {
if (UCSR0A & _BV(UDRE0)) {
UDRE0 = buffer[position];
position += 1;
}
}
}