uC z językiem skryptowym

Witam!

Jest sobie uC. W uC siedzi program, który jest niezmienny. Niestety zewnątrzne zastosowanie uC jest nieco różne: konkretnie ma on się zajmowac podejmowaniem decyzji i decyzje te mogą się zmieniać w zalezności od konkretnego egzemplarza.

Chciałbym zrobić wobec tego coś takiego: ponieważ prędkość nie jest krytyczna chcę zaszyć w pamięci Flash uC zestaw procedur, a w zewnątrznym eepromie i2c coś w rodzaju skryptu, który z nich korzysta. uC emulowałby taki wirtualny assembler wykonując krok po kroku zewnątrzny program.

#1: Czy istnieje jakiś taki gotowy jezyk ? Nie potrzebuje funkcjonalności Byterun Java, mam na myśli coś znacznie prostszego.

#2: Jesli nie istnieje, to będe musiał wymysleć. Wykombinowałem sobie to tak, że wirtualna maszyna może mieć jeden akumulator i zestaw instrukcji działających na adresach bezwzględnych. Na przykład "dodaj do accu wartość z adresu xxx","zapisz accu pod adres xxx","wprowadz do accu pomiar z przetwornika xxx","sprawdz czy accu jest wieksze od komorki po adresem xxx","skocz o 19 kroków do przodu" itd...

#3: Czy ktoś może coś takiego już dłubał i ma jakieś uwagi ?

Dla mnie podstawowy problem to w tej chwili określić minimum zestawy instrukcji wirtualnego assemblera z mozliwością rozbudowy w przyszłości.

PS. Rozwiązanie na sterownikach PLC nie wchodzi w grę, w środku musi być _masa_ matematyki na poziomie mnożeń i dzieleń. Ponadto PLC jest drogie :/

Reply to
Sebastian Bialy
Loading thread data ...

a moze poszukaj cos o Basic Stamp?

Reply to
Greg

Dokładnie w tym kierunku zmierzam, na przykłąd 1 rejestr (akumulator) i powiedzmy 16 komórek pamięci. Musze przemyśleć, czy to wystarczy. W zasadzie to mój pomysł przypomina bardzo koprocesor matematyczny, tylko bez stosu (ale może by tak zrobić stos ..., to by jeszcze bardziej uprościło język).

No dokładnie, u mnie nawet bez pętli się obędzie (ale język by miał możliwośc rozbudowy).

Nie ma znaczenia jego wygląd i tak należało by napisać jakiś wyższego poziomu, bo dłubanie w wirtualnym kodzie maszynowym może być trudne. Choćby assembler, choć można coś w rodzaju prymitywnego basica.

Poniekąd. W ogóle oceniam, że mój jezyk poza liczeniem i decyzjami korzysta wyłacznie z wbudowanych procedur w uC.

Reply to
Sebastian Bialy

Użytkownik Sebastian Bialy napisał:

Też myślę nad czymś takim i w wolnej chwili będę działał. Moim pomysłem natomiast jest ograniczyć ten "assembler" do minimum. Rozumiem to w ten sposób, żeby zaimplementować tylko instrukcję warunkową i skok a całą resztę jako mapowane procedury i tak wpisywane w uC. No może jeszcze jakąś pętlę.

Nasz "assembler" byłby wtedy mały, elastyczny i uniwersalny. Niestety trochę proceduralny, bez zmiennych. Powinien być łatwy do napisania i dobrze wykorzystywać swoje środowisko. Zestaw instrukcji byłby wtedy częścią projektu, nie assemblera.

Albert.

Reply to
Albert Bartoszko

I wszem, ale tu jest jeden problem: zakładam, że jeśli popełnię błąd w algorytmie na procesor wirtualny - cały system się nie powiesi się, w szczególności, że mogę w procesorze reczywistym dokonać zabezpieczeń przez sytuacjami niebezpiecznymi. Problem w tym, że kod wirtualny może być pisany przez osoby nie mające o tym zbyt dużego pojęcia.

Reply to
Sebastian Bialy

Użytkownik Sebastian Bialy napisał:

Hmm, jest jeszcze jedna możiwość. Zmienić uC na taki co z RAM'a program może wykonywać. A potem tylko: z EEPROM do MEM, call MEM i hula.

Prawie jak PC-et z dyskietką ;-)

Albert

Reply to
Albert Bartoszko

Użytkownik "Sebastian Bialy" snipped-for-privacy@poczta.onet.pl> napisał w wiadomości news:csnrcu$321$ snipped-for-privacy@nemesis.news.tpi.pl

Forth? ;-) Ja wiem, że to jezyk dla zapaleńców, ale jak już się ten zapał posiądzie, to podobno nawet dosyć efektywny. Na pewno miałem w ręku jakąś implementrację Forth-a na '51-kę.

Reply to
Marek Dzwonnik

Sebastian Bialy napisał(a):

Do prostych zastosowań wystarczą instrukcje arytmetyczne/logiczne i coś do we/wy oraz instrukcja wywołania funkcji z flash'a. Ważne jest dla celów rozwojowych w przyszłości jest przemyślenie binarnej reprezentacji kodu instrukcji oraz trybów adresowania (zmienne i tablice).

Akurat udało mi się _popełnić_ takie rozwiązanie, łącznie z kompilatorem języka "php-like" dla serii modułów Ethernetowych. Obsługuje wywołania funkcji z firmware modułu, funkcje użytkownika, zmienne lokalne, tablice itp. Program jest wykonywany z pamięci I2C która także zawiera filesystem dla serwera http. Szczegóły na stronie

formatting link

W tym rozwiązaniu jest wykorzytana tzw. maszyna stosowa (bez rejestrów) wyłącznie stos który oczywicie musi być odpowiednio duży. Program wykonuje operacje arytmetycze, logiczne przez odkładanie na stosie argumentów oraz wyniku operacji np: param1==param2 w asm będzie: PUSH parm1 PUSH para2 EQU instrukcja EQU pobiera dwie wartości ze stosu a umieszcza z powrotem wynik wykonania - szczt stosu pełni rolę akumulatora. Wartości param1/2 to jak widać stałe lecz można także operować na wartościach tylko należy je załadować na stos instrukcją "IN adres" czyli wyrażenie var1=(var1+param2)/param3 można zapisać asm jako: IN var1 PUSH param2 ADD PUSH param3 DIV OUT var1 i na szczycie stosu otrzymamy wynik, który można wysłać do pamięci zmiennych przez instrukcję "OUT adres", która także zdejmuje wartość ze stosu i ładuje do pamięci zmiennych.

Wywołanie procedury z pamieci flash jest realizowane następująco (procedura może mieć parametry) PUSH param1 ;przekaznie parmetru przez stos CALL funcnum ;funcnum to index do tablicy funkcji we flash'u FIX -1 ;przesuniecie "ręczne" {usunięcie parametru)

Dużą zaletą tego rozwiązania jest prostota tworzenia kompilatora. Także łatwo wykryć trakcie wykonania sytuacje awaryjne przez obserwację wirtualnego wskaźnika stosu.

Pozdrawiam Paweł Ciesłowski

Reply to
invalid unparseable

Użytkownik Marek Dzwonnik napisał:

formatting link
A tu BASIC na MSP430 ;-)

Albert

Reply to
Albert Bartoszko

Marek Dzwonnik wrote on Thu, 20 Jan 2005 12:46:53 +0100: [.....]

Ale używa Odwrotnej Notacji Polskiej która w Polsce chyba nie jest lubiana. :-) Na comp.arch.embedded jest koleś który w Forth programował lalkę Barbie albo Kena - nie pamiętam dokładnie. :-) A konkretniej, to pisał soft na jakieś czetobitowe uC które napędzają to ustrojstwo.

Regards, /J.D.

Reply to
Jan Dubiec

Jan Dubiec napisał(a):

i słusznie, bo od Odwrotnej Notacji Polskiej lepsza jest Notacja Polska ;)

programuję w PostScript to wiem :)))))))))))

Reply to
Tawez

Tawez wrote on Thu, 20 Jan 2005 15:55:25 +0100:

[.....]

Nie, RPN jest lepsza: jest trochę bardziej czytelna ze względu na inne położenie operatorów.

A to od kiedy PS używa PN a nie RPN? :-)

Regards, /J.D.

Reply to
Jan Dubiec

Jan Dubiec napisał(a):

och, koniecznie chciałem zabrać głos na grupie, a czasami czuję się tak niekompetentny że już wolę konfabulować w tematach bardziej OT ;)))))

PS. a propos PostScript. Propozycja/prośba adresowana do robotyków między innymi napisałem właśnie programik w PS do robienia tarcz enkoderów (praktycznie dowolnych) i potrebuję beta testerów ;) chętnych proszę o kontakt na priv.

Reply to
Tawez

Myślę, że akurat zakładając rozmiar definicji instrukcji na jeden bajt - mam sporą przestrzeń.

Ładne, choć w moim przypadku jest nieco inaczej - przejrzystośc tego wirtualnego kodu powinna być możlwie mała, ale na tyle czytelna, żebym się w tym połapał ;) Chodzi o utrudnienie grzebania w domowych warunkach.

Zastanawiam się nad takim rozwiązaniem zamist banku rejestrów. Z moich szacunków wynika jednak, że potrzebuje maksimum 16 komórek pamieci na raz. Kod przewiduje adresowanie 256. Być może stos będzie dodatkiem do jezyka a nie integralną cześcią. W ogólności źle mi się pisze stosowo, ale to pewno skrzywienie koderskie z MC68000 :) Ci co pisali na x86 pewno mają większą wprawę ;)

Kompilator nie będzie chyba na razie potrzebny, jeśli język będzie prosty wystarczy do niego asembler.

Reply to
Sebastian Bialy

Ja stworzyłem własny język skryptowy dla PIC18. Na PC pisze się kod źródłowy w języku strukturalnym podobnym do C (gramatyka prawie w całości została zerżnięta z ANSI C:) i kompiluje do kodu pośredniego (pcode - rodzaj asemblera) wykonywanego instrukcja po instrukcji przez interpreter (technologia Virtual Stack Machine VSM). Skompilowany skrypt w postaci binarnej siedzi we FLASH proca. Całość ma działać podobnie jak skrypt w modułach GSM Sony-Ericsson GR47. Interpreter wyciska jakieś 20k instr./sek. na marnych 5 MIPS PIC18 ale w planach jest migracja na ARM7 hi hi:) Przykład:

  1. Źródło:

main { print (1+2*3, 0x00); }

  1. pcode: push 1 push 2 push 3 mul add push 0 print exit
Reply to
point

Byl tez 8052 Basic

J.

Reply to
J.F.

Sebastian Bialy napisał(a):

Hmm... ale przecież w docelowym urządzeniu bedzie tylko binarna reprezentacja kodu wirtualnej maszynki. Bez znajomości implementacji cieżko bedzie rozgryźć za co który bajt skryptu odpowiada. Nawet trudzo będzie wskazać gdzie kod się zaczyna :-)

Jako komórkę możesz także potraktować odwołanie do ADC lub pinu I/O (np adresy 0-0x10 ram, 0x20-0x30 kanały ADC itp) z czasem przestrzeń adresowa może się skurczyć :-)

Stos w takim zastosowaniu służy głownie do przekazywania parametrów i wyliczania wyrażeń.Dla przykładu konstrukcja operacji np ADD jest w takim przypadku bardzo prosta: // definicje #define POP(x) x=*(sptr++) #define PUSH(x) *(--sptr)=x uint8t a; uint8t b; //...VM func... if (opcode==OP_ADD){ POP(a); POP(b); PUSH(a+b); }; //...VM func...

W innym przypadku będziesz zmuszony do przekazania adresu operandu albo w kodzie instrukcji (znacznie ograniczy ilość instrukcji) lub kolejny bajt będzie adresem operandu (ewentualnie stałą). I tutaj bedziesz musiał zdefiniowac kod ADD (adres) oraz ADD (stała), może być jako uzupełnienie także ADD (numer rejestru).

Assembler też jest kompilatorem. Pracuje z kodem źródłowym w postaci ciągów ASCII, wymaga parsera który zamieni ciag np. PSH 01 lub PUSH 01 na binarnie np 05 01 lub dla szesnastu bitów argumentu 05 01 00. Assembler także wymaga obsługi tablicy symboli itp.

Pozdrawiam Paweł Ciesłowski

Reply to
invalid unparseable

FORTH jest dla Ciebie. Jezyk wybitnie "write only" :-)

J.

Reply to
J.F.

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.