Skocz do zawartości
Elvis

Co w Arduino piszczy? cz.1

Pomocna odpowiedź

deshipu,

Chyba mnie źle zrozumiałeś, w skrócie czym bardziej wysoko poziomowe programowanie tym mniejsza kontrola nad tym co robi procek, MISRA C pokazuje czego używać a czego nie i jak tego używać aby kod był optymalny i niezawodny. Prosty przykład to np debugowanie, jeśli jest włączona mocna optymalizacja kodu to za chiny nie można połapać się co za chwilkę będzie wykonywane.

Zasada jest prosta lepiej dobrze napisać kod w C++ jak spartaczyć w assemblerze. Ale jeśli ktoś napisze dobry kod w assemblerze to C++ może się schować. Nie po to do dziś popularne są wstawki w assemblerze.

Pozdrawiam

Udostępnij ten post


Link to post
Share on other sites

Nie sądzę, żeby kod z super-optymalizacjami ręcznie wydzierganymi w asemblerze był łatwiejszy do debugowania niż kod z optymalizacjami zastosowanymi automatycznie, szczególnie kiedy się używa dobrego deasemblera, który te optymalizacje potrafi automatycznie wykryć i odwrócić.

Z tym dobrze napisanym kodem w asemblerze to też nie do końca tak, bo choć uda ci się niektóre fragmenty zrobić szybciej ręcznie, automatyczne optymalizacje wygrają w średnim przypadku. Tym bardziej, że w świecie rzeczywistym istnieją terminy i po prostu nie ma sensu robić ręcznie czegoś, co spokojnie zrobi automat. Tylko właśnie trzeba temu automatowi dostarczyć wystarczająco wiele informacji o tym co tak naprawdę chcesz zrobić -- czyli użyć języka wysokiego poziomu, najlepiej jeszcze przystosowanego do domeny w której operujesz, tak, aby miał jak najbardziej wysokopoziomowe operacje.

Dodatkowa zaleta jest taka, że twój program niejako automatycznie i bez dodatkowego wysiłku jest optymalny na wszystkich platformach, na które go skompilujesz, a nie tylko na tę jedną, którą dobrze znasz i na którą optymalizowałeś (włączając w to platformy, które dopiero powstaną).

Udostępnij ten post


Link to post
Share on other sites

deshipu - zjedz snickersa bo gwiazdorzysz. Próbowałeś kiedyś używać deasemblera? Czy tylko o tym słyszałeś?

Udostępnij ten post


Link to post
Share on other sites

Używałem byłem, ale to nie ma żadnego znaczenia, bo nawet gdybym tylko o tym słyszał, to nie zmienia to faktu, że takie narzędzia istnieją, działają i znacznie ułatwiają pracę.

Byłbym wdzięczny, gdyby koledzy zdołali ograniczyć się do merytorycznej dyskusji i unikać ad hominem.

Udostępnij ten post


Link to post
Share on other sites

Ok, więc w kwestii merytorycznej:

1) debugowanie programu w kodzie maszynowym/asemblerze przebiega tak samo w przypadku kodu zoptymalizowanego i nie. Problem dotyczy "tylko" programów pisanych w językach wysokiego poziomu. Optymalizator po prostu sprawia, że kod wynikowy nie do końca odpowiada kodowi źródłowemu - np. pewne wywołania, czy instrukcje mogą być pominięte, albo zastąpione innymi. Więc program "wydziargany" w asemblerze debuguje się bardzo łatwo - w końcu kod jest taki jak został napisany. Natomiast kod w C/C++ czy Pythonie wygląda zupełnie inaczej i ciężko jest czasem się połapać o co chodzi (chociaż da się)

2) Pytałem, czy używałeś deasemblera, bo niestety efekty działania nie są tak dobre jak mówią reklamy. Oczywiście IDA to genialne narzędzie do inżynierii odwrotnej, ale nawet ona nie potrafi odwrócić procesu opytmalizacji, ani kompilacji. Natomiast pięknie potrafi pomóc analizować kod programu - tyle że na poziomie asemblera, a nie C, czy też tym bardziej C++.

3) Program w języku wysokiego poziomu nie ma szans z dobrym kodowaniem w asemblerze. Niestety pisanie w asemblerze jest drogie i podatne na błędy, dlatego stosuje się języki wysokiego poziomu. Ale nawet najlepsze optymalizatory nie zastąpią (dobrego) programisty. Jeśli już jesteśmy przy deasemblerach - popatrz co generuje kompilator, albo jak wyglądają struktury danych dla programu w Pythonie. Nawet przeciętny student może napisać lepszy kod - ale faktycznie to zajęłoby dużo dłużej

Nie obraź się, ale moim zdaniem starasz się pisać o rzeczach, na których się po prostu nie znasz. Nie ma w tym nic złego, każdy ma swoją dziedzinę, w której się specjalizuje. Tylko nie warto udawać że się jest o wszystkiego ekspertem. Ja przyznam, że mało programuję w Pythonie, więc w szczegóły implementacji czy optymalizacji bym nie wchodził. Ale akurat na programowaniu niskopoziomowym, C, czy asemblerze znam się dość dobrze i widzę, że dyskusja coraz bardziej zmierza w kierunku "kto będzie miał ostatnie słowo". A chyba nie o to chodzi.

Udostępnij ten post


Link to post
Share on other sites

Nigdy nie ukrywałem, że nie znam za dobrze C++, asemblera tyko liznąłem na paru prostych platformach, problemy automatycznego optymalizowania znam pobieżnie z prac naukowych i od kolegów, którzy w tym głęboko siedzą i tak dalej. Dlatego nie podejmuję się tłumaczenia jakie dokładnie są zyski z używania C++ i nie wchodzę głęboko w tematy, w których nie czuję się pewnie.

Natomiast bardzo mnie boli powtarzanie na tym forum mitów i zabobonów dotyczących tego jak bardzo cudowny jest ręcznie pisany kod i jak bardzo złe i szkodliwe są języki wyższego poziomu, bo to po prostu nie jest prawda.

Piszesz, że "nawet najlepsze optymalizatory nie zastąpią (dobrego) programisty". To jest "no true Scottsman fallacy". Piszesz "program w języku wysokiego poziomu nie ma szans z dobrym kodowaniem w asemblerze", ale to jest nieprawda -- nie tylko dlatego się stosuje języki wysokiego poziomu, że jest wtedy taniej i bardziej poprawnie, ale głównie dlatego, że dają lepsze rezultaty -- bo nie tylko można się skoncentrować na optymalizowaniu tych kawałków użytych bibliotek, które dają największy zysk, ale także można zastosować optymalizacje na znacznie wyższym poziomie, dające większe zyski. To jest szczególnie istotne na skomplikowanych platformach z kilkoma poziomami cache-u, jednoczesnym wykonywaniem wielu instrukcji, przewidywaniem skoków i kto wie czym jeszcze -- nawet genialny programista nie jest w stanie brać wszystkich tych czynników pod uwagę przez cały czas, a automaty nie mają z tym żadnego problemu. To jest po prostu jak wyścig sprintera z maratończykiem.

Wysoko-zoptymalizowanego programu w asemblerze nie debuguje się łatwo. Czytanie kodu jest trudniejsze niż jego pisanie, a tu jeszcze musisz się domyślić co autor miał na myśli, jakie szatańskie sztuczki zastosował w celu optymalizacji, a często jeszcze, co gorsza, wymyślić gdzie się pomylił i czemu jakaś konkretna sztuczka nie robi tego co chciał. Z optymalizacjami automatu jest prosto -- zawsze są takie same, często da się je wyszukać automatycznie i odwrócić, a jak jeszcze ma się dostęp do oryginalnego kodu (a jak debugujesz własny kod, to masz), to w prosty sposób da się zmapować jedno na drugie. Debugowałem już przy pomocy gdb core dumpy z programów pythonowych i jest to dziecinnie proste i przyjazne -- gdb potrafi zinterpretować ramki pythonowej maszyny wirtualnej i wyświetlić ci dosłownie linijki pythonowego kodu. Oczywiście tam, gdzie potrzebujesz możesz zawsze wejść głębiej i zobaczyć co tak naprawdę system operacyjny czy procesor tam robi.

Absolutnie nie próbuję podważać twojej, czy kogokolwiek innego, wiedzy na tematy niskopoziomowego programowania, ani też deprecjonować tej dziedziny. Jest ona bardzo istotna, ciekawa i na pewno daje sporo satysfakcji. Jest też bardzo potrzebna -- choćby do ulepszania istniejących i budowania nowych narzędzi. Ale nie wpadajmy w pułapkę i nie zakładajmy, że jak coś jest trudne, to musi automatycznie być lepsze. Nie odrzucajmy użytecznych narzędzi tylko dlatego, że są łatwe w użyciu -- przecież to zaleta jest, a nie wada. No i nie gardźmy nimi tylko dlatego, że w rękach amatorów mogą dać opłakane rezultaty.

Podobny problem miałem kiedy zacząłem polecać ludziom chcącym zacząć robienie płytek PCB program Fritzing na kanale #arduino. Z jakiegoś powodu stali bywalcy stwierdzili, że program jest nic nie warty -- a jako dowód tego podali setki nieczytelnych i błędnych "diagramów połączeń" stworzonych przy jego użyciu. No więc dobra, program jest tak łatwy w użyciu, że ludzie nie mający pojęcia o elektronice potrafią go użyć. Ale to chyba zaleta, a nie wada? Chyba nie ma wymogu, że wszyscy jego użytkownicy muszą nie mieć pojęcia? Nadal da się przy jego pomocy stworzyć użyteczne projekty i to znacznie szybciej i łatwiej niż przy pomocy KiCada czy Eagle-a. Jedno narzędzie więcej w naszej skrzynce z narzędziami, czemu zaraz nim gardzić, czemu pozbawiać się dodatkowych możliwości?

Dobra, kończę już, bo masz rację, że się powtarzam i ta rozmowa rzeczywiście zmierza donikąd. Wydaje się, że ta różnica zdań ma źródło nie w brakach w wiedzy (chyba, że z mojej strony), tylko w podejściu, a tego się argumentami nie zmieni. Dziękuję za dyskusję, dużo się z niej dowiedziałem i uważam ją za bardzo owocną, w każdym razie dla mnie -- przepraszam, jeśli była męcząca.

Udostępnij ten post


Link to post
Share on other sites

deshipu, wydaje mi się, że trochę się nie zrozumieliśmy stąd tak długi i bulwersujący wątek. szyss, napisał dokładnie tak jak jest - skompilowany kod w języku wysokopoziomowym daje niezły rezultat. Ręcznie można uzyskać więcej, ale to się po prostu nie opłaca. Dlatego ręcznie koduje się tylko niewielkie fragmenty programów.

To co stwierdzam nie wynika z powtarzania czegokolwiek. Ostatnio w pracy piszę w C, miejscami w asemblerze, a debuguję w czystym asemblerze - nie dlatego że tak lubię ale gdb po prostu nie radzi sobie z pewnymi problemami. Co chwila muszę oglądać co kompilator wygenerował i uwierz mi, są miejsca gdzie człowiek od razu wprowadziłby poprawki.

Ale oczywiście masz rację - języki wysokiego poziomu pozwalają na pisanie rozbudowanych programów, a efekty pracy kompilatora bywają bardzo dobre. Na szczęście nadal człowiek jest niezastąpiony.

Udostępnij ten post


Link to post
Share on other sites

Że tak się tu wkleję mało merytorycznie 😉 wracając do tego porównywania c i c++ to chyba najbardziej w c brakuje mi przeciążania funkcji ale jak nie ma to nie ma 🙁

Wracając do arduino, kiedy po raz pierwszy zainteresowałem się uC arduino jeszcze nie było teraz gdy wróciłem do dawnych zainteresowań arduino rozwija się od lat. Przyglądając sie projektowi z grubsza muszę stwierdzić, że wbrew postulatom typu pomocy w nauce itp w większej części jest to nic innego jak marketing. Twórcy zapewne doskonale zdają sobie sprawę, że szczególnie młody człowiek zafascynowany robotyka i procesorami nie posiadając wiedzy na ten temat jest niejako zmuszony do korzystania z narzuconych (nie zawsze optymalnych) rozwiązań w cenach nieadekwatnych do ich możliwości w zamian oferując chwilowe ułatwienia. Na domiar złego korzystanie z tego systemu, przez dłuższy czas nie pozwala się od niego uniezależnić ze względu na, że tak to ujmę, pozorny brak kompatybilności ze wszystkim co nie nawiązuje nazwą do arduino. Taki głupi przykład - nazwy pinów, które nijak się mają do ogólnie przyjętej przez producentów konwencji. Ciekawe ile taki nastolatek kupi tzw shieldów zanim się połapie, że można taniej, prościej i samemu 😋 NIe chcę tu krytykować arduino zupełnie i nie twierdze, że wszystkie schieldy są do niczego tak czy inaczej tzw płytki arduino to wg mnie chwyt marketingowy nakierowany na nieświadomego odbiorcę.

Samo IDE też nie jest łatwo szczególnie na początku przekonać do współpracy z czymś innym co nie nazywa się "płytką arduino" mimo braku technicznych przeciwwskazań więc myślę, że to samo o sobie świadczy.

Odnośnie tego sądzę, że niegłupim pomysłem byłoby dokładne zaprezentowanie szczególnie początkującym jak móc korzystać ze wszystkich udogodnien oferowanych przez program arduino (zgodnie z postulatami programu) jednocześnie nie będąc uzależnionym od gotowych drogich płytek albo co gorsze chinskich podróbek.

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Część,

Trochę odkopuję, ale chcę "zrekonstruować" Arduino Uno (i Mega) pomijając niektóre elementy. Chciałbym rozwiać moje wątpliwości zanim przystąpię do montażu. Zastanawiam się czy jeżeli "odetnę" ścieżkę zasilania Arduino z USB ("USBVCC") to czy układ będzie prawidłowo działać ? Tzn czy będzie możliwe połączenie z komputerem itp. Po prostu nie chcę w żadnym wypadku, żeby Arduino było zasilane z USB. Ma się załączać tylko w momencie podłączenia zewnętrznego zasilania. 

Wówczas rozumiem, że mógłbym pominąć tranzystor T1, który steruje zasilaniem (czy z USB czy z zew. VIN) oraz cały układ z komparatorem U5A  i dzielnikiem RN1A i RN1B  ?

Z góry dziękuję za odpowiedź.

Edytowano przez Dejwuch

Udostępnij ten post


Link to post
Share on other sites

@Dejwuch tak, możesz zupełnie pominąć elementy związane z zasilaniem przez USB. Pytanie tylko jak chcesz zbudować resztę układu? Chcesz wykorzystać tylko główny mikrokontroler czy będziesz dodawał również ten, który działa w roli programatora/konwertera USB<>UART? Pytam, aby ustalić jakie sygnały musisz mieć wyprowadzone, aby możliwe było programowanie tej płytki.

Udostępnij ten post


Link to post
Share on other sites

@Treker, powiedzmy ,ze reszta układu pozostałaby bez zmian. Tak chciałbym dodać również mikrokontroler (Atmega16), który działałby jako programator/konwerter.  W takim razie co powinienem jeszcze uwzględnić lub zmodyfikować ?

Udostępnij ten post


Link to post
Share on other sites
3 minuty temu, Dejwuch napisał:

Tak chciałbym dodać również mikrokontroler (Atmega16), który działałby jako programator/konwerter.  W takim razie co powinienem jeszcze uwzględnić lub zmodyfikować ?

Pytanie po co 😉 Będziesz z niego aż tak często korzystał? Nie lepiej wyprowadzić tylko UART i na czas programowania/komunikacji podłączać konwerter USB<>UART? Dodanie drugiego mikrokontrolera znacznie utrudni zadanie.

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Nie wspomniałem o tym, ale cały układ będzie działał cały czas z komputerem, przesyłając dane w jedną i w drugą stronę. Więc myślę, że z tego względu jest on niezbędny. Co sądzisz ?

Czy może wystarczyłoby podłączenie USB z komputera pod pin Tx i Rx (D+ i D-)?

Edytowano przez Dejwuch

Udostępnij ten post


Link to post
Share on other sites
36 minut temu, Dejwuch napisał:

Czy może wystarczyłoby podłączenie USB z komputera pod pin Tx i Rx (D+ i D-)?

Nie, to nie wystarczy. Jednak w takim razie zamiast drugiego mikrokontrolera możesz dodać zwykły konwerter USB<>UART. Wbuduj go w swoją płytkę lub kup osobny moduł. Tak będzie najwygodniej 🙂

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Dzięki za rady 🙂  Załóżmy, że chciałbym wykorzystać  FT232RL, a co z bootloaderem ? Rozumiem, że poprzez ten konwerter nie będę mógł go  wypalić, więc musiałbym jednorazowo wykorzystać np. USB ASP / ISP poprzez MISO MOSI SCK ? 

Załączyłem schemat podłączenia dla FT232RL i tutaj pojawia się to samo pytanie. Jeżeli odetnę zasilanie z USB ("VCC5V") i podłącze zasilanie zewnętrzne to czy układ będzie prawidłowo działał ?

I wracając jeszcze do tego dodatkowego mikrokontrolera Atmega16.. Co miałeś na myśli "utrudni zadanie" ? Czy chodzi tu tylko o jego montaż itp ? Czy odcinając USBVCC będzie wiązało się to z jakimiś kłopotami w komunikacji z komputerem ? 

 

 

image.thumb.png.0f2860e19ef2b44eeca60d997219773c.png

Edytowano przez Dejwuch

Udostępnij ten post


Link to post
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...