Po co wykonywać kod z pamięci RAM?

27

Właśnie natknąłem się na niektóre makra dla mojego kompilatora mikrokontrolerów, aby wymusić (lub zasugerować) wykonanie funkcji z pamięci 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

W jakich przypadkach jest to cenne? Dlaczego nie miałbym zawsze uruchamiać z pamięci RAM, jeśli korzyścią jest tylko zwiększenie prędkości? Czy generalnie powoduje to większy pobór prądu?

tarabajt
źródło
13
Wykonywanie kodu z pamięci RAM pobiera mniej prądu (nie jestem pewien, czy jest to prawda dla wszystkich procesorów / układów SoC). Kiedyś stworzyłem projekt, w którym umieściliśmy większość kodu w pamięci RAM, ponieważ było to urządzenie akumulatorowe i chcieliśmy, aby żył jak najdłużej. Jeśli możesz wykonać kod tylko z pamięci RAM, możesz nawet wyłączyć bloki flash na niektórych układach SoC i zaoszczędzić jeszcze więcej energii.
Al Bundy,
4
@pipe - wyobrażam sobie, że powodem, dla którego powinien być komentarzem, a nie odpowiedzią, jest to, że nie odpowiada na rzeczywiste pytanie, dlatego nie chcesz zawsze używać pamięci RAM do wykonywania kodu.
Jules
1
@Jules Tak, wyobrażam sobie, że ma to być „pomocna anegdota”. Rzeczy, które stos wymiany ma na celu zapobiec, z bardzo dobrych powodów.
rura
1
Ponieważ nie masz wystarczającej liczby rejestrów, aby wykonać z rejestru. (Mam ten chip.)
Joshua
Oprócz wszystkiego: wykonywanie kodu z dynamicznej pamięci RAM może być częścią skomplikowanego włamania programowego w celu przeprowadzenia odświeżania pamięci DRAM. :)
Kaz.

Odpowiedzi:

32

Oprócz szybkości i innych funkcji, o których wspominali już inni, wykonywanie kodu z pamięci RAM może być przydatne w programach ładujących, w których trzeba przeprogramować pamięć flash micro - nie można wykonać kodu z pamięci flash, który jest w trakcie wymazywania i przeprogramowanie.

brhans
źródło
4
zależy od tego, ile masz bloków flash i które z nich można zmodyfikować za pomocą bootloadera, ile pamięci RAM zostałeś, aby wyeksponować dane dla następnego bloku itp., ale prawdziwym rozwiązaniem jest trampolina z flasha, abyś mógł zmodyfikować pamięć flash dobrze do tego ...
old_timer
1
To wydaje się odpowiadać tylko na połowę pytania (część tytułowa). OP zapytał także: „Dlaczego nie zawsze wykonuję z pamięci RAM, jeśli korzyścią jest jedynie zwiększenie prędkości?”, A ta odpowiedź nie wyjaśnia, dlaczego ktoś nie chce wykonywać z pamięci RAM.
Doktor J
2
Jak dotąd tak dobrze, ale co się stanie, jeśli stracisz moc (a tym samym RAM) w trakcie przepisywania flasha? To może być rozwiązany, ale tak jak każdy inny projekt dla bootloadera, to musi być brane pod uwagę.
AaronD
19

Nie spojrzałem na arkusz danych dla tej mikro. Jednak często zdarza się w tej sytuacji, że pobieranie z pamięci RAM jest szybsze niż pobieranie z pamięci flash, z której implementowana jest pamięć programu.

Zaletą lampy błyskowej jest to, że duże ilości mogą być stosunkowo tanie. Dlatego producenci mikrokontrolerów czasami umieszczają dużą ilość pamięci flash na układzie, a następnie zapewniają bardziej ograniczoną przestrzeń RAM, z której kod może wykonywać. Umożliwia to kopiowanie procedur o krytycznym czasie do pamięci RAM, a następnie wykonywanie ich stamtąd.

Przełącznik kompilatora, do którego się odwołujesz, prawdopodobnie działa z konsolidatorem i zaznacza tę sekcję pamięci flash, która ma zostać skopiowana do pamięci RAM za pomocą kodu uruchomieniowego kompilatora, który działa od resetu. Różne implementacje będą się różnić w zależności od szczegółów.

Olin Lathrop
źródło
17

Gdy chcesz wykonać w pamięci RAM, ponieważ jest szybsza, zwykle dzieje się tak, ponieważ pamięć RAM jest na chipie SRAM. Jest to rzadki zasób, którego prawdopodobnie będziesz potrzebować w przypadku danych wymagających dostępu do odczytu / zapisu.

Używanie go do kodu, kiedy już mają kod w ROM / Flash oznacza, że trzeba kwota X flash i dodatkową kwotę X RAM.

Wymaga to również dodatkowego etapu kopiowania podczas rozruchu lub gdy chcesz go uruchomić, chociaż jest to w większości nieistotne.

Tradycyjnie jest to rozwiązywane za pomocą pamięci podręcznej instrukcji, ale w mikrokontrolerze bardziej sensowne może być zachowanie ogólnej wewnętrznej pamięci SRAM, ponieważ nie używasz mikrokontrolera, ponieważ chcesz uzyskać najszybszą szybkość wykonywania.

Istnieje również problem z niezawodnością - kod wykonywany w rzeczywistej pamięci ROM jest trudny do modyfikacji za pomocą błędnego kodu.

rura
źródło
14

Oprócz wszystkich dobrych odpowiedzi:

Dlaczego nie miałbym zawsze uruchamiać z pamięci RAM, jeśli korzyścią jest tylko zwiększenie prędkości?

Ponieważ w systemie osadzonym zazwyczaj nie masz wymaganej ilości pamięci RAM. Na przykład STM32 z 32kB lub RAM i 512kB pamięci EEPROM. Aby móc uruchomić cały program w pamięci RAM, potrzebny byłby rozmiar pamięci RAM większy niż EEPROM.

Marko Buršič
źródło
5
„Ponieważ w systemach wbudowanych, zwykle nie masz wymaganej ilości pamięci RAM.” - i dlatego, jeśli zrobić wystarczająco dużo pamięci RAM, aby to zrobić, można prawie na pewno obniżyć koszty poprzez przełączenie do tańszego MCU mniej pamięci RAM. Ponieważ jeśli zadajesz pytanie, zawsze jest tańsze MCU z mniejszą ilością pamięci RAM (najmniejsze i najtańsze MCU używają architektury Harvarda, więc nie można wykonać z pamięci RAM)
Jules
13

Wydaje się, że inne odpowiedzi nie omawiały zbytnio zużycia energii, o co konkretnie pytałeś.

Odpowiedź jest taka, że ​​zależy to nieco od mikrokontrolera, ale często wykonanie z pamięci RAM może zmniejszyć zużycie energii, ponieważ wymaga mniej energii do odczytu instrukcji z pamięci RAM niż z pamięci flash.

Typowym zastosowaniem byłoby uruchomienie funkcji „uśpienia” o niskiej mocy z pamięci RAM przy wyłączonej pamięci flash. Zużycie energii jest nie tylko zmniejszone, ale jeśli mikrokontroler musi się szybko obudzić (np. W odpowiedzi na zewnętrzne przerwanie), nie ma opóźnienia przy ponownym włączeniu pamięci flash.

Niektóre części, takie jak niektóre z serii Atmel SAM, mają specjalną pamięć RAM o bardzo niskim poborze mocy, którą można wykorzystać do tego celu. Pozwala to na załadowanie niewielkiej ilości kodu do specjalnej pamięci RAM, podczas gdy większość dostępnej pamięci RAM i wszystkich innych pamięci jest wyłączana, a mikrokontroler przechodzi w tryb głębokiego uśpienia.

użytkownik
źródło
7

Oprócz potencjalnych korzyści prędkości wspomnianych przez innych, kod RAM jest również dynamiczny i może być modyfikowany w locie za pomocą kodu dostosowującego we FLASH, zgodnie z wymaganiami.

Może to być tak proste, jak zmiana kilku parametrów lub całe procedury obsługi przesyłane zdalnie.

Trevor_G
źródło
Lub kod w pamięci RAM można załadować z dysku (np. SD) lub sieci
teambob
4

Wykonywanie kodu z pamięci RAM jest znacznie szybsze niż wykonywanie go z pamięci flash. Większość procesorów jest mocno zoptymalizowana pod kątem najszybszego możliwego dostępu do pamięci RAM, a nawet najszybsza pamięć flash osiąga ułamek prędkości pamięci RAM.

Należy jednak pamiętać, że przeniesienie kodu z pamięci flash do pamięci RAM również wymaga czasu. Jeśli kod jest wykonywany tylko raz, wystarczy go przeczytać tylko raz, dlatego rzeczywiście straciłbyś czas na skopiowanie go najpierw do pamięci RAM zamiast bezpośredniego wykonywania. Jeśli kod jest wykonywany od czasu do czasu (więc skopiowanie go do pamięci RAM zwiększyłoby wykonanie przy drugim wywołaniu), ale system jest generalnie bezczynny, wówczas można by wykonać ten kod szybciej, kopiując go do pamięci RAM, ale nikogo to nie obchodzi, ponieważ system ma wystarczająco dużo czasu do spędzenia.

Dlatego takie optymalizacje są warte wysiłku tylko wtedy, gdy kod jest często wykonywany i zmierzyłeś go jako dławik systemu.

Z drugiej strony pamięć RAM musi aktywnie przechowywać dane, podczas gdy pamięć flash nie, więc całkowity pobór mocy wzrasta, jeśli pamięć RAM musi pozostać aktywna. Jest to jednak istotne tylko wtedy, gdy pamięć RAM w ogóle nie jest w ogóle używana, ale większość nowoczesnych systemów - w taki czy inny sposób - już korzysta z dostępnej pamięci RAM, a zatem już ją utrzymuje.

TwoThe
źródło
4

Istnieją dwa bardzo częste powody do wykonywania kodu z pamięci RAM:

  1. Niektóre mikroprocesory nie mogą wykonać flashowania podczas programowania flash - choć wiele może to zrobić, dopóki kod jest w innym bloku niż zapisywany flash. Zapisy Flash mogą przeprogramowywać aplikację (przypadek modułu ładującego) lub gdy Flash jest używany do przechowywania nieulotnych informacji o programie (konfiguracja, kalibracja itp.)

  2. W wielu mikroprocesorach pamięć RAM jest znacznie szybsza niż flash. W przypadku tych urządzeń małe, krytyczne dla prędkości procedury mogą być wykonywane z pamięci RAM, chociaż zwykle pamięć RAM jest znacznie krótsza niż pamięć flash.

Dave Nadler
źródło
2

Kolejny przypadek użycia tylko pamięci RAM zabezpieczającej wykonanie przed przypadkowymi bitflipami. Używamy tego modelu na naszym małym cubesat, ponieważ główna płyta komputera ma RAM ECC, który toleruje bitflipy z powodu promieniowania. Cały system operacyjny jest ładowany do pamięci RAM, ponieważ ramdysk podczas uruchamiania działa całkowicie w środowisku ECC.

Lampa błyskowa nie jest chroniona ECC (standardowe gotowe karty micro SD), ale mamy inne metody sprawdzania, czy nie ma uszkodzeń (wiele zdjęć, sumy kontrolne itp.)

Tejas Kale
źródło
Zakładałbym, że coś takiego jak EEPROM lub flash byłoby znacznie „trudniejsze” do bitflipa przez promieniowanie, czyli wymagałoby więcej energii.
rura
Rzeczywiście tak jest, ale ponieważ po prostu używamy standardowej lampy błyskowej bez specjalnych funkcji ECC, użycie pamięci RAM jest znacznie lepsze do tego celu.
Tejas Kale,