Bonjour ! Il semble que vous ayez deux codes C différents, l’un s’exécutant sur Linux et l’autre sur un Arm Cortex M en mode bare metal. Ces codes communiquent entre eux et partagent des structures définies dans des headers, mais ces structures peuvent être complexes avec du padding. Vous souhaitez savoir s’il existe un moyen automatique de « packer » et « dépacker » ces structures au moment de l’exécution sans modifier les headers existants.
Il est possible d’accomplir cela en utilisant une technique appelée sérialisation/désérialisation. La sérialisation consiste à convertir des données structurées en une séquence d’octets, tandis que la désérialisation effectue l’opération inverse, c’est-à-dire reconstituer les données structurées à partir de la séquence d’octets. Cela peut être utilisé pour communiquer entre des environnements différents, comme dans votre cas.
Voici comment vous pourriez le faire :
– Définition des structures : Conservez les définitions de structures existantes dans les headers. Vous n’avez pas besoin de les modifier.
– Écriture de fonctions de sérialisation/désérialisation : Créez des fonctions spécifiques qui prennent une instance d’une structure et la convertissent en une séquence d’octets (sérialisation) ou prennent une séquence d’octets et la reconstituent en une instance de structure (désérialisation). Ces fonctions doivent tenir compte des problèmes de padding et d’alignement entre les différentes architectures.
– Communication : Lorsque vous communiquez entre les deux codes (Linux et Cortex M), appelez les fonctions de sérialisation pour convertir les données en octets avant de les envoyer, puis utilisez les fonctions de désérialisation pour reconstituer les données du côté récepteur.
Il est important de noter que cette approche nécessite une certaine cohérence entre les deux côtés en termes de représentation des données, même si les codes et les architectures sont différents. Cela pourrait nécessiter une gestion précise des types de données, de l’endianness (ordre des octets) et des problèmes d’alignement.
N’oubliez pas que cette méthode ajoute un certain surcoût en termes de temps de traitement et de consommation de ressources. Dans les systèmes embarqués, où les ressources peuvent être limitées, il convient d’en tenir compte.
Si la communication entre les deux environnements est critique ou nécessite une haute performance, vous pourriez également envisager des bibliothèques spécialisées telles que Protocol Buffers (protobuf) de Google, MessagePack, ou même des protocoles plus bas niveau comme le binaire pur.
——————–
djezuskryst – Envoyé depuis le Discord : Culte du code