J'utilise un STM32F411RE. Depuis que je n'ai plus de mémoire dans ma RAM. J'ai décidé de stocker une grande variable dans mon flash. Pour cela, j'ai créé une section dans section.ld
.STM32, variable stockée en flash n'a pas pu être mise à jour dans un autre fichier
.large_buffer: ALIGN(4)
{
. = ALIGN(4) ;
*(.large_buffer.large_buffer.*)
. = ALIGN(4) ;
} >FLASH
Dans le fichier main.c
, je déclare la variable comme suit:
uint8_t buffer[60 * 200] __attribute__ ((section(".large_buffer"), used));
A ce tout point est OK, le tampon ne sont pas stockées dans la mémoire vive (NFI), je peux accéder et réécrire.
buffer[25] = 42;
printf("%d\n", buffer[25]); // 42
Le problème survient lorsque je veux éditer la variable à partir d'un autre fichier.
main.c
uint8_t buffer[60 * 200] __attribute__ ((section(".large_buffer"), used));
int main()
{
myFunc(buffer);
}
other.c
myFunc(uint8_t* buffer)
{
buffer[25] = 42;
printf("%d\n", buffer[25]); // 0
}
buffer
ne changera jamais dans un autre fichier (passé en paramètre).
Ai-je raté quelque chose?
Merci d'avoir répondu. Est-ce que le tampon de stockage (qui doit souvent être R/W) dans Flash est une bonne solution? – Epitouille
Je ne recommanderais pas cela comme solution viable, la première chose est que vous devez enregistrer de la RAM pour pouvoir lire d'abord puis écrire flash. Write/Erase est beaucoup plus lent que la lecture, et comparé à la RAM d'écriture/effacement flash est plus long. De plus, il y a une limite sur le nombre de cycles d'effacement que vous pouvez faire, généralement quelque chose autour de 100k cycles. – koper89
Oui, je comprends le problème. À ce stade, je suis coincé parce que je ne peux pas sauver le RAM. Qu'est-ce qui pourrait être une solution? Quelles sont les optimisations pertinentes? – Epitouille