Interruptions
Dans le cours “Architecture des Ordinateurs”, nous avons vu comment fonctionnent les interruptions sur un Cortex-M. Nous avons vu que nous pouvions réagir à un évènement généré par différentes sources (timer, UART, GPIO, etc…) avec une routine de traitement d’interruptions ou “Interrupt Service Routine (ISR)”.
Utilisation avec STM32Cube
Avec STM32Cube, la routine de traitement d’interruption (ISR - Interrupt Service Routine) est définie par un callback.
Le callback est une fonction C avec une interface bien précise. On a deux moyens de définir un callback :
- On peut imposer un nom pour la fonction qui implémente le callback.
- On peut enregistrer le callback en utilisant une méthode donnée par la bibliothèque.
La deuxième option est plus flexible, mais avec STM32Cube, vous devez activer
cette fonctionnalité dans le fichier stm32f4xx_hal_conf.h
Par exemple, pour permettre d’enregistrer un callback lié au timers, nous
avons écrit cette ligne dans le fichier stm32f4xx_hal_conf.h
:
#define USE_HAL_TIM_REGISTER_CALLBACKS 1U /* TIM register callback enabled */
Remarque importante sur le thread safety et le interrupt safe
Lorsque nous mettons en œuvre un système multi-threads, nous devons porter une attention toute particulière aux routines de traitement d’interruption.
À ce stade, il est important de comprendre que les systèmes
d’exploitation pour systèmes embarqués offrent des primitives de
synchronisation qui permettent aux développeurs de programmer de telles
applications en tenant compte des problèmes de concurrence. En utilisant
de telles primitives, les développeurs doivent comprendre le niveau de
thread safety qui est réalisé par chaque primitive. Ceci est
particulièrement important pour le code exécuté dans un contexte ISR
(donc dans une routine servant une interruption). Ce code doit être
conçu avec soin afin d’éviter les problèmes de concurrence et de thread
safety du système. Par exemple, il n’est pas possible d’utiliser un
sémaphore dans une routine ISR (comme documenté dans
xSemaphoreTake car
xSemaphoreTake
n’est pas interrupt safe.