Wykonuj instrukcje z pamięci RAM w przyjaznym dla hobbystów mikrokontrolerze

12

Jeden z moich projektów bardzo skorzystałby na możliwości uruchomienia programu, który nie jest przechowywany w mikrokontrolerze (ale jest przechowywany na karcie SD).

Poszukuję urządzenia, które pozwoli mi załadować kod z karty SD do pamięci RAM, a następnie wykonać kod z pamięci RAM. Obecnie mam tylko programator dostarczany z PicKit2, więc wolałbym pozostać przy PIC.

Czy ktoś wie, które PIC mogą to zrobić? Jeśli żadne PIC nie są w stanie tego zrobić, to jakie są różne mikrokontrolery, które by do tego pasowały? Najlepiej te, które są dostępne w pakiecie kompatybilnym z płytką ścienną.

Ponkadoodle
źródło
2
huh? ... Co dokładnie musisz wykonać z pamięci RAM? a co rozumiesz przez „statyczny”? tak naprawdę nie próbujesz pisać kodu modyfikującego się, prawda? Czy mówisz o braku dynamicznej alokacji pamięci? aka no malloc?
Mark
2
@ Mark Chcę móc załadować program z urządzenia zewnętrznego, takiego jak karta SD, i go uruchomić. Postaram się lepiej wyjaśnić w moim poście.
Ponkadoodle,
2
gotcha, jedyny znany mi PIC, który na to pozwala, to PIC32. Chyba że zrobisz coś szalonego, np. Skopiuj go z karty SD na pamięć flash, która zje szybko cykle flashowania, jeśli często zmieniasz programy. Większość małych 8 / 16bit uC jest silnie podzielona pomiędzy przestrzeń danych (ram) i program (flash) i nie pozwala licznikowi programów na adresowanie ram (architektura Harvarda, brak ochrony pamięci itp.).
Mark

Odpowiedzi:

5

Istnieje kilka PIC, które pozwalają na dodanie zewnętrznej pamięci programu. Nigdy tego nie robiłem, ale uwagi aplikacji AN869 i AN778 mają więcej informacji na temat implementacji pamięci zewnętrznej.

Daniel Grillo
źródło
11

Inną opcją do rozważenia jest użycie interpretowanego języka dla programów zapisanych na karcie SD. W ten sposób procesor nie wykonuje kodu maszynowego odczytanego z karty, po prostu traktuje go jako dane.

Takie podejście zapewnia elastyczność kosztem prędkości.

Istnieje wiele opcji do wyboru: Badanie tłumaczy wysokiego poziomu / kompilatorów dla mikrokontrolerów

Toby Jaffey
źródło
1
Rzuć własną DSL. Ta opcja przemawia do mnie najbardziej ze wszystkich sugerowanych rozwiązań.
Amos,
6

Jak już powiedziano, PIC (inne niż PIC32) nie mogą tego zrobić. Prawdopodobnie będziesz musiał przejść do większych procesorów w dowolnej rodzinie lub do procesora z zewnętrzną magistralą pamięci, ponieważ większość mikrokontrolerów ma bardzo ograniczone zasoby pamięci RAM.

Procesory MSP430 mogą uruchamiać kod z pamięci RAM, ale potrzebujesz czegoś takiego jak F5438 z 16k pamięci RAM - uruchomienie kodu w 128 bajtach nie jest tak naprawdę opcją!

Jeśli procesor ma zewnętrzną magistralę, możesz umieścić pamięć RAM w przestrzeni kodu. Może być konieczne dodanie dodatkowej logiki w celu odwzorowania pamięci RAM na dwa regiony pamięci, jeśli architektura procesora nie pozwala na zapis danych w pamięci wykonawczej.

Uruchomiłem kod z pamięci RAM w systemie opartym na 8051, ale oznaczało to, że pamięć RAM musiała zostać odwzorowana na obszar pamięci EXTERN w celu programowania, a następnie z powrotem na obszar CODE w celu wykonania. Program ładujący / monitorujący obsługiwał przełączanie i ładowanie banku pamięci. Proszę nie pytać o kod - zrobiłem to około 30 lat temu i już dawno go straciłem (i napisałem w PL / M-51)

uɐɪ
źródło
5

Żaden z PIC niskiego i średniego zakresu nie może wykonać z pamięci RAM z powodu swojej architektury pamięci.

Każdy procesor oparty na ARM powinien być uruchamiany z pamięci RAM. Chociaż zwykle znajdują się w pakietach smd, istnieje sporo modułów wielkości „DIP”, które mają już załadowany mikrokontroler. Spójrz na przykład na mbed lub LPCXpresso . Oba są dostarczane z bootloaderem lub, w przypadku LPCXpresso, interfejsem debugowania wraz z darmowymi kompilatorami.

Jeśli wolisz pozostać przy zwykłych 8-bitowych mikrach, być może rozważ coś z freescale Family HCS08. Można je wykonać z pamięci RAM. Dostępna jest wersja kodera kompilatora IDE i C z ograniczeniami kodowymi.

Jestem całkiem pewien, że MPS430 powinien być w stanie to zrobić, ale sam nigdy tego nie zrobiłem.

Clint Lawrence
źródło
Mbed faktycznie otrzymuje pliki binarne, kopiując je na wbudowany dysk flash, a następnie resetując. Po podłączeniu do portu USB komputera pojawia się jako dysk flash. Jeśli możesz wypracować metodę użycia dysku flash zamiast karty SD, lub skonfiguruj go tak, aby plik binarny z karty SD był automatycznie kopiowany na dysk flash i przeprowadzony reset, być może masz szczęście. Mbed nie wymaga programisty sprzętowego.
Amos,
5

Śmigło ładuje swój program z pamięci zewnętrznej.

współpracownik
źródło
1
Zwykle układ śmigła jest uruchamiany z EEPROM 32K (24LC256), ale tutaj jest sposób na uruchomienie z karty SD: gadgetgangster.com/news/45-designer-news/…
tcrosley 20.10.10
3

Pamiętam, że czytałem o bootloaderze dla AVR-ów, który ponownie flashowałby układ za pomocą pliku .hex (prawdopodobnie) z karty SD. Nie mogę znaleźć oryginalnego źródła, ale ta wyszukiwarka Google pokazuje kilka interesujących trafień. Tak, wiem, że to AVR, a nie PIC, ale może ci się przydać, jeśli PIC się nie uda.

blalor
źródło
+1 dla bootloadera PIC .
davidcary
3

Jak zauważyli inni plakaty, nie można wykonać z pamięci RAM na 8 lub 16-bitowym PIC, ponieważ używają architektury Harvarda (oddzielne przestrzenie na kod i dane). To, czy praktyczne jest ładowanie programu z karty SD i flashowanie go w pamięci kodu, zależy od tego, jak często będziesz to robić.

Jeśli próbujesz stworzyć dynamiczne środowisko, takie jak system operacyjny, który ciągle nakłada programy, to nie. Ale w moim przypadku mam program, który w razie potrzeby ładuje sterowniki z karty SD o pojemności 2 GB. PIC24FJ256GB110 ma minimum 10 000 cykli kasowania / zapisu. Nawet jeśli robiono to pięć razy dziennie, flash trwałby minimum 5 1/2 lat.

(Uwaga: liczba 10 000 to minimum. Typowa wytrzymałość na cykle kasowania / zapisu może być pięciokrotnie większa - więc jeśli robisz programowanie, prawdopodobnie możesz ponownie flashować procesor 140 razy dziennie - co 3 1/2 minuty przez osiem godzin - i może trwać jeszcze rok).

tcrosley
źródło
2

W mojej szkole korzystaliśmy z procesorów HC11 lub HC12 z zewnętrzną pamięcią RAM, aby ładować i uruchamiać programy ... ale zapomniałem nazwy płyt / zestawu :( W każdym razie MCU z linią Freescale HC (S) adresuje identycznie RAM i ROM , dzięki czemu można załadować kod do pamięci RAM i wykonać go.

Biorąc w kolejce blalor, najlepszym rozwiązaniem może być po prostu dodanie na płycie przycisku, który może ponownie załadować PIC z danych przechowywanych na karcie SD włożonej za pomocą bootloadera. Nie mogę sobie wyobrazić, który kod nie pasowałby do większych PIC; jeśli masz jakieś dane statyczne (grafika, tekst, dźwięk), przechowuj je w pamięci zewnętrznej.

Nick T.
źródło
1

Prawdopodobnie nie możesz przydzielić z pamięci RAM, ale dla twojej aplikacji możesz mieć mały moduł ładujący we flashu, który może następnie odczytać dane karty SD do pozostałej części pamięci flash. Zastosowałem to podejście z układem flash kontrolowanym przez SPI, aby umożliwić załadowanie oprogramowania układowego z łącza bezprzewodowego, a następnie zainstalowanie go po jego całkowitym otrzymaniu; Nie mogę wymyślić żadnego konkretnego powodu, dla którego nie działałby z kartą SD, chociaż bootloader kompatybilny z SD może zająć trochę miejsca.

supercat
źródło
Zrobiłem coś podobnego dla urządzenia, które miało kilka nieco odmiennych firmware i celów: Zapisz wszystkie pliki na zewnętrznej pamięci flash SPI (która jest dostępna w rozmiarach znacznie większych niż większość mikrokontrolerów) i przepisz kontroler jednym z obrazów z bootloaderem, jeśli przycisk zostanie przytrzymany podczas resetowania.
Kevin Vermeer
0

Dość kilka mikrokontrolerów pozwoli ci to zrobić, nie brzmi jak zdjęcie. co chcesz zrobić, to mieć bootloader, który używa spi do odczytu z karty SD, skopiuj program, który prawdopodobnie chce być znaną lub zakodowaną nazwą pliku, prawdopodobnie w katalogu głównym, parsuj ten plik do pamięci RAM, a następnie rozgałęź do program w pamięci RAM. Kontrolery oparte na ARM z pewnością pozwolą ci zrobić coś takiego.

Alternatywą byłoby, gdyby bootloader czytał kartę SD przez SPI i zamiast kopiować do pamięci RAM i rozgałęziać nagrywanie do części flasha. Prawdopodobnie chcesz mieć przycisk, jeśli przycisk zostanie naciśnięty przy włączaniu lub resetowaniu, a następnie załaduj nowy program z karty SD, w przeciwnym razie, jeśli podpis lub suma kontrolna wygląda dobrze na tej ładowalnej części flasha, to na gałęzi rozruchowej do tej części flasha. A może, jeśli karta SD jest obecna, załaduj z niej inaczej do rozgałęzionej części flasha. Może używać tej metody z ramieniem i avr, prawdopodobnie nawet z piciem, ale moje doświadczenie z piciem jest przestarzałe. msp430 Też bym założył. Zasadniczo, jeśli możesz przeprogramować fragmenty pamięci flash, którą wykonujesz, z samego procesora mikrokontrolera,

old_timer
źródło
Hmmm, właściwie nie zaprogramowałem avr z avr, przepraszam, że to było ponad serial z hosta. Wywołuje trzecie rozwiązanie, które robi wiele tanich desek do hobby ... używają dwóch mikrokontrolerów. W takim przypadku jeden trzymałby drugiego w resecie, czytał kartę SD, programował inną mikro, przez port szeregowy lub inny, a następnie zwalnia resetowanie na drugiej mikro. Tablice hobby / eval często mają jedną mikro dla interfejsu USB i zwykle jtag do drugiej.
old_timer