Skocz do zawartości

Elvis

Użytkownicy
  • Zawartość

    2422
  • Rejestracja

  • Ostatnio

  • Wygrane dni

    167

Posty napisane przez Elvis


  1. Przetestowałem z Arduino 1.8.9 i kod jest identyczny. Więc pewnie sporo zależy od wersji kompilatora użytych ustawień itd.

    No i wypadałoby chyba porównywać kod programu, a nie coś pośredniego.

     

    W każdym razie kod z const jest bardzo łatwo popsuć, dlatego dawno temu polecano używanie #define. Obecnie moda się zmieniła i fanatycy C++ preferują const.

    Od czasów C++11 dostępny jest operator constexpr, który działa z moją wersją Arduino - może to pogodzi obie strony?

    • Lubię! 1

  2. Dawno temu dioda, bo tak się kiedyś nazywał Forbot był mega fajnym miejscem, ale widzę że czasy się zmieniają.

    W każdym razie, wracając do krytyki konstruktywnej - mamy taki kod:

            long long delta_time = actual_time - _elements[i].begin_time;
            
            if (delta_time < 0)
            {
              delta_time += 0xffffffff;
              delta_time += 1;
            }
            if (_elements[i].interval > 0 && delta_time >= _elements[i].interval)
            {
              onTime(i);
              _elements[i].func();
              _elements[i].begin_time = actual_time;
            }

    mam więc kilka konstruktywnych pytań:

    1) ile operacji musi wykonać 8 bitowy mikrokontroler, żeby poradzić sobie z typem danych long long

    2) czy jego użycie jest konieczne

    3) czy uzasadnione

    4) i wreszcie konstruktywnie - jak to samo napisać prościej, szybciej i poprawniej


  3. Ponieważ wątek jest ostatnio nadspodziewanie popularny, chciałem tylko zwrócić uwagę na niską jakość wspomnianej biblioteki. Wiele bibliotek dla Arduino cierpi na podobną przypadłość, ale nie można poprawiać całego świata na raz - w każdym razem zanim ktoś użyje gotowca z internetu proponowałbym poświęcić chwilę na analizę kodu i zastanowienie czy to na pewno jest program, z którego warto skorzystać, albo chociaż czy jest on wystarczająco dobry do danego zastosowania.

    Swoją drogą analiza błędów oraz poprawianie tego co autor biblioteki miał na myśli mogłoby być dość pouczające.

    • Lubię! 1

  4. Pomijając samą dyskusję pozwólcie że nieco skrytykuję samą "bibliotekę". Skoro tyle o niej napisano, to może warto byłoby ją nieco udoskonalić.

    Po pierwsze absolutnie bez sensu jest używanie 64-bitowej arytmetyki - dla 8 bitowego mikrokontrolera to mnóstwo pracy, a wystarczyłoby 32, albo i mniej bitów. Osoba mająca tak duże doświadczenie w ograniczonych sprzętowo platformach chyba powinna o tym widzieć.

    Kolejna i poważniejsza sprawa to samo obliczanie czasów - nazwa interval sugeruje że co tyle mają się wywoływać odpowiednie funkcje. Niestety nieco naiwna implementacja sprawia. że każde "przetrzymanie" procesora przez pozostałe wątki zwiększa opóźnienie. Polecam poczytać czym różnią się funkcje  vTaskDelay i vTaskDelayUntil używane przez FreeRTOS-a, może wtedy coś się rozjaśni.


  5. Ja bym proponował zacząć od poczytania co znaczy IT Security - bo jak widać po wpisach to nie do końca zrozumiane pojęcie. A ma dużo mniej wspólnego z filmami, gangsterami i hackerami niż z tym co robi dobry administrator.


  6. Po prostu mnie to zaskoczyło - ta płytka kosztuje 383zł z tego co widzę na stronie producenta. Za to można mieć kilka oryginalnych arduino, albo worek chińskich. Poza tym Arduino są ładniejsze i zgrabniejsze, więc nie będą straszyły koło telewizora. Pytałem bez żadnej złośliwości po prostu wybór platformy zaskoczył - ale jako testowa i zalegająca w domu faktycznie może mieć sens 🙂

    • Lubię! 2

  7. Tylko po co w tym projekcie ATB? To chyba najbardziej przepłacona płytka na świecie... Po pierwsze można całość zrobić pod linuksem i bez dodatkowego mikrokontrolera - ale nawet jeśli ten mikrokontroler ma być, to czemu taki potwornie przepłacony staroć? Przy tej płytce to nawet oryginalne Arduino jest tanie, o klonach nawet nie wspominając.

    • Lubię! 1

  8. Ze słownika PWN:

    Cytat

    poprawny

    1. «zgodny z faktami lub prawami logiki»

    2. «zgodny z obowiązującym konwenansem»

    3. «przestrzegający obowiązujących norm»


    • poprawnie • poprawność

    Jak widzisz nie ma tam nic o działaniu. Można mieć działający program, który nie jest poprawnie napisany, albo niedziałający napisany poprawnie.


  9. Największym problemem HAL nie jest uint8_t jako taki, ale  brak const przy wysyłaniu. Natomiast w C lepszym rozwiązaniem byłoby użycie void* nawet jeśli to nieco archaiczne - ale oszczędziłoby używania konwersji tam gdzie nie jest to konieczne. Tym bardziej że wysyłane dane nie zawsze są w 8-bitowych bajtach.

    Natomiast czy trzeba zmieniać język programowania to bym polemizował. Wystarczy nauczyć się używać tego co się ma.

    • Lubię! 1

  10. Trzy dni to krótko, wręcz standardowy czas na znalezienie błędu 🙂 Oczywiście nie zawsze można pomijać czy zmienna jest ze znakiem, czy bez - chodziło mi o ten konkretny przypadek i napisy w 7-bitowym ASCII.

    A wyjaśniając - właśnie dlatego wprowadzono typy w rodzaju int8_t, uint8_t i podobne, żeby uniknąć różnic wynikających z wersji, czy parametrów kompilatora. Stare typy w C mają niestety taką cechę, że mogą mieć różną reprezentację w zależności od środowiska - przykładowo int może mieć 16, albo 32 bity, char może być ze znakiem lub bez itd.

    • Lubię! 1

  11. uint8_t to najzwyklejszy, w dodatku 8-bitowy bajt. W języku C odpowiada dokładnie unsigned char. Zarówno signed char i unsigned char zajmują 8-bitów, różnica polega na interpretacji najwyższego bitu, czyli liczby ze znakiem lub bez. Sam typ char niestety nie wiadomo czy jest signed, czy unsigned - ale ew. pomyłka nie jest krytyczna. Kompilator ostrzega że typ jest inny, ale nic złego się nie dzieje.

    Biblioteka HAL jest delikatnie mówiąc przeciętna, używanie uint8_t jako typu bufora jest marnym pomysłem, ale ST potrafi produkować dobre mikorokontrolery, z programowaniem u nich gorzej. Nie pozostaje więc nic innego jak rzutować typ wskaźnika (rzutowany jest typ wskaźnika, nie same dane).

    Odbieranie po jednym bajcie jest oczywiście mało wydajne, ale nie jest błędem. Tym co było najgorsze w programie to brak miejsca na znak końca napisu, czyli '\0' - trzeba o tym pamiętać, że w języku C napisy są przechowywane z zerem na końcu. Czyli żeby zapisać łańcuch o długości 4 znaków potrzebna jest tablica o długości 5.

    • Lubię! 1

  12. 1 minutę temu, InspektorGadzet napisał:

    Może, ale

    Często tak piszą ci, którzy z Cube korzystają, wycinają z niego co trzeba i później chwalą się jakimi są fachowcami. 

    Naucz się chłopie czym się różni CubeMX od Cube - bo z cubemx raczej ciężko coś wycinać. To tylko aplikacja napisana w javie, jak Arduino IDE.

    • Nie zgadzam się! 1

  13. Potwierdzam pierwszą część, ale nie zgadzam się że jest nieodzowny 😉 Nawet z zegarami lepiej sobie poradzić bez niego, chociaż może być pomocny jako kalkulator - o ile akurat działa. A przy okazji polecam przeczytać komentarz na początku wygenerowanego przez CubeMX kodu... Prawa autorskie do pliku z funkcją main ma ST.

    • Lubię! 1

  14. Skoro piszesz tylko banalne programiki sterujące diodami to nic dziwnego, że asember nie jest ci potrzebny. Ale skąd masz dane że 98% osób na tym forum nie używa debuggera to chyba napiszesz, bo przecież nie wymyśliłeś tych danych i głupot nie piszesz, prawda?

    • Lubię! 1
    • Nie zgadzam się! 1

  15. Ja tylko wspomnę, że ARM to nie tylko Cortex-M więc to co zostało wcześniej napisane nie jest prawdą - w przypadku Cortex-M ogólnie się zgadza, ale już na Cortex-A nie. Natomiast znajomość asemblera bardzo się przydaje, chociażby podczas debugowania. Poza tym  w Cortex-A jest potrzebna przy obsłudze przerwań, ale nawet na Cortex-M kod wykonywany przed wejściem do main jest napisany w asemblerze. Natomiast poleganie na tym co ST dostarcza nie zawsze wystarcza.

    • Lubię! 1
    • Nie zgadzam się! 1

  16. @Faramir Można też po prostu przestać pisać, w końcu każdy ma prawo zmienić zdanie i może konto jeszcze się przyda. A to że forum nie jest dla każdego... coś w tym jest.

    Ja tylko zacytuję powiedzenie "Jeśli jedna osoba mówi ci że jesteś osłem to ją zignoruj, jeśli dwie osoby mówią ci ze jesteś osłem to je zignoruj. Jednak jeśli pięć osób mówi ci że jesteś osłem to idź i kup sobie siodło..." - tak do przemyślenia

    • Lubię! 3
    • Nie zgadzam się! 1
×
×
  • Utwórz nowe...