2016-12-06 2 views
0

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?

Répondre

2

Vous ne pouvez pas écrire dans la mémoire flash de la même manière que vous écrivez en RAM, à cause de la conception physique des mémoires flash. Pour être exact, vous devez effacer le secteur/la page (disons ~ 1-4kB, cela est spécifié dans la fiche technique de votre MCU). La raison en est que les flash sont faits qu'ils conservent l'état même s'ils ne sont pas alimentés, chaque fois que vous voulez changer un bit de la valeur 0 -> 1 vous devez effacer tout le secteur (Après effacement tous les bits seront mis à 1) . Comme vous ne pouvez pas utiliser Flash comme mémoire de données, vous pouvez utiliser Flash comme variable de stockage qui est la valeur const (en lecture seule), de sorte que toutes les tables de recherche puissent s'y intégrer variable à const les mettra à l'intérieur de flash). Comment écrire au flash, vous pouvez lire dans le manuel de référence de votre MCU.

+0

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

+0

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

+0

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