Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Industrial Internet of Things >> Embarqué

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 :

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é

  1. Une introduction à l'acier inoxydable et à sa fabrication
  2. Termes et concepts de la mémoire numérique
  3. Entrée et sortie de base C#
  4. Gestion de la mémoire C++ :création et suppression
  5. Boîtes aux lettres :présentation et services de base
  6. Sémaphores :services utilitaires et structures de données
  7. Sémaphores :introduction et services de base
  8. Files d'attente :introduction et services de base
  9. Rutronik et AP Memory signent un accord de distribution mondial