Mémoire partitionnée dans Nucleus SE : Configuration, APIs et bonnes pratiques
Voir la série RTOS Revealed
Les partitions mémoire ont été introduites dans notre article précédent, où nous les comparions à la fonction C conventionnelle malloc(). Une partition est un bloc mémoire de taille fixe provenant d'un pool de partitions, offrant une allocation et désallocation déterministes sur lesquelles les tâches peuvent compter.
Utilisation des partitions
Dans Nucleus SE, les pools de partitions sont définis à la compilation. Jusqu'à 16 pools peuvent être configurés par application. Si aucun pool n'est défini, toutes les structures de données et le code API associés sont omis du build, gardant l'empreinte minimale.
Un pool est simplement une zone mémoire contiguë divisée en un nombre défini de partitions identiques. L'application contrôle la taille et le nombre de chaque pool. Les tâches demandent une partition et reçoivent un pointeur vers le bloc. Il est de la responsabilité de l'appelant de rester dans les limites allouées. Une partition peut être retournée au pool par n'importe quelle tâche via l'API de désallocation. Si le pool est épuisé, l'appel peut retourner une erreur ou suspendre la tâche, selon les paramètres de l'API et les options de build.
Configuration des partitions mémoire
Nombre de pools de partitions
Les pools de partitions sont activés par des instructions #define dans nuse_config.h. Le symbole clé est NUSE_PARTITION_POOL_NUMBER, qui définit le nombre de pools. La valeur par défaut est 0, signifiant aucun pool actif. Les valeurs valides vont de 1 à 16 ; une valeur invalide déclenche une erreur #error à la compilation générée par nuse_config_check.h.
Définir une valeur non-nulle active les structures de données nécessaires et les initialise en ROM. Cela débloque aussi les symboles d'activation d'API décrits ci-dessous.
Activations des API
Chaque appel de service a une macro d'activation dans nuse_config.h. Pour les partitions, les symboles suivants existent :
NUSE_PARTITION_ALLOCATENUSE_PARTITION_DEALLOCATENUSE_PARTITION_POOL_INFORMATIONNUSE_PARTITION_POOL_COUNT
Par défaut, toutes sont définies sur FALSE, retirant l'implémentation du build. Pour utiliser une fonctionnalité, définissez la macro correspondante sur TRUE. Activer une API sans pools définis (sauf NUSE_Partition_Pool_Count()) résulte en une erreur à la compilation. Utiliser une API non activée cause une erreur à l'édition de liens.

Appels de service des pools de partitions
Nucleus RTOS offre sept appels de service pour les pools de partitions. Dans Nucleus SE, seulement les APIs d'allocation et désallocation de base sont implémentées. Le tableau ci-dessous liste chaque appel, son statut d'implémentation, et une brève description :
| API | Implémentation | Description |
|---|---|---|
NU_Allocate_Partition() | Implémenté | Allouer une partition. |
NU_Deallocate_Partition() | Implémenté | Libérer une partition. |
NU_Partition_Pool_Information() | Implémenté | Récupérer métadonnées du pool. |
NU_Established_Partition_Pools() | Implémenté | Compter pools actifs. |
NU_Create_Partition_Pool() | Non implémenté | Création dynamique de pool. |
NU_Delete_Partition_Pool() | Non implémenté | Suppression dynamique de pool. |
NU_Partition_Pool_Pointers() | Non implémenté | Retourner pointeurs de pools. |
Notez que ni Nucleus RTOS ni SE ne fournissent de routine de réinitialisation pour les pools de partitions. Ce choix de conception reflète les cas d'usage typiques où une tâche alloue une partition et passe son pointeur à une autre tâche qui la désallouera éventuellement. Réinitialiser un pool marquerait silencieusement toutes les partitions comme libres, brisant le contrat au niveau tâche.
Services d'allocation et désallocation
Les opérations de base sont :
- Allouer : marquer une partition comme utilisée et retourner son adresse.
- Désallouer : marquer une partition comme libre.
API Nucleus RTOS Allocation
Prototype :
STATUS NU_Allocate_Partition(NU_PARTITION_POOL *pool, VOID **return_pointer, UNSIGNED suspend);
Valeurs de retour incluent NU_SUCCESS, NU_NO_PARTITION, NU_INVALID_POOL, NU_INVALID_POINTER, NU_INVALID_SUSPEND, NU_TIMEOUT, et NU_POOL_DELETED.
API Nucleus SE Allocation
Prototype :
STATUS NUSE_Partition_Allocate(NUSE_PARTITION_POOL pool, ADDR *return_pointer, U8 suspend);
Paramètres :
pool — index du pool à utiliser.return_pointer — adresse du bloc alloué.suspend —NUSE_NO_SUSPENDouNUSE_SUSPEND.
Les codes de retour mirent ceux du RTOS mais sont préfixés avec NUSE_. Les demandes de suspension invalides depuis des threads non-tâche ou quand les APIs de blocage sont désactivées produisent NUSE_INVALID_SUSPEND.
Pour une présentation complète de l'implémentation, voir les articles suivants de la série RTOS Revealed.
Embarqué
- Acier inoxydable expliqué : composition, production et impact mondial
- Fondamentaux de la mémoire numérique : adressage, accès et volatilité
- Fondamentaux C# : Entrées et sorties essentielles
- Maîtriser la gestion de mémoire en C++ : Utilisation experte de new et delete
- Boîtes aux lettres dans Nucleus SE : Guide pratique de configuration et d'utilisation
- Sémaphores dans Nucleus RTOS : Services utilitaires et structures de données
- Sémaphores dans Nucleus SE : Vue d'ensemble, configuration et API essentielles
- Files d'attente dans Nucleus SE : Introduction et appels de service de base
- Rutronik devient distributeur exclusif européen de la RAM IoT d'AP Memory sous accord global