Fråga:
Varför köra kod från RAM?
tarabyte
2017-09-06 21:52:27 UTC
view on stackexchange narkive permalink

Jag har precis stött på några makron för att min mikrocontroller-kompilator ska tvinga (eller föreslå) att en funktion körs från RAM.

https://siliconlabs.github.io/Gecko_SDK_Doc/efr32mg1/html/group__RAMFUNC.html#gac6abbc7f869eec9fb47e57427587c556

http://processors.wiki.ti.com/index.php/Placing_functions_in_RAM

https://www.iar.com/support/tech-notes/linker/controlling-placement-of-the-section-where-__ramfunc-functions-reside-ewarm-5.x--6.x /

https://community.nxp.com/thread/389099

I vilka fall är detta värdefullt?Varför skulle jag inte alltid köra från RAM om fördelen bara är ökad hastighet?Orsakar detta generellt högre strömförbrukning?

Att köra kod från RAM drar mindre ström (jag är inte säker på om det är sant för alla CPU / SoC).Jag har en gång gjort ett projekt där vi lägger mest av koden till RAM eftersom det var batterianordning och vi ville att den skulle leva så länge som möjligt.Om du bara kan köra från RAM kan du till och med stänga av blixtblock på vissa SoC och spara ännu mer ström.
@pipe - Jag föreställer mig att anledningen till att det görs en kommentar snarare än ett svar är att det inte svarar på själva frågan, varför du inte vill * alltid * använda RAM för att köra din kod.
@Jules Ja, jag antar att det är menat som en "hjälpsam anekdot".De saker som Stack Exchange är utformade för att förhindra, av mycket goda skäl.
Eftersom du inte har tillräckligt med register för att köra från registret.(Jag har det chipet.)
Förutom allt: exekvering av kod från * dynamiskt * RAM specifikt kan vara en del av ett detaljerat programvaruhack för att utföra DRAM-uppdatering.:)
Ett konkret exempel på var hastighet (encykelåtkomst) är viktig är fördröjningsslingor.Flash-väntelägen kan påverka fördröjningstiden beroende på hur koden justeras i minnet.Det kan vara knepigt att räkna ut, så det är mycket lättare att bara säga "spring from RAM".
För mikrokontroller med Harvard-arkitektur är det vanligtvis * mycket * långsammare att köra kod från RAM.Flash / ROM-minnet har en dedikerad separat adress och databuss där och kan köras parallellt med dataåtkomst.Där en von Neumann-arkitektur kommer att ha en enda buss som data- och programåtkomst måste dela.Moderna von Neumann-processorer försöker efterlikna Harvard-arkitekturen till viss del genom att använda cacheminnet.
Nio svar:
brhans
2017-09-06 22:21:36 UTC
view on stackexchange narkive permalink

Förutom hastigheten & andra funktioner som andra redan har nämnt, kan köra kod från RAM vara användbart i bootloaders där du behöver omprogrammera din mikros blixt - du kan inte köra kod från flash som du är i mittenatt radera omprogrammering av &.

beror på hur många blixtblock du har och vilka som din bootloader tillåter att du ändrar, hur mycket ram du har kvar för att iscensätta data för nästa block osv. men det är sant att studsa bort blixten så att du kan ändrabra för det ...
Detta verkar bara svara på hälften av frågan (titeldelen).OP frågade också "Varför skulle jag inte alltid köra från RAM om fördelen bara är ökad hastighet?", Och detta svar förklarar inte varför man kanske * inte * vill köra från RAM.
Så långt så bra, men vad händer om du tappar ström (och därmed RAM) mitt i omskrivningsblixten?Denna * kan * lösas, men precis som alla andra design för en bootloader måste den övervägas.
Olin Lathrop
2017-09-06 21:58:24 UTC
view on stackexchange narkive permalink

Jag tittade inte på databladet för det mikroet.Det är emellertid ofta fallet i denna situation att hämtning från RAM är snabbare än att hämta från blixten som programminnet implementeras från.

Fördelen med blixt är att stora mängder kan vara relativt billiga.Microcontroller-tillverkare lägger därför ibland mycket flash på ett chip och ger sedan ett mer begränsat RAM-utrymme som koden kan köras från.Detta gör det möjligt att kopiera tidskritiska rutiner till RAM och sedan köra dem därifrån.

Kompilatoromkopplaren som du refererar till fungerar antagligen med länkaren och flaggar den delen av blixt som ska kopieras till RAM av kompilatorn körtidskod som körs från återställning.Olika implementeringar varierar beroende på detaljerna.

pipe
2017-09-06 21:56:38 UTC
view on stackexchange narkive permalink

När du vill köra i RAM eftersom det är snabbare beror det vanligtvis på att RAM är SRAM på chipet.Detta är en knapp resurs som du förmodligen vill ha för data som kräver läs- / skrivåtkomst.

Att använda den för kod när du redan har koden i ROM / flash innebär att du behöver X-mängd flash och ytterligare X-minne RAM.

Det kräver också en extra kopieringsfas vid start eller när du vill köra den, även om den mestadels är obetydlig.

Traditionellt löses detta med en instruktionscache, men i en mikrokontroller kan det vara meningsfullt att behålla den interna SRAM-generiken, eftersom du inte använder en mikrokontroller eftersom du vill ha den snabbaste körhastigheten.

Det finns också ett tillförlitlighetsproblem - kodkörning i faktisk ROM är svår att ändra med buggykod.

Marko Buršič
2017-09-06 22:54:31 UTC
view on stackexchange narkive permalink

Förutom alla bra svar:

Varför skulle jag inte alltid köra från RAM om bara fördelen är ökad hastighet?

Eftersom du i ett inbäddat system vanligtvis inte har den nödvändiga mängden RAM.Till exempel en STM32 med 32 kB eller RAM och 512 kB EEPROM.För att kunna köra hela programmet i RAM behöver du en RAM-storlek som är större än EEPROM.

"För att du i ett inbäddat system vanligtvis inte har den nödvändiga mängden RAM." - och för att om du * har * tillräckligt med RAM för att göra detta kan du nästan säkert minska kostnaderna genom att byta till en billigare MCU med mindreBAGGE.För om du ställer frågan finns det alltid en billigare MCU med mindre RAM (de minsta och billigaste MCU: erna använder Harvard-arkitektur så att de inte kan köra från RAM)
user
2017-09-07 15:17:05 UTC
view on stackexchange narkive permalink

Andra svar verkar inte ha diskuterat mycket energiförbrukning, vilket du specifikt frågade om.

Svaret är att det beror något på mikrokontrollern, men ofta kan körning från RAM minska energiförbrukningen eftersom det kräver mindre energi för att läsa instruktioner från RAM än från flashminne.

En typisk användning skulle vara att köra en "strömsparläge" med låg effekt från RAM, med flashminnet avstängt.Strömförbrukningen minskar inte bara, men om mikrokontrollern behöver vakna snabbt (t.ex. som svar på ett externt avbrott) är det ingen fördröjning medan flashminnet startas igen.

Vissa delar, till exempel några av Atmel SAM-serien, har speciellt extra RAM-minne med låg effekt som kan användas för detta ändamål.Detta gör att en liten mängd kod kan laddas till det speciella RAM-minnet, medan huvuddelen av tillgängligt RAM-minne och alla andra minnen stängs av och mikrokontrollern går in i ett djupt viloläge.

Trevor_G
2017-09-06 22:09:03 UTC
view on stackexchange narkive permalink

Förutom de potentiella hastighetsfördelarna som nämns av andra, är RAM-kod också dynamisk och kan modifieras direkt med någon skräddarsydd kod i FLASH efter behov.

Detta kan vara så enkelt som att ändra några parametrar eller kan vara hela hanteringsrutiner som laddas upp på distans.

Eller så kan koden i RAM laddas från disk (t.ex. SD) eller nätverk
TwoThe
2017-09-07 15:50:20 UTC
view on stackexchange narkive permalink

Att köra kod från RAM går betydligt snabbare än att köra den från flashminnet. De flesta processorer är kraftigt optimerade för snabbast möjliga RAM-åtkomst, och till och med det snabbaste flashminnet når bara en bråkdel av RAM-hastigheten.

Tänk dock på att det tar tid att flytta koden från flash till RAM. Om koden exekveras bara en gång behöver du bara läsa den en gång, och därför skulle du faktiskt tappa tid för att kopiera den till RAM först istället för att köra den direkt. Om kod exekveras ibland (så att kopiera den till RAM skulle öka körningen andra gången den kallas), men systemet är i allmänhet inaktivt, då skulle du köra den koden snabbare genom att kopiera den till RAM, men ingen bryr sig eftersom systemet har tillräckligt med tid att spendera.

Så sådana optimeringar är bara värda ansträngningen, om koden körs ofta, och du har mätt att den är en kvävningspunkt i systemet.

Å andra sidan måste RAM aktivt lagra data medan flashminnet inte gör det, så den totala strömförbrukningen ökar om RAM behöver hållas aktivt. Detta är dock bara relevant om RAM-minnet annars inte används alls, men de flesta moderna system kommer - på ett eller annat sätt - att använda det tillgängliga RAM-minnet redan och därför redan hålla det aktivt.

Dave Nadler
2017-09-08 00:56:05 UTC
view on stackexchange narkive permalink

Det finns två mycket vanliga skäl att köra kod från RAM:

  1. Vissa mikroprocessorer kan inte köras från blixt under blixtprogrammering - även om många kan göra det så länge som koden är i ett annat block än den blixt som skrivs.Flash-skrivningar kan omprogrammera applikationen (boot-loader case) eller när flash används för att lagra icke-flyktig programinformation (konfiguration, kalibrering etc.)

  2. På många mikroprocessorer är RAM mycket snabbare än blixt.För dessa enheter kan små hastighetskritiska rutiner köras från RAM, men RAM har vanligtvis mycket kortare än flash.

Tejas Kale
2017-09-08 18:25:49 UTC
view on stackexchange narkive permalink

En annan användningsfas för RAM-exekveringssäkerhet mot slumpmässiga bitflips.Vi använder den här modellen på vår lilla kubesats eftersom huvudkortet har en ECC-ram som tål bitlips på grund av strålning.Hela operativsystemet laddas in i ram eftersom en ramdisk vid start körs helt i en ECC-miljö.

Blixten är inte ECC-skyddad (standard från micro SD-kort) men vi har andra metoder för att kontrollera korruption (flera bilder, kontrollsummor etc.)

Jag skulle ha antagit att något som EEPROM eller blixt skulle vara mycket "svårare" att bitflipas av strålning, det vill säga kräva mer energi.
Det är verkligen så, men eftersom vi bara använder standardblixten utan några speciella ECC-funktioner är det mycket bättre att använda ram för detta ändamål.


Denna fråga och svar översattes automatiskt från det engelska språket.Det ursprungliga innehållet finns tillgängligt på stackexchange, vilket vi tackar för cc by-sa 3.0-licensen som det distribueras under.
Loading...