Mémoire de partition – introduction et services de base
Voir la série RTOS Revealed
Les partitions de mémoire ont été introduites dans un article précédent, où une comparaison avec le C standard malloc() fonction a été faite. Une partition est une zone mémoire obtenue à partir d'un pool de partitions. Cela offre un moyen flexible pour les tâches d'obtenir et de libérer le stockage de données de manière déterministe et fiable.
Utilisation des partitions
Dans Nucleus SE, les pools de partitions sont configurés au moment de la génération. Il peut y avoir un maximum de 16 pools de partitions configurés pour une application. Si aucun pool de partition n'est configuré, aucune structure de données ou code d'appel de service appartenant aux pools de partition n'est inclus dans l'application.
Un pool de partitions est simplement une zone de mémoire, qui est divisée en un nombre spécifique de partitions de taille fixe. L'utilisateur a un contrôle total sur la taille et le nombre de partitions dans chaque pool. Les tâches peuvent demander à se voir allouer des partitions de mémoire et recevoir un pointeur vers la zone de stockage. Il est de la responsabilité de la tâche de ne pas écrire de données en dehors de la partition. La partition peut être désallouée par n'importe quelle tâche en passant le pointeur vers une fonction API. La demande d'allocation d'une partition, lorsqu'il n'y en a plus, peut entraîner une erreur ou une suspension de tâche, selon les options sélectionnées dans l'appel d'API et la configuration Nucleus SE.
Configuration des partitions de mémoire
Nombre de pools de partitions
Comme pour la plupart des aspects de Nucleus SE, la configuration des pools de partitions est principalement contrôlée par #define déclarations dans nuse_config.h . Le paramètre de clé est NUSE_PARTITION_POOL_NUMBER , qui détermine le nombre de pools de partitions configurés pour l'application. Le paramètre par défaut est 0 (c'est-à-dire qu'aucun pool de partition n'est utilisé) et vous pouvez le définir sur n'importe quelle valeur jusqu'à 16. Une valeur erronée entraînera une erreur de compilation, qui est générée par un test dans nuse_config_check.h (ceci est inclus dans nuse_config.c et donc compilé avec ce module) résultant en une #error déclaration en cours de compilation.
Le choix d'une valeur différente de zéro correspond à « l'activation principale » pour les pools de partitions. Il en résulte que certaines structures de données sont définies et dimensionnées en conséquence. Les structures de données dans la ROM nécessitent une initialisation à des valeurs appropriées qui caractérisent chaque pool de partitions. Plus d'informations sur les structures de données dans le prochain article. Il active également les paramètres d'activation de l'API.
Activation de l'API
Chaque fonction API (appel de service) dans Nucleus SE a un #define d'activation symbole dans nuse_config.h . Pour les pools de partitions, il s'agit de :
NUSE_PARTITION_ALLOCATE
NUSE_PARTITION_DEALLOCATE
NUSE_PARTITION_POOL_INFORMATION
NUSE_PARTITION_POOL_COUNT
Par défaut, tous ces éléments sont définis sur FALSE , désactivant ainsi chaque appel de service et empêchant l'inclusion de tout code d'implémentation. Pour configurer des pools de partitions pour une application, vous devez sélectionner les appels d'API que vous souhaitez utiliser et définir leurs symboles d'activation sur TRUE .
Voici un extrait du nuse_config.h par défaut fichier :
Une erreur de temps de compilation se produira si une fonction API de pool de partition est activée et qu'aucun pool de partition n'est configuré (sauf pour NUSE_Partition_Pool_Count() ce qui est toujours autorisé). Si votre code utilise un appel API, qui n'a pas été activé, une erreur de temps de liaison se produira, car aucun code d'implémentation n'aura été inclus dans l'application.
Appels de service de pool de partitions
Nucleus RTOS prend en charge sept appels de service, qui appartiennent aux pools de partitions qui fournissent les fonctionnalités suivantes :
Allouer une partition :NU_Allocate_Partition() . Implémenté par NUSE_Partition_Allocate() dans Nucleus SE.
Désallouer une partition :NU_Deallocate_Partition() . Implémenté par NUSE_Partition_Deallocate() dans Nucleus SE.
Fournir des informations sur un pool de partitions spécifié :NU_Partition_Pool_Information() . Implémenté par NUSE_Partition_Pool_Information() dans Nucleus SE.
Renvoyer le nombre de pools de partitions (actuellement) configurés pour l'application :NU_Established_Partition_Pools() . Implémenté par NUSE_Partition_Pool_Count() dans Nucleus SE.
Ajouter un nouveau pool de partitions à l'application (créer) :NU_Create_Partition_Pool() . Non implémenté dans Nucleus SE.
Supprimer un pool de partitions de l'application (supprimer) :NU_Delete_Partition_Pool() . Non implémenté dans Nucleus SE.
Renvoyer des pointeurs vers tous les pools de partitions (actuellement) dans l'application :NU_Partition_Pool_Pointers() . Non implémenté dans Nucleus SE.
La mise en œuvre de chacun de ces appels de service est examinée en détail.
On peut noter qu'aucune fonction de réinitialisation n'est fournie (que ce soit dans Nucleus RTOS ou Nucleus SE). C'est intentionnel. Il est très courant qu'une tâche alloue une partition et passe un pointeur vers une autre tâche (qui la désallouera probablement plus tard). Si un pool de partitions devait être réinitialisé, toutes les partitions seraient marquées comme inutilisées, mais il n'y a aucun moyen de suivre et de notifier toutes les tâches qui peuvent utiliser les partitions.
Services d'allocation et de désallocation de partition
Les opérations fondamentales, qui peuvent être effectuées sur un pool de partitions, consistent à allouer une partition (c'est-à-dire à marquer une partition comme utilisée et à renvoyer son adresse) à partir de celle-ci et à désallouer une partition (c'est-à-dire à marquer une partition comme inutilisée). Nucleus RTOS et Nucleus SE fournissent chacun deux appels d'API de base pour ces opérations, qui seront abordés ici.
Allocation d'une partition
L'appel de l'API Nucleus RTOS pour l'allocation d'une partition est très flexible, vous permettant de suspendre indéfiniment, ou avec un délai d'attente, si l'opération ne peut pas être terminée immédiatement ; c'est-à-dire que vous essayez d'allouer une partition à partir d'un pool dans lequel toutes les partitions sont actuellement allouées. Nucleus SE fournit le même service, sauf que la suspension des tâches est facultative et que le délai d'expiration n'est pas implémenté.
Appel d'API Nucleus RTOS pour l'allocation de partition
Prototype d'appel de service :
STATUT NU_Allocate_Partition(NU_PARTITION_POOL *pool,
VOID **return_pointer, UNSIGNED suspend );
Retours :
NU_SUCCESS – l'appel s'est terminé avec succès
NU_NO_PARTITION – aucune partition n'est disponible
NU_INVALID_POOL – le pointeur du pool de partitions n'est pas valide
NU_INVALID_POINTER – le pointeur de retour de données est NULL
NU_INVALID_SUSPEND – la suspension a été tentée à partir d'un thread sans tâche
NU_TIMEOUT – aucune partition n'est disponible même après une suspension pendant la période de temporisation spécifiée
NU_POOL_DELETED – le pool de partitions a été supprimé alors que la tâche était suspendue
Appel API Nucleus SE pour l'allocation
Cet appel d'API prend en charge la fonctionnalité clé de l'API Nucleus RTOS.
Prototype d'appel de service :
STATUS NUSE_Partition_Allocate(NUSE_PARTITION_POOL pool, ADDR *return_pointer, U8 suspend);
Paramètres :
pool – l'index (ID) du pool de partitions à utiliser
return_pointer – un pointeur vers une variable de type ADDR qui recevra l'adresse de la partition allouée
suspendre – spécification pour la suspension de la tâche; peut être NUSE_NO_SUSPEND ou NUSE_SUSPEND
Retours :
NUSE_SUCCESS – l'appel s'est terminé avec succès
NUSE_NO_PARTITION – aucune partition n'est disponible
NUSE_INVALID_POOL – l'index du pool de partitions n'est pas valide
NUSE_INVALID_POINTER – le pointeur de retour de données est NULL
NUSE_INVALID_SUSPEND – la suspension a été tentée à partir d'un thread sans tâche ou lorsque le blocage des appels d'API n'était pas activé
Embarqué
- Une introduction à l'acier inoxydable et à sa fabrication
- Termes et concepts de la mémoire numérique
- Entrée et sortie de base C#
- Gestion de la mémoire C++ :création et suppression
- Boîtes aux lettres :présentation et services de base
- Sémaphores :services utilitaires et structures de données
- Sémaphores :introduction et services de base
- Files d'attente :introduction et services de base
- Rutronik et AP Memory signent un accord de distribution mondial