Thread View: pl.comp.lang.c
12 messages
12 total messages
Started by Maciek Godek
Tue, 22 Oct 2019 15:26
Dziwne zachowanie kodu na mikrokontrolerze
Author: Maciek Godek
Date: Tue, 22 Oct 2019 15:26
Date: Tue, 22 Oct 2019 15:26
71 lines
4215 bytes
4215 bytes
Hej, piszę program na mikrokontroler STM32 (tzn. z ARMem). W ostatnim czasie zauważyłem dość dziwne zachowanie: czasem (kiedy np. załączę do obrazu dużą tablicę z danymi) kontroler w ogóle nie wstaje. Wszystko co prawda kompiluje się i linkuje bez problemu, ale po wgraniu obrazu nastaje cisza (a w każdym razie nie odpala się nawet UART, po którym debuguję) Kompiluję przy pomocy arm-none-eabi-gcc z flagami -O3 -mcpu=cortex-m4 -mlittle-endian -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard Wywołanie arm-none-eabi-size na wygenerowanym pliku .elf daje mi build/stm32l4r9-hw3.elf : section size addr .isr_vector 448 134217728 .text 61696 134218176 .rodata 472584 134279872 .ARM.extab 0 134752456 .ARM 8 134752456 .preinit_array 0 134752464 .init_array 8 134752464 .fini_array 8 134752472 .data 1472 536870912 .bss 268452 536872384 ._user_heap_stack 1540 537140836 .ARM.attributes 48 0 .debug_info 372141 0 .debug_abbrev 41398 0 .debug_loc 179183 0 .debug_aranges 7184 0 .debug_ranges 27592 0 .debug_line 85838 0 .debug_str 39948 0 .comment 127 0 .debug_frame 28996 0 .stabstr 118 0 Total 1588789 Jeżeli się zdecyduję nie załączać tych obrazków, to firmware działa normalnie, i wówczas size wyświetla: section size addr .isr_vector 448 134217728 .text 61272 134218176 .rodata 403240 134279448 .ARM.extab 0 134682688 .ARM 8 134682688 .preinit_array 0 134682696 .init_array 8 134682696 .fini_array 8 134682704 .data 1472 536870912 .bss 268452 536872384 ._user_heap_stack 1540 537140836 .ARM.attributes 48 0 .debug_info 359303 0 .debug_abbrev 39527 0 .debug_loc 177834 0 .debug_aranges 7016 0 .debug_ranges 27480 0 .debug_line 83654 0 .debug_str 39695 0 .comment 127 0 .debug_frame 28768 0 .stabstr 118 0 Total 1500018 Zetknął się ktoś z Was z czymś podobnym? Zauważyłem też, że na tym kontrolerze podobne zachowanie (tzn. głucha cisza) występowało również wtedy, gdy przekazywałem wskaźniki na funkcje przez stos, tzn. jako parametry do innych funkcji. Zetknął się ktoś z Was z czymś podobnym? Macie pomysł, jak można to spróbować zdebugować?
Re: Dziwne zachowanie kodu na mikrokontrolerze
Author: Mateusz Viste
Date: Tue, 22 Oct 2019 15:33
Date: Tue, 22 Oct 2019 15:33
12 lines
1238 bytes
1238 bytes
2019-10-22 o 08:26 -0700, Maciek Godek napisał: > piszę program na mikrokontroler STM32 (tzn. z ARMem). > > W ostatnim czasie zauważyłem dość dziwne zachowanie: czasem (kiedy > np. załączę do obrazu dużą tablicę z danymi) kontroler w ogóle nie > wstaje. Bez wczytywania się - brzmi jak problem za małego stack. Próbowałeś może zaallokować twoją "dużą tablicę" via malloc() ? albo oflagować ją jako static? Mateusz
Re: Dziwne zachowanie kodu na mikrokontrolerze
Author: Maciek Godek
Date: Tue, 22 Oct 2019 18:30
Date: Tue, 22 Oct 2019 18:30
23 lines
3034 bytes
3034 bytes
W dniu wtorek, 22 października 2019 17:33:56 UTC+2 użytkownik Mateusz Viste napisał: > 2019-10-22 o 08:26 -0700, Maciek Godek napisał: > > piszę program na mikrokontroler STM32 (tzn. z ARMem). > > > > W ostatnim czasie zauważyłem dość dziwne zachowanie: czasem (kiedy > > np. załączę do obrazu dużą tablicę z danymi) kontroler w ogóle nie > > wstaje. > > Bez wczytywania się - brzmi jak problem za małego stack. Próbowałeś > może zaallokować twoją "dużą tablicę" via malloc() ? albo oflagować > ją jako static? Tablica jest globalna i oznaczona jako const, dlatego w całości powinna trafić do flasha (i to się zgadza z tym, co zwraca size). To zresztą zgadza się z outputem size'a - rosną przede wszystkim sekcje rodata i text. Stos raczej nie powinien być bardzo głęboki. W każdym razie różnica w samym kodzie występuje dopiero po inicjalizacji peryferiów, więc raczej bym się spodziewał że przynajmniej coś się gdzieś ruszy. Zresztą na kontrolerze mam ponad pół megabajta ramu (z czego - jak widać - zmienne globalne zajmują mniej więcej połowę) Zastanawiam się czy to może być błąd gcc - może gdzieś źle alignuje jakiś adres i dostaje jakiegoś hard faulta. Malloc nie wchodzi tu jednak w grę. Mam co prawda swój alokator, ale korzystam z niego oszczędnie. Co się da muszę trzymać we flashu, i przenoszenie tych danych do ramu nie miałoby sensu, bo one i tak się nie zmieniają.
Re: Dziwne zachowanie kodu na mikrokontrolerze
Author: heby
Date: Wed, 23 Oct 2019 18:57
Date: Wed, 23 Oct 2019 18:57
15 lines
1976 bytes
1976 bytes
On 22/10/2019 17:26, Maciek Godek wrote: > W ostatnim czasie zauważyłem dość dziwne zachowanie: czasem (kiedy np. załączę do obrazu dużą tablicę z danymi) kontroler w ogóle nie wstaje. Czas podpiąc openocd i nawet w tak gołym środowisku, po wykonaniu halt powinieneś zobaczyć gdzie siedzi i co robi z poziomu konsoli openocd. Natomiast *zdecydowanie* polecam podpięcie się do niego z gdb i razem z eclipse można wtedy mówić o debugu. To nie jest trudne. http://ardupilot.org/dev/docs/debugging-with-gdb-on-stm32.html U mnie na ten przykład podobna zagadka zakończyła się zamordowaniem w myślach idioty który w skrypcie linkera usunął sekcję odpowiedzialną za tablice wirtualne i wystawił to jako oficjalny i konsekrowany kawałek kodu. Bez debuggera walczyłbym z tym tygodniami.
Re: Dziwne zachowanie kodu na mikrokontrolerze
Author: Maciek Godek
Date: Thu, 24 Oct 2019 18:02
Date: Thu, 24 Oct 2019 18:02
26 lines
3113 bytes
3113 bytes
W dniu środa, 23 października 2019 20:57:35 UTC+2 użytkownik heby napisał: > On 22/10/2019 17:26, Maciek Godek wrote: > > W ostatnim czasie zauważyłem dość dziwne zachowanie: czasem (kiedy np. załączę do obrazu dużą tablicę z danymi) kontroler w ogóle nie wstaje. > > Czas podpiąc openocd i nawet w tak gołym środowisku, po wykonaniu halt > powinieneś zobaczyć gdzie siedzi i co robi z poziomu konsoli openocd. > > Natomiast *zdecydowanie* polecam podpięcie się do niego z gdb i razem z > eclipse można wtedy mówić o debugu. To nie jest trudne. > > http://ardupilot.org/dev/docs/debugging-with-gdb-on-stm32.html > > U mnie na ten przykład podobna zagadka zakończyła się zamordowaniem w > myślach idioty który w skrypcie linkera usunął sekcję odpowiedzialną za > tablice wirtualne i wystawił to jako oficjalny i konsekrowany kawałek > kodu. Bez debuggera walczyłbym z tym tygodniami. Z debuggerem też się trochę próbowałem bawic, ale okazało się, że to fałszywy trop. Zauważyliśmy, że problem pojawiał się wtedy, kiedy rozmiar wygenerowanego obrazu przekraczał pół megabajta. Na procku jest 1MB flasza, więc teoretycznie nie powinno to stanowić problemu. Z drugiej strony, ta pamięć jest podzielona na 2 bloki po 512 kilo. Wprawdzie cały czas nie wiem, co było przyczyną błędu, ale okazało się, że jeśli przed wgraniem obrazu wyczyści się całego flasha, to problem znika. Dlatego teraz skrypt ładujący rutynowo czyści flasha. Ale 2 dni pracy stracone.
Re: Dziwne zachowanie kodu na mikrokontrolerze
Author: heby
Date: Thu, 24 Oct 2019 18:15
Date: Thu, 24 Oct 2019 18:15
11 lines
1655 bytes
1655 bytes
On 24/10/2019 20:02, Maciek Godek wrote: > Wprawdzie cały czas nie wiem, co było przyczyną błędu, ale okazało się, że jeśli przed wgraniem obrazu wyczyści się całego flasha, to problem znika. Idę o zakład że ukryłeś buga. > Dlatego teraz skrypt ładujący rutynowo czyści flasha. > Ale 2 dni pracy stracone. Teraz będzie ich znacznie więcej :D Czyszczenie pamięci w celu usuwania bugów to bardzo, bardzo zły pomysł.
Re: Dziwne zachowanie kodu na mikrokontrolerze
Author: Maciek Godek
Date: Thu, 24 Oct 2019 18:41
Date: Thu, 24 Oct 2019 18:41
19 lines
2272 bytes
2272 bytes
W dniu czwartek, 24 października 2019 20:15:46 UTC+2 użytkownik heby napisał: > On 24/10/2019 20:02, Maciek Godek wrote: > > Wprawdzie cały czas nie wiem, co było przyczyną błędu, ale okazało się, że jeśli przed wgraniem obrazu wyczyści się całego flasha, to problem znika. > > Idę o zakład że ukryłeś buga. Skąd taki wniosek? (No, i jakiego buga?) > > Dlatego teraz skrypt ładujący rutynowo czyści flasha. > > Ale 2 dni pracy stracone. > > Teraz będzie ich znacznie więcej :D > > Czyszczenie pamięci w celu usuwania bugów to bardzo, bardzo zły pomysł. Jeżeli problem pojawiał się przez to, że obraz zajmuje więcej niż pół megabajta, to to jest raczej problem spowodowany infrastrukturą. Jeżeli problem wynika stąd, że program nie chce się wgrać na mikrokontroler, to nie ma znaczenia, co to za program.
Re: Dziwne zachowanie kodu na mikrokontrolerze
Author: heby
Date: Thu, 24 Oct 2019 19:46
Date: Thu, 24 Oct 2019 19:46
21 lines
2268 bytes
2268 bytes
On 24/10/2019 20:41, Maciek Godek wrote: >>> Wprawdzie cały czas nie wiem, co było przyczyną błędu, ale okazało się, że jeśli przed wgraniem obrazu wyczyści się całego flasha, to problem znika. >> Idę o zakład że ukryłeś buga. > Skąd taki wniosek? Z doświadczenia. > (No, i jakiego buga?) Prawdopodobnie niezainicjowana zmienna lub czytanie z uszkodzonego wskaźnika, jeśli to bug w software. Teraz czyta zera albo ff i przypadkiem działa. >> Czyszczenie pamięci w celu usuwania bugów to bardzo, bardzo zły pomysł. > Jeżeli problem pojawiał się przez to, że obraz zajmuje więcej niż pół megabajta, to to jest raczej problem spowodowany infrastrukturą. Nie wiesz do czasu aż nie znajdziesz prawdziwej przyczyny. Po prostu bym tego tak łatwo nie zostawiał. Za każdym razem kiedy ktoś mi mówi "wyczyściłem pamięci i bug zniknął" zapala mi się nie tyle czerwona lampka tylko wali tysiącem kogutów we wszystkich kolorach RGBT+.
Re: Dziwne zachowanie kodu na mikrokontrolerze
Author: Maciek Godek
Date: Thu, 24 Oct 2019 21:05
Date: Thu, 24 Oct 2019 21:05
39 lines
3431 bytes
3431 bytes
W dniu czwartek, 24 października 2019 21:46:13 UTC+2 użytkownik heby napisał: > On 24/10/2019 20:41, Maciek Godek wrote: > >>> Wprawdzie cały czas nie wiem, co było przyczyną błędu, ale okazało się, że jeśli przed wgraniem obrazu wyczyści się całego flasha, to problem znika. > >> Idę o zakład że ukryłeś buga. > > Skąd taki wniosek? > > Z doświadczenia. > > > (No, i jakiego buga?) > > Prawdopodobnie niezainicjowana zmienna lub czytanie z uszkodzonego > wskaźnika, jeśli to bug w software. Teraz czyta zera albo ff i > przypadkiem działa. Objawy są takie: Przy wgrywaniu kodu wyświetla się błąd programatora, że jakiś adres jest źle zapisany. Podaj mi choć jedną hipotetyczną sytuację, w której taki błąd mógłby być spowodowany kodem programu. Na ile rozumiem, podczas wgrywania obrazu program jest zatrzymany. W przeciwnym razie każde wgrywanie obrazu generowałoby całe zoo niezdefiniowanych zachowań. (Ale mogę być w błędzie, bo nigdy nie analizowałem tego procesu) > >> Czyszczenie pamięci w celu usuwania bugów to bardzo, bardzo zły pomysł. > > Jeżeli problem pojawiał się przez to, że obraz zajmuje więcej niż pół megabajta, to to jest raczej problem spowodowany infrastrukturą. > > Nie wiesz do czasu aż nie znajdziesz prawdziwej przyczyny. To prawda. Ale raczej nie znajdę, jeśli nie będę miał dobrej hipotezy. > Po prostu bym tego tak łatwo nie zostawiał. Za każdym razem kiedy ktoś > mi mówi "wyczyściłem pamięci i bug zniknął" zapala mi się nie tyle > czerwona lampka tylko wali tysiącem kogutów we wszystkich kolorach RGBT+. Tyle że 'bug' oznacza zazwyczaj zachowanie kodu. Tutaj oznacza raczej zachowanie infrastruktury. Żeby nie było, temat drążę i kontaktuję się w tej sprawie z przedstawicielami ST. Może się uda wyjaśnić.
Re: Dziwne zachowanie kodu na mikrokontrolerze
Author: heby
Date: Sat, 26 Oct 2019 09:59
Date: Sat, 26 Oct 2019 09:59
13 lines
1741 bytes
1741 bytes
On 24/10/2019 23:05, Maciek Godek wrote: > Przy wgrywaniu kodu wyświetla się błąd programatora, że jakiś adres jest źle zapisany. Nieprawda. Napisałeś: "Wszystko co prawda kompiluje się i linkuje bez problemu, ale po wgraniu obrazu nastaje cisza" Do tego się odnoszę. Jeśli teraz zeznana się inne to moje uwagi się do tego nie odnoszą.
Re: Dziwne zachowanie kodu na mikrokontrolerze
Author: Maciek Godek
Date: Sat, 26 Oct 2019 12:57
Date: Sat, 26 Oct 2019 12:57
29 lines
2964 bytes
2964 bytes
W dniu sobota, 26 października 2019 11:59:15 UTC+2 użytkownik heby napisał: > On 24/10/2019 23:05, Maciek Godek wrote: > > Przy wgrywaniu kodu wyświetla się błąd programatora, że jakiś adres jest źle zapisany. > > Nieprawda. Jaka nieprawda? > Napisałeś: > > "Wszystko co prawda kompiluje się i linkuje bez problemu, ale po wgraniu > obrazu nastaje cisza" > > Do tego się odnoszę. > > Jeśli teraz zeznana się inne to moje uwagi się do tego nie odnoszą. Zeznania są o tyle 'inne', że są pełniejsze. Kompilacja i linkowanie przebiegały bez problemu. Obraz wgrywałem przy pomocy st-link_cli i nie zauważyłem błędu. (Co nie znaczy, że go nie było) Pewnie wyniknęło to po części z tego, że program CLI nie zwraca kodu błędu do systemu (wywoływałem go przez makefile'a, który wypisuje komunikat błędu, gdy użyte narzędzie zwróci do systemu wartość niezerową) Jak wgrałem przez narzędzie GUI, wyskoczył pop-up. Jak wyczyściłem flasza i wgrałem, pop-up nie wyskoczył. I tyle. Nadal nie wiem, dlaczego programatorowi nie udaje się wgrać obrazu bez czyszczenia całego flesza
Re: Dziwne zachowanie kodu na mikrokontrolerze
Author: Piotr Gałka
Date: Mon, 28 Oct 2019 08:02
Date: Mon, 28 Oct 2019 08:02
25 lines
2686 bytes
2686 bytes
W dniu 2019-10-26 o 14:57, Maciek Godek pisze: > Nadal nie wiem, dlaczego programatorowi nie udaje się wgrać obrazu bez czyszczenia całego flesza Programy do urządzeń wrzucamy z programu produkcyjnego za pośrednictwem prowizorycznie zrobionego programatora (drutowana przeróbka jakiejś płytki), który, jak każda prowizorka, działa już lata (chyba ponad 10). Mieliśmy taki problem, że czasem trzeba było programowanie przepuścić 2 razy, aby było skuteczne (za pierwszym razem EEPROM się nie kasował). Problem występował tylko u nas (w biurze konstrukcyjnym) i tylko czasem a nigdy na produkcji więc nie było silnej determinacji aby go szukać. OIDP się okazało, że Clear-All (mimo swojej nazwy) nie czyści wszystkiego gdy fuse bit zabezpieczający EEPROM przed modyfikacją jest ustawiony. Chyba nie wynikało to jasno z opisu. Może w oprogramowaniu Twojego programatora jest błąd i np. kasuje tylko pierwszy bank flash. Może gdy procesory były mniejsze i miały tylko jeden bank to była jakaś funkcja clear-all i programator ją wywołuje, a jak dołożyli drugi to może autor oprogramowania programatora rozszerzył tylko adresy zakresu programowania a nie zauważył, że teraz już clear-all nie czyści wszystkiego a tylko pierwszy bank, a dla drugiego trzeba zawołać jakąś nową funkcję. P.G.
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads