Skocz do zawartości

EVA (Extensible Versatile Architect)


Pomocna odpowiedź

(edytowany)

Porządek jako-tako zrobiony 😄 Jeszcze nie jestem zadowolony ze struktury, ale już jest "akceptowalna". Przy okazji jakoś przez przypadek naprawił się bug z make... Może to przez przeróbkę obsługi zewnętrznych programów, gdzie komunikacja wyjściowa już nie jest obsługiwana bezpośrednio przez strumienie, a poprzez zdarzenia... W każdym razie mniej błędów to mniej problemów...

Teraz głównie pozostaje dodać kolejne komendy do listy i zastanowić się czy to, że funkcja nie zwraca wartości to był dobry pomysł... Póki jeszcze da się to poprawić 😄 

Aktualny spis funkcji

  • Core
    • Common
      • cwd(target: string) -> zmień ścieżkę roboczą
      • finish(status: string) -> zakończ program z danym statusem (error, success, warning)
      • is_set(var_name: string) -> sprawdź czy dana zmienna jest zdefiniowana (nie jest null)
      • software_exists(name: string) -> sprawdź czy oprogramowanie jest zainstalowane (wykonuje komendę z opcją --version)
    • Importing
      • use_architecture(name: string), use_arch(name: string) -> wczytaj plik architektury
      • use_board(name: string) -> wczytaj plik płytki
      • use_debugger(name: string) -> wczytaj plik debuggera
      • use_debugger(name: string) -> wczytaj plik debuggera
      • use_operating_system(name: string), use_os(name: string) -> wczytaj plik systemu operacyjnego
      • use_processor(name: string), use_cpu(name: string), use_mcu(name: string) -> wczytaj plik procesora
      • use_tool(name: string) -> wczytaj plik narzędzia
    • Logging
      • err(msg: string) -> wyświetl błąd w konsoli
      • warn(msg: string) -> wyświetl ostrzeżenie w konsoli
      • succ(msg: string) -> wyświetl sukces w konsoli
      • msg(msg: string) -> wyświetl wiadomość w konsoli
    • Options
      • option_default(id: string, value: ?) -> ustal standardową wartość danej opcji (gdy nie jest zdefiniowana)
      • option_exists(id: string) -> sprawdź czy dana opcja jest zdefiniowana
      • option_is(id: string, value: ?) -> sprawdź czy dana opcja ma ustaloną wartość
  • GDB
    • gdb_begin() -> rozpocznij proces GDB
    • gdb_begin(name: string) -> rozpocznij proces GDB dla danego programu np. 'arm-none-eabi-gdb' stosowane do multi-core
    • gdb_tar_ext(name: string) -> podłącz się do zewnętrznego debuggera np. na porcie COM '\\.\COM7'
    • gdb_attach(id: int) -> dołącz GDB do danego rdzenia
    • gdb_load(id: string) -> załaduj dany plik np. '.hex' lub '.elf' do rdzenia
    • gdb_detach() -> odłącz aktualny rdzeń
    • gdb_quit(), gdb_exit() -> zamknij aktualny proces GDB
  • IO
    • DirectoryFn
      • directory_create(path: string) -> utwórz katalog
      • directory_delete(path: string) -> usuń katalog
      • directory_exists(path: string) -> sprawdź czy katalog istnieje
    • FileFn
      • \\TODO\\
  • Make
    • cmake(opt: string) -> wykonaj CMake z argumentami
    • make(opt: string) -> wykonaj Make z argumentami 
    • ninja(opt: string) -> wykonaj Ninja z argumentami (alternatywa dla Make)
Edytowano przez H1M4W4R1
  • Lubię! 1
Link do komentarza
Share on other sites

No i jednak wyszło, że funkcje zwracają wartość 😉 

architect.va

[architect]

# Setup board and debugger settings
use_board('pi_pico');
use_debugger('black_magic_probe');

debugger_port: COM_PORT('COM7');
debugger_core: 1;

black_magic_probe.va

[debugger]
id: 'black_magic_probe';
gdb: 'arm-none-eabi-gdb';

msg('Debugging using Black Magic Probe (GDB)');

[upload]
is_set('debugger_port') -> ![bmp_no_port_specified];
is_set('debugger_core') -> ![bmp_no_target_core_specified];

software_exists(gdb) -> ![bmp_gdb_not_installed];

cwd('build');

msg('Starting GDB');
gdb_begin(gdb) -> ![bmp_gdb_not_installed];
msg('Connecting to Black Magic Probe...');
gdb_target_external(debugger_port) -> ![bmp_probe_not_found];
msg('Attaching to target core...');
gdb_attach(debugger_core) -> ![bmp_attaching_failed];
msg('Loading HEX file...');
gdb_load_ext('.hex') -> ![bmp_load_failed];
gdb_detach();
gdb_quit();
succ('Uploaded successfully.');

[bmp_no_port_specified]
err('No debugger port specified (`debugger_port`).');
finish('e');

[bmp_no_target_core_specified]
warn('No target core (`debugger_core`) was specified. Using `1` as default.');

[bmp_gdb_not_installed]
err('No GDB is not installed or missing from `PATH`.');
finish('e');

[bmp_probe_not_found]
err('Probe does not exist on selected COM Port ');
finish('e');

[bmp_attaching_failed]
err('Attaching to target failed.');
finish('e');

[bmp_load_failed]
err('Cannot load binary onto target. Does your .elf binary exist?');
finish('e');

 

  • Lubię! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Kiedy człowiek jest leniwy i nie chce dodawać operatorów logicznych do programu:

image.thumb.png.a3302fd334dd17036e09dcad102f9a1e.png

Zaczyna się robić clusterf-k... 😄 

IMO obsługa poprzez funkcje jest logiczniejsza niż dodawanie kolejnego elementu, to ma być proste, a raczej nikt nie będzie aż tak kombinował z operatorami logicznymi 😄 

  • Lubię! 2
Link do komentarza
Share on other sites

Ty mi nie mów o operatorach logicznych - na razie stwierdziłem, że funkcje nie mają efektów ubocznych i zamiast AND THEN i OR ELSE mam proste AND i OR z obliczeniem obu gałęzi. Ale będę musiał to zmienić...

 

  • Lubię! 1
Link do komentarza
Share on other sites

3 godziny temu, ethanak napisał:

Ty mi nie mów o operatorach logicznych - na razie stwierdziłem, że funkcje nie mają efektów ubocznych i zamiast AND THEN i OR ELSE mam proste AND i OR z obliczeniem obu gałęzi. Ale będę musiał to zmienić...

Próbuję zrozumieć czy to jest arcywybitna sarkastyczna krytyka poziomu nadmiernego skomplikowania tego narzędzia czy mówisz o jakimś innym języku/narzędziu 😄 

Link do komentarza
Share on other sites

21 minut temu, ethanak napisał:

A chyba problem z operatorami logicznymi jest podobny?

Problemem jest tylko lenistwo, bo dodać je mogę w kilka sekund, ale muszę to potem zaimplementować w parsingu, bo używam ANTLR4 i tokenizacji, co powala na poruszanie się po drzewie.

10 godzin temu, H1M4W4R1 napisał:

image.thumb.png.a3302fd334dd17036e09dcad102f9a1e.png

Rozwija się m/w tak:

image.thumb.png.a6a499c249283240ede53367691786ff.png

Zielone to tokeny, białe to instrukcje, które wykonuje parser. Sorki za jakość, w zał. masz eksport SVG, bo niestety ma styl i konwersja na PNG nie ogarnia 😞  

EVA_SVG_Sample.zip

Link do komentarza
Share on other sites

To że problemem jest lenistwo to święta prawda. Tyle  ża ja muszę zaimplementować skoki warunkowe jako rezultat kompilacji wyrażeń - a strasznie mi się nie chce 🙂

Tyle ża ja piszę to cholerstwo from scratch, kompilator na kod pośredni w Pythonie, interpreter to C++...

  • Lubię! 1
Link do komentarza
Share on other sites

6 minut temu, ethanak napisał:

Tyle ża ja piszę to cholerstwo from scratch, kompilator na kod pośredni w Pythonie, interpreter to C++...

Masochista 😄 Pewnie wydajność też nędzna... Jak masz tam ESP32 to pokusiłbym się o spróbowanie ANTLR4, bo z tego co pamiętam masz tam dość prosty język, więc wydajność będzie zbliżona do Twojego kodu. Najdłużej zajmuje wczytanie pliku i tokenizacja, potem chodzi jak marzenie i można sobie skakać po drzewie elementów. Jak to kompilujesz do kodu pośredniego, to wydajność by nie ucierpiała, a byłoby Ci łatwiej pracować (tylko nie polecam mojego opisu, bo jest dość chaotyczny). Lepiej wpaść tutaj: 

 

Obsługę parsera ANTLR4 można pisać w każdym sensownym języku 😄 Python, TS, C#, C++, Java etc., a sama składania jest dość łatwa do ogarnięcia.

Pisanie "kompilatora" (technicznie Twój program kompiluje język X do Pythona) od zera to masochizm w czystej postaci...

Link do komentarza
Share on other sites

@H1M4W4R1 Wszystko pomieszałeś 🙂

Kompilator jest pisany w Pythonie, działa na pececie a wydajność jest akurat najmniejszym problemem (sekwencje mają z reguły kilka - kilkanaście linii a kompilacja zestawu nie trwa sekundy). Parser jest trywialny i nie ma potrzeby angażowania tu jakichś wymyślnych dodatków, w praktyce ogranicza się do translacji wyrażeń na drzewo (jakieś 150 linii kodu).

Na wyjściu mam albo kod źródłowy w C (zainicjalizowane tablice) albo binarkę przygotowaną do władowania bezpośrednio do EEPROM-u.

ESP robi całą czarną robotę - taką przykładową instrukcją wynikową jest np. "przesuń serwo na pozycję X w ciągu N milisekund z akceleracją".

  • Lubię! 2
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.