Vraag:
Wanneer PROGMEM gebruiken?
Praveen Singh Yadav
2018-05-10 14:29:56 UTC
view on stackexchange narkive permalink

Ik geloof dat PROGMEM wordt gebruikt om grote gegevens op te slaan (bijv. strings) die niet veranderen. Dus het maakt de SRAM vrij.

in de Ardunio Reference wordt vermeld dat.

"Het gebruik van PROGMEM is ook een procedure in twee stappen. Nadat de gegevens in het Flash-geheugen zijn vereist speciale methoden (functies), ook gedefinieerd in de pgmspace.h bibliotheek, om de data uit het programmageheugen terug in SRAM te lezen, zodat we er iets nuttigs mee kunnen doen. "

Als ik de gegevens in SRAM voordat u het gebruikt, hoe is het dan efficiënt dan rechtstreeks in SRAM te komen door normaal te definiëren

... Omdat het niet * blijft * in SRAM ...
Drie antwoorden:
Majenko
2018-05-10 14:42:57 UTC
view on stackexchange narkive permalink

Stel dat u een reeks van 1000 tekens in Flash heeft en u deze naar serieel wilt afdrukken. Ja, u moet het in het RAM laden om die gegevens door te geven waar ze kunnen worden afgedrukt. Maar moet u alles tegelijk in het RAM-geheugen plaatsen? Nee. Je hebt maar één teken tegelijk nodig. Dus in plaats van 1000 tekens te nemen en 1000 bytes RAM toe te wijzen en de hele shebang naar RAM te kopiëren en vervolgens af te drukken, hoeft u slechts 1 byte RAM * toe te wijzen en elk teken om de beurt te kopiëren en af ​​te drukken.

Omdat je maar één teken tegelijk kunt lezen vanuit Flash, heeft het sowieso geen voordeel om de hele boel te lezen.


* Eigenlijk, vanwege compileroptimalisaties, raakt dit waarschijnlijk nooit eens RAM aan en blijft het gewoon in een CPU-register.

Juraj
2018-05-10 15:12:24 UTC
view on stackexchange narkive permalink

Als je een constante c-string (char array) in je code hebt zonder F macro of progmem, dan wordt de string bij het begin naar het RAM gekopieerd en blijft daar.

Als je in een functie gebruikt de F-macro of je maakt een char-buffer van een bepaalde grootte en kopieert de progmem-string naar de buffer, bij terugkeer van de functie worden de variabelen uit de stapel verwijderd en wordt het geheugen vrijgegeven.

In het geval van een grote array, als je het in progmem plaatst en vervolgens in de code wanneer je een waarde in die array moet opzoeken, hoef je slechts één array-item tegelijk naar het RAM te kopiëren, niet het hele reeks.

Julian Goldsmith
2018-05-10 20:48:08 UTC
view on stackexchange narkive permalink

Zoals Majenko zei, je hoeft niet alles wat je in flash-opslag hebt in één keer in het RAM-geheugen te stoppen. U kunt indien nodig items naar SRAM verplaatsen en het geheugen opnieuw gebruiken als u klaar bent.

U bent echter niet beperkt tot het verplaatsen van één byte tegelijk. Er zijn functies gedefinieerd in avr / pgmspace.h die het verplaatsen van gegevens voor je kunnen verwerken.

Je zou bijvoorbeeld iets kunnen doen als:

  const struct mystruct_s my_value PROGMEM = {value = 1234}; // ... struct mystruct_s working_copy; memcpy_P (&working_copy, &my_value, sizeof (struct mystruct_s)); int foo = working_copy.value / 2 ;  


Deze Q&A is automatisch vertaald vanuit de Engelse taal.De originele inhoud is beschikbaar op stackexchange, waarvoor we bedanken voor de cc by-sa 4.0-licentie waaronder het wordt gedistribueerd.
Loading...