fond Je travaille sur une application embarquée écrit en C en utilisant IAR Embedded Workbench IDE et toolchain qui fonctionne sur un micro-contrôleur STM32F091 (noyau ARM Cortex-M0). L'application écrit des données dans la mémoire flash intégrée des microcontrôleurs, dans laquelle seuls les mots de 32 bits peuvent être entrés (peut-être même des demi-mots fonctionnent).Coulée de tableau d'octets offsetted à INT32 tableau en C
Description du problème Les données sont stockées dans un tableau de type octet uint8_t précédé par des informations d'en-tête au début (dans ce cas, un AT code de réponse d'un modem embarqué) qui ne devrait pas être écrit en mémoire flash. Je voudrais envoyer un pointeur uint32_t vers où dans le tampon uint8_t les données réelles commencent. Mais si ce décalage n'est pas aligné sur 4 octets, mon application se bloque car elle essaie d'accéder à un type uint32_t non aligné.
Ce décrit ce que je suis en train de faire (pas le code réel, juste un exemple):
uint8_t modemResponseBuffer[MAX_MODEM_RESPONSE_SIZE];
/* Get the modem response data (including modem response header data) */
size_t modemResponseSize = GetModemResponseData(modemResponseBuffer);
/* Get the actual data size from the header information */
size_t dataSize = GetActualDataSizeFromModemResponseHeader(modemResponseBuffer);
/* Get the offset to where the actual data starts in the modem response */
size_t modemDataOffset = GetModemResponseDataOffset(modemResponseBuffer);
/* Write the data part of the response to embedded flash memory.
The modemDataOffset can be any number which messes up 4 byte data alignment */
ProgramFlashMemory(DATA_FLASH_STORAGE_ADDRESS, (uint32_t*)&modemResponseBuffer[modemDataoffset],
dataSize);
A l'intérieur du ProgramFlashMemory fonction, la FLASH_ProgramWord fonction périphérique bibliothèque standard est appelée dans un boucle.
Question (s) Comment résoudre ce problème efficacement? Je travaille sur un système où j'ai une quantité limitée de mémoire (32 Ko de RAM), donc je préférerais ne pas copier le contenu souhaité du buffer uint8_t dans un nouveau buffer de type uint32_t. En ce moment, j'ai aligné manuellement l'octet de données par octet en passant en boucle, mais cela me semble plutôt maladroit. Mais je n'ai pas encore trouvé de meilleure solution et je suis intéressé par les suggestions que je pourrais recevoir ici.
Aussi, si quelqu'un a la connaissance, je me demande aussi pourquoi l'application plante dans ce cas. Quelle est la raison pour laquelle mon noyau (ou n'importe quel noyau?) Ne peut pas gérer les types de données non alignés?
Avez-vous besoin des données d'en-tête? – alk
Eh bien, j'en ai besoin pour identifier le type de données que l'application reçoit et la taille de celle-ci. Je suis désolé si cela n'était pas clair de l'exemple que j'ai fait pour montrer le problème. – Stenis
Avez-vous besoin de l'en-tête après avoir écrit dans la mémoire flash? Alors que – alk