Elektroda.pl
Elektroda.pl
X
PCBway
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Optymalizacja "kompresja" i przyspieszenie programów Arduino

02 Sty 2018 12:26 3399 58
  • Użytkownik usunął konto  
  • PCBway
  • PCBway
  • Użytkownik usunął konto  
  • Poziom 33  
    @R-MIK To jakie są te flagi kompilacji i wersja gcc oraz avrlibc? Bo nadal nie wiemy i całe to porównywanie jest kompletnie bez sensu.
  • Poziom 37  
    Ale jest z sensem! Rzecz w tym, że dla mnie to nic nowego.
    https://www.youtube.com/watch?v=8aMsJWpXyE8
    Takich smaczków oczywiście jest więcej, rzecz w tym, że każda warstwa abstrakcji charakteryzuje się pewnym narzutem. Gorzej gdy narzut tych funkcji powoduje niekoniecznie prawidłowe działanie programu, co też jest znaną przypadłością. Dlatego "advanced arduino programming" to w rzeczywistości normalne programowanie AVR z wykorzystaniem otoczki Arduino tam gdzie warto.

    więcej na ten temat choćby:
    https://www.youtube.com/watch?v=B4bsPDFBJhA
    https://www.youtube.com/watch?v=Pj9GZDYyxmw
    To nie są różnice wynikające z wersji kompilatora, tylko implementacji danych funkcji w arduino.
  • Poziom 33  
    @tronics Sorry ale taka analiza powinna się odbywać poprzez przejrzenie symboli w pliku *elf a nie jakimś trywialnym porównaniu. Wielkie mi nieba, zapis do rejestru zajął mniej niż call funkcji. Ponadto ciekawe o ile będzie korzystniejszy ten _delay_ms z avrlibc w stosunku do tego ardinowego w przypadku wywołania w wielu miejscach. Bo ten z avrlibc to jest funkcja inline a z arduino już niekoniecznie.
  • Poziom 37  
    Cytat:
    Wielkie mi nieba, zapis do rejestru zajął mniej niż call funkcji

    To jest oczywiste, niemniej mało kto się spodziewał tego, że proste "machanie pinem" może mieć taki narzut. A wystarczyłoby żeby kolega Grzegorz zalinkowane filmy obejrzał, albo nawet tylko przejrzał ten ostatni będący analizą właśnie tej konkretnej funkcjonalności i byłoby jasne, że digitalWrite() zajmuje dużo więcej miejsca (i cykli) oraz byłoby wiadomo dlaczego tak jest. A co do delay to się nie wypowiadam, bo tego akurat aspektu nie analizowałem.
  • Użytkownik usunął konto  
  • Poziom 33  
    @tronics Wybacz ale nie mam czasu na cały ten film. Jednak znalazłem moment aby popatrzeć na to:
    https://github.com/arduino/Arduino/blob/maste...re/arduino/avr/cores/arduino/wiring_digital.c

    Widzę, że jest dodany pewien poziom abstrakcji. Niemniej jednak te 630bajtów może być mocno różne w zależności od wersji gcc oraz flag kompilacji.

    @R-MIK Można prosić o te flagi kompilacji? Bo naprawdę nie mam potrzeby instalować arduino IDE tylko po to aby uzupełniać To co powinno być w pierwszym poscie.
  • Użytkownik usunął konto  
  • Poziom 37  
    Oczywiście, że jest pewien poziom abstrakcji, w końcu mamy arduino na rzeszy różnych mikrokontrolerów z różnymi peryferiami do których się odwołujemy przez te same funkcje, przez te same symbole. Jeszcze funkcja musi sprawdzić po drodze to i owo, wyłączyć przerwania, załączyć przerwania (czy jest potrzeba, czy nie ...)
    Kolega R-MIK wyszedł z błędnego założenia, że digitalWrite jedyne co robi to ustawia pin. Jak sam sprawdziłeś robi dużo więcej (co oznacza, że generuje dłuższy kod ... ale będzie to szczególnie widoczne w bardzo prostych szkicach). Tylko trzeba sobie z tego zdawać sprawę. Kiedyś widziałem filmik kolesia, który miał problem z generowaniem impulsów bo czasem mu się przesuwały z niewyjaśnionych okoliczności. Okazało się, że problemem były inne operacje, zdawałoby się nie ingerujące w przerwania, a jednak... Takich pułapek czeka więcej. Warto o tym rozmawiać.

    @R-MIK - nie kolego, jeśli pojedyncza funkcja digitalWrite() na start zje dajmy na to 200B, to jej wielokrotne wywoływanie nie spowoduje zapchania pamięci, natomiast jeśli jest różnica w czasie wykonania PORTB= a digitalWrite() (a jest!) to ona akurat będzie powielona.
  • Poziom 15  
    Mam gcc 7.2.0 ,avr-libc 2.0.0 i wyniki są takie same . A gdzie w arduino ustawia się flagi ?
  • Użytkownik usunął konto  
  • Poziom 15  
    "Sprawdziłeś wersje kompilatora której używa Arduino czy może przypadkiem tą, której używa AtmelStudio?"

    Optymalizacja "kompresja" i przyspieszenie programów Arduino
  • Poziom 33  
    @adasikp Panie kolego. To z pakietów masz zainstalowane avr-gcc w wersji 7.2. Arduino używa tego co wypuszcza Atmel:
    https://www.arduino.cc/en/Main/ReleaseNotes


    "The updated tools are now binutils-2.26, gcc-4.9.2, avr-libc-2.0.0, gdb-7.8"

    Czyli stary trup (albo bardziej dyplomatycznie: stabilny ;)).
  • Poziom 38  
    R-MIK napisał:
    Dużo złego mówi sie o Arduino i okazuje się słusznie. Zrobiłem pare prostych prób kompilacji prostych kodów.


    Może nie tyle złego co to że mimo wszystko pisząc w C na bardzo proste kontrolery (na obecne czasy) omija się wiele spraw związanych z samym mikrokontrolerem co prowadzi do tego że jak brak jest jakiejś biblioteki wiele osób rozkłada ręce i nie potrafi oprogramować jakiejś funkcjonalności. Natomiast co do wielkości kodu to każda warstwa abstrakcji coś takiego powoduje i tutaj nie ma się co dziwić. Dla mnie to kolejna wada bo mimo wszystko są to małe mikrokontrolery gdzie Flash warto oszczędzać aby nie pchać dużych procesorów AVR (które cenowo są mało atrakcyjne np. do ARM-ów).

    Jeśli chodzi o samo Arduino to ja bardziej bym się cieszył jak popularniejsze stanie się właśnie z jakimiś procesorami ARM gdzie taka warstwa abstrakcji dla ludzi nieobytych ma jakiś sens i można sobie na nią pozwolić (większe zasoby).
  • Użytkownik usunął konto  
  • Poziom 33  
    @R-MIK No przypuszczam, że gdzieś w katalogach Arduino IDE jest Makefile, którego można zmienić. Zachowujesz się jakby to była moja wina, że nie można tego zmienić z poziomu samego IDE.
  • Użytkownik usunął konto  
  • Moderator Mikrokontrolery Projektowanie
    Takie porównania na trywialnych programach są nic niewarte. Tym bardziej, że początkowy koszt może później z łatwością się zrekomensować, dzięki np. korzystaniu z funkcji wyższego poziomu. Jak bezsensowne są takie porównania, albo raczej jak należy uważać z ich interpretacją pokazuje prosty przykład. Skompilowałem sobie dwa identyczne programy, wykorzystują one timer do sterowania znak-moduł mostka H i generacji czasów martwych. Na XMEGA program zajął 700 bajtów FLASH i 0 bajtów SRAM. Praktycznie to samo dla ARM SAM D21 (ma prawie identyczne peryferia jak użyta XMEGA): 2456 bajtów FLASH i 9336 bajtów SRAM. I co z tego wynika? Kompletnie nic. A osoba niezbyt obeznana mogłaby wręcz dojść do bardzo wstrząsających wniosków...
  • Użytkownik usunął konto  
  • Poziom 37  
    @R-MIK - rzecz w tym, że to co pokazałeś nie świadczy o "kiepskości" arduino. Jak to zostało poruszone funkcja digitalWrite() nie robi zwykłego PORTn=0xNN; Raz, że musi przetłumaczyć odpowiedni nr pinu arduino na sprzętowy gpio, a dwa zrobić przypisanie wartości w miarę bezpiecznie (biorąc pod uwagę alternatywne funkcje). Bardzo fajnie, że poruszyłeś ten temat, bo ludzie "ogarniający" AVR dzięki takim tematom będą mogli "efektywniejszy" kod pisać nawet w Arduino IDE. Niemniej zakładanie, że funkcje arduino są "spasione" zupełnie niepotrzebnie jest trochę na wyrost. Teraz nie wiem co było pierwsze, jajko czy kura (albo w tym przypadku Arduino albo WiringPi) ale sama obsługa GPIO składniowo jest ta sama, a funkcje dot. obsługi GPIO w RPi nawet są bardziej zaawansowane :P

    Teraz co "od strzału" arduino prostymi komendami robi? UART? Sure. One Wire (z biblioteką) a owszem, I2C również, i jako master, i jako slave. Baaa, parę bibliotek i mamy elegancką i wygodną obsługę rejestrów szeregowo-równoległych, ekspanderów i mnóstwa innych rzeczy. Kilka kliknięć i kod gotowy, działa. Teraz zbudowanie tego samego od podstaw ile koledze zajmie zakładając, że siada kolega do swojego pierwszego projektu sprzętowego, nie ma programatora, nie ma tysiąca różnych zoptymalizowanych przed siebie nagłówków do realizacji różnych zadań? Dzień? Dwa? Cechą arduino nie był i nie jest szybki kod, ale szybkie i stosunkowo łatwe napisanie określonej funkcjonalności.

    I tak jak to np. w wielu dziedzinach jest trzeba znać ograniczenia i iść na kompromis. Np. w TPM jest wykres z dwiema krzywymi przecinającymi się. Jedna to koszty wydane na prewencję, druga to koszty wydane na naprawy. Trzeba znaleźć złoty środek. Inny przykład to magiczny trójkąt budowlańców tj. szybko, tanio, dobrze. Wykres z TPM można zatytułować "koszty opracowania kodu" i "koszty dobrania MCU" i będzie podobnie, nie zawsze koszt wydany na najbardziej efektywny kod nie będzie współmierny do zysków wynikających z oszczędzania na MCU. W zasadzie jest odwrotnie, MCU stają się na tyle tanie, że przesadna optymalizacja jest CAŁKOWICIE NIEUZASADNIONA, jednocześnie funkcjonalność urządzeń bardzo rośnie bo takie są wymagania rynku. Ergo by szybko zrobić mega funkcjonalny produkt wręcz TRZEBA korzystać z wszystkiego co pozwoli na spełnienie warunków i wypuszczenie jak najszybciej produktu na rynek. Może nie koniecznie Arduino, ale już narzędzia jak ASF owszem.
  • Użytkownik usunął konto  
  • Poziom 38  
    tmf napisał:
    Na XMEGA program zajął 700 bajtów FLASH i 0 bajtów SRAM.


    Owszem tylko Arduino jest bardziej popularne na najtańsze AVR-y które sprzętowo trudno porównać do XMega. Natomiast zdaje mi się że płytki z XMega są tak popularna jak Maple z ARM-ami - czyli jakiś margines.

    Z jednej strony Arduino niby coś tam ułatwia z drugiej daje spory narzut kodu i to co wspomniałem pisząc w C wiele osób ma problem z byle pierdołą jak nie ma gotowej biblioteki. Natomiast AVR-y to nie jakieś tam rocket science które trudno opanować.

    Sam zaczynałem z nimi zabawę gdzieś w okolicach 2000r gdzie pisało się w ASM - ot była to przesiadka z 8051 i w parę dni szło już pisać rozbudowane programy (nawet w internecie nie mając takiej bazy wiedzy jak jest dostępna obecnie)...

    Może i jest to dobre rozwiązanie dla osoby która chce coś zrobić szybko bez zagłębiania się w temat, ale na pewno nie na dłuższą metę. Natomiast jak ktoś chce się bawić więcej z uC to IMHO lepiej zacząć naukę od podstaw...
    Oczywiście to tylko moje subiektywne zdanie :)
  • Poziom 37  
    Cytat:
    Natomiast zdaje mi się że płytki z XMega są tak popularna jak Maple z ARM-ami - czyli jakiś margines.

    To kolega niech porówna ile jest tutków z STM32F103, a ile z Xmega, albo PIC. Jeszcze ewentualnie Teensy (kinetis) i różnorakie Feather są popularne, ale nie w PL. W Polsce to akurat albo klasyczne arduino na AVR, albo nadal same AVR w DIP. Choć i to się zmienia biorąc pod uwagę programy szkoleń STM32 i nie tylko.
  • Użytkownik usunął konto  
  • Poziom 38  
    tronics napisał:

    To kolega niech porówna ile jest tutków z STM32F103, a ile z Xmega, albo PIC.


    Ale po co mam porównywać... A wiem postęp w nauczaniu - dzisiaj jak nie ma tutków to się nie da już uczyć ;)

    To tak trochę żart i odniesienie do czasów gdy zaczynałem zabawę z uC gdzie nawet internetu nie było i z literaturą było podobnie (jak człowiek coś zdobył to było święto). Wtedy się dało w obecnych czasach nauka jak ktoś czegoś nie poda na tacy to już problem :)
  • Poziom 37  
    @tplewa - jak kolega napisał "zdaje się" ... czyt. dostępność i popularność płytek na ARM zgodnych z Arduino jest nieporównywalnie większa niż tych na Xmega (gdzie w sumie są do wyboru tylko drogie i stare xplained albo moduły kol. Leona). Polecam zapoznać się z ceną i możliwościami dev boards na w/w STM32F103. Choć nie wiem ile z nich jest rzeczywiście na STM32.
  • Poziom 38  
    tronics napisał:
    @tplewa - jak kolega napisał "zdaje się" ... czyt. dostępność i popularność płytek na ARM zgodnych z Arduino jest nieporównywalnie większa niż tych na Xmega (gdzie w sumie są do wyboru tylko drogie i stare xplained albo moduły kol. Leona). Polecam zapoznać się z ceną i możliwościami dev boards na w/w STM32F103. Choć nie wiem ile z nich jest rzeczywiście na STM32.


    Chyba się nie zrozumieliśmy do końca. Nie chodziło mi o to czy są dostępne z XMega czy tam STM... tylko ogólnie o popularność w PL tych płytek (co obserwuję) czytając jakieś tam fora w naszym kraju. Odniosłem się do tego tematu tylko ze względu na to że padło porównanie z XMega...

    Sam akurat mam kilka płytek Maple Mini ale nie używam ich z Arduino (ot kiedyś używałem do szybkiej developerki aby nie bawić się w projekt PCB na początku projektu)... Natomiast jeśli chodzi o złącze Arduino to o ile się nie mylę kilka płytek Nucleo z STM32 jakie mam oraz STM32F746G-DISCO ma złącze kompatybilne z tą platformą... Osobiście za Arduino się nie biorę bo dla mnie to strata czasu - to samo albo i lepiej mogę zrobić po swojemu :) Do tego zapewne szybciej bo więcej czasu akurat mi zajmie zapoznanie się z bibliotekami Arduino i załapanie jak one działają niż napisanie własnego kodu na podstawie DS.
  • Moderator Mikrokontrolery Projektowanie
    tplewa napisał:
    Odniosłem się do tego tematu tylko ze względu na to że padło porównanie z XMega...


    Padło porónanie do XMEGA, ale mam wrażenie, że nie zrozumiałeś kontekstu. Przeczytaj prosze ponownie ten post.