logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[stm32] debugowanie, resume i program ląduje w Default_Handler

qczek 12 Wrz 2011 15:25 4747 29
REKLAMA
  • #1 9919363
    qczek
    Poziom 14  
    Posty: 148
    Pomógł: 1
    Ocena: 1
    Witajcie,
    Mam taki mały problemik polegający na tym, że procek w czasie debugowania po naciśnięciu resume, zamiast zatrzymać się na następnym breaku ląduje w Default_Handler....

    Używam eclipsa + CodeSourcery + openocd 0.5.0 do tego programator od Frediego, chip to STM32F103Vx.

    openocd uruchamiam z parametrami
    
    -f interface/jtagkey.cfg -f target/stm32f1x.cfg
    


    natomiast samo debugowaie ...
    
    monitor reset
    monitor halt
    load "C:\\Users\\kku\\Documents\\elektronika\\my_projects\\_ARM\\qczek_controller\\Debug\\qczek_controller.elf"
    file  "C:\\Users\\kku\\Documents\\elektronika\\my_projects\\_ARM\\qczek_controller\\Debug\\qczek_controller.elf"
    tbreak main
    continue
    


    program zatrzymuje się na main, niemniej opencd sypie błędami
    
    pen On-Chip Debugger 0.5.0 (2011-08-09-23:21)
    Licensed under GNU GPL v2
    For bug reports, read
    	http://openocd.berlios.de/doc/doxygen/bugs.html
    Info : only one transport option; autoselect 'jtag'
    1000 kHz
    adapter_nsrst_delay: 100
    jtag_ntrst_delay: 100
    cortex_m3 reset_config sysresetreq
    Info : clock speed 1000 kHz
    Info : JTAG tap: stm32.cpu tap/device found: 0x3ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x3)
    Info : JTAG tap: stm32.bs tap/device found: 0x06414041 (mfg: 0x020, part: 0x6414, ver: 0x0)
    Info : stm32.cpu: hardware has 6 breakpoints, 4 watchpoints
    Info : accepting 'gdb' connection from 3333
    Info : device id = 0x10016414
    Info : flash size = 512kbytes
    Warn : acknowledgment received, but no packet pending
    undefined debug reason 6 - target needs reset
    Info : JTAG tap: stm32.cpu tap/device found: 0x3ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x3)
    Info : JTAG tap: stm32.bs tap/device found: 0x06414041 (mfg: 0x020, part: 0x6414, ver: 0x0)
    target state: halted
    target halted due to debug-request, current mode: Thread 
    xPSR: 0x81000000 pc: 0x08004f40 psp: 0x2000190c
    Error: JTAG-DP STICKY ERROR
    Error: MEM_AP_CSW 0x23000052, MEM_AP_TAR 0x1800304
    Error: JTAG-DP STICKY ERROR
    Error: MEM_AP_CSW 0x23000052, MEM_AP_TAR 0x1800304
    Warn : Block read error address 0x1800300
    Error: JTAG-DP STICKY ERROR
    Error: MEM_AP_CSW 0x23000050, MEM_AP_TAR 0x5b452804
    Error: JTAG-DP STICKY ERROR
    Error: MEM_AP_CSW 0x23000052, MEM_AP_TAR 0x6000c04
    Error: JTAG-DP STICKY ERROR
    Error: MEM_AP_CSW 0x23000052, MEM_AP_TAR 0x6000c04
    Warn : Block read error address 0x6000c00
    Error: JTAG-DP STICKY ERROR
    Error: MEM_AP_CSW 0x23000050, MEM_AP_TAR 0x5b452804
    


    potem po resume, tak jak napisałem wskakuje w default handler...
    Z góry dziękuje za pomoc
    Krzysiek
  • REKLAMA
  • #3 9920842
    qczek
    Poziom 14  
    Posty: 148
    Pomógł: 1
    Ocena: 1
    No rozważyłem problem w kodzie i doszedłem do tego ze problem jest spowodowany w jakiś sposób działaniem funkcji USART_Init.
    Generalnie konfiguruje w ramach jakiś tam inicjalizacji systemu konfiguruje sobie port

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    No i wszystko pięknie, niemniej jak wejdę do USART_Init, i wykonuje ją krokowo do ostatniej instrukcji, i potem jak dam step over to procek skacze do default handlera. Na obrazku wygląda to tak

    [stm32] debugowanie, resume i program ląduje w Default_Handler

    Zupełnie nie znam się na asmblerze ARMA (znam jedynie z zamierzchłych czasów asemblera na 6502 :), ale może ta funkcja jakoś stos/wskaźnik stosu "narusza" ....

    pozdrawiam
    Krzysiek


    PS
    Dodam, że bez debugowania wszystko hula świetnie....
  • #5 9921241
    qczek
    Poziom 14  
    Posty: 148
    Pomógł: 1
    Ocena: 1
    Co znaczy zbyt mały, czy 1024 bajty to za mało?
    Używam twojego (jakiegoś może nie najnowszego) skryptu linkera...
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    pozdro
    Krzysiek
  • #6 9921372
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    1kB może być zbyt mały przy bardzo rozbudowanych projektach, a my wciąż nie wiemy czym sprawdzasz problem. Zasadniczo należy dojść do najmniejszego kodu powodującego problem.

    A używasz jakichś przerwań?

    4\/3!!
  • #7 9921480
    qczek
    Poziom 14  
    Posty: 148
    Pomógł: 1
    Ocena: 1
    Ustawiłem stos najpierw na 2k, potem na 4k bez zmian....
    Przerwań używam (a także FSMC, ADC, TIMERÓW, i2C, SPI...), niemniej problem pojawia się na samym początku...
    Moja funkcja main wygląda tak
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    I właśnie w Do_System_Config robię inicjalizację portu...

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Nawet jak przesunę USART_Config() do góry zaraz po RCC_Conf() to jest to samo....

    Pozdro
    Krzysiek

    Dodano po 14 [minuty]:

    Co więcej, po wywaleniu USART_Config, program taki sam problem występuje tylko trochę dalej, najczęściej w SPI_Init, ale czasami da się przejść go i wtedy wysypuje się w zupełnie niezależnym od hardwaru kawałku kodu...
  • #8 9921570
    michalko12
    Specjalista - Mikrokontrolery
    Posty: 3394
    Pomógł: 462
    Ocena: 321
    Masz debugger to sprawdź jaką wartość ma IPSR. Będziesz wiedział które przerwanie powoduje wywołanie Default_Handler(). W NVICu też są rejestry które dużo mówią o stanie procesora. Sprawdź stos - ostatnie 8 dword-ów będzie wiadomo w którym momencie zostało wywołane przerwanie (PC)
  • REKLAMA
  • #9 9922008
    qczek
    Poziom 14  
    Posty: 148
    Pomógł: 1
    Ocena: 1
    Dzięki,
    Jeśli mógłbym prosić o odpowiedź na kilka pytań, to było by fajnie
    1) Czy IPSR odczytujemy z CPSR, jeśli tak to ma on wartość
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Czyli bit 0 - Thread mode, 1 - Reserved, 5- SVCall, a reszta (n+16) to 63 = Reserved.
    Jeśli oczywiście dobrze to interpretuje.

    2) Teraz stos, nie mogę znaleźć nigdzie w IDE jakiegoś ludzkiego podglądu, ale domyślam się, że rejestr SP pokazuje na stos.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Teraz pytanie, czy czy w stm32 stos rośnie do góry czy w dół...
    w każdym razie pamięć w tych okolicach wygląda tak
    [stm32] debugowanie, resume i program ląduje w Default_Handler
    No i teraz zastanawiam się gdzie jest adres powrotu, ale jakoś nie widzę :(

    Pozdrawiam
    Krzysiek

    Dodano po 10 [minuty]:

    Zrobiłem jeszcze jeden myk, a mianowicie default handler zmieniłem na

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    No i teraz jak mi się już tam wejdzie, to zatrzymuje debugerem, zmieniam wartośc i na 0 i dawaj dalej..
    Okazuje się że program wraca do funkcji RCC_GetClocksFreq, dokładnie pod jej koniec

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    niemniej już próba wyjścia z tej funkcji, za każdym razem powoduje wywołanie default handlera, czyli stos jest zwalony....
  • #10 9922325
    michalko12
    Specjalista - Mikrokontrolery
    Posty: 3394
    Pomógł: 462
    Ocena: 321
    Nie wygląda wcale na to że stos jest zwalony tylko, że masz cały czas aktywne źródło przerwania. Z CPSR wynika że masz wywoływany 35 wektor czyli 19 IRQ. Sprawdź co to za przerwanie i szukaj miejsca gdzie je włączyłeś być może nieswiadomie. Dla pewności dodaj obsługę 19 IRQ i sprawdź czy to ona jest wywoływana zamiast Defaut_Handlera().


    A co do stosu
    [stm32] debugowanie, resume i program ląduje w Default_Handler

    Jeśli w Default_Handlerze() stos nie jest rezerwowany na zmienne to stos trzeba tak odczytywać

    0x20002160 - r0 - 0x2000216c ( na obrazku jest big endian stąd te przestawienie)
    0x20002164 - r1 - 0x00000000
    0x20002168 - r2 - 0xFFFFFFFD
    0x2000216C - r3 - 0xB5E645A0
    0x20002170 - r12 -0x80115553
    0x20002174 - LR(R14) - 89303A08
    0x20002178 - PC(R15) - 0x9FAEAB9B
    0x2000217c - xPSR - 0x15783D4E

    Patrząc na PC nie są to poprawne wartości, ale nie wiadomo czy kompilator nie przydzielił stosu na zmienne.
    Można to stwierdzić po zdeasemblowaniu Defaul_Handlera();
  • #11 9922459
    qczek
    Poziom 14  
    Posty: 148
    Pomógł: 1
    Ocena: 1
    Chyba masz rację.
    W tabelce vectors na 35 pozycji jest pointer do funkcji ADC1_2_IRQHandler.
    Zdefiniowałem ją tak

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Niemniej dalej zatrzymuje się w default handler a a nie w niej.

    Wyłączyłem natomiast konfiguracje przetworników ADC która wygląda tak
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    i to pomogło, teraz nie wali mi do default handlera (niemniej to nie rozwiązuje problemu...)

    Próbowałem także wyłączyć przerwania od adc dodając
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    przed
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    niemniej nic to nie daje...

    Mam pytanko, co źle robię...


    Pozdrawiam
    Krzysiek
  • REKLAMA
  • #12 9922502
    michalko12
    Specjalista - Mikrokontrolery
    Posty: 3394
    Pomógł: 462
    Ocena: 321
    Spróbuj te przerwanie wyłączyć w NVICu, a nie w ADC.

    Wychodzą znowu kwiatki przy używaniu tej biblioteki. Nie wiadomo co tak naprawdę dzieje się w programie i trudno szukać błędów.

    Dodano po 7 [minuty]:

    qczek napisał:
    W tabelce vectors na 35 pozycji jest pointer do funkcji ADC1_2_IRQHandler.


    Patrzę na dokumentację i z tego co mi wychodzi to jest 34 wektor a nie 35. Pozycja może i 35 licząc od 1, ale wektory liczy się od 0, a IPSR wskazuje na 35.

    Dodano po 14 [minuty]:

    Weź pod uwagę, że IRQ0 czyli przerwanie od WWDG w IPSR określane jest jako 16 czyli teoretycznie wektor 35 powinien tyczyć się albo USB albo CAN.

    Chyba, że sam gdzieś się rypnąłem i gadam od rzeczy.
  • #13 9922703
    qczek
    Poziom 14  
    Posty: 148
    Pomógł: 1
    Ocena: 1
    próbowałem wobec tego zrobić funkcję dla USB_HP_CAN_TX_IRQHandler niemniej bez rezultatu. W odruchy bezsilności zdefiniowałem jeszcze dla
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    niemniej dalej nic...

    próbowałem zablować przerwanie 19 w ten sposób
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    niemniej to także nic nie dało...

    Napisz mi proszę jeszcze z kąd bierzesz informację że pozcyja wektor 35 to przerwanie 19? gdzie to jest w RM00008?

    pozdrawiam
    Krzysiek
  • #14 9922809
    michalko12
    Specjalista - Mikrokontrolery
    Posty: 3394
    Pomógł: 462
    Ocena: 321
    Wszystko masz w Cortex™-M3 Technical Reference Manual. W RM0008 w sekcji Interrupts and events masz numery IRQ.

    Odczytaj jeszcze rejestr NVIC:

    Interrupt Control State Register (0xE000ED04)
    Interrupt Set-Pending Register (0xE000E200-0xE000E21C)

    oczywiście po zatrzymaniu w Default_Handler()
  • #15 9922926
    qczek
    Poziom 14  
    Posty: 148
    Pomógł: 1
    Ocena: 1
    michalko12 napisał:
    Wszystko masz w Cortex™-M3 Technical Reference Manual. W RM0008 w sekcji Interrupts and events masz numery IRQ.

    Odczytaj jeszcze rejestr NVIC:

    Interrupt Control State Register (0xE000ED04)
    Interrupt Set-Pending Register (0xE000E200-0xE000E21C)

    oczywiście po zatrzymaniu w Default_Handler()


    W RM0008 trochę nie rozumiem tych tabelek (np tab 60), czym jest kolumna possition i priority... nieważne doczytam.

    co do rejestrów
    0xE000ED04 = 411FC231 (przełożone juz na low endian) czyli 1000001000111111100001000110001
    z tego chyba wynika że active ISR no jest 49 ????

    teraz 0xE000E200-0xE000E21C - wszędzie 0....

    pozdrawiam
    krzysiek
  • #16 9923087
    michalko12
    Specjalista - Mikrokontrolery
    Posty: 3394
    Pomógł: 462
    Ocena: 321
    qczek napisał:
    0xE000ED04 = 411FC231 (przełożone juz na low endian) czyli 1000001000111111100001000110001


    Te wartości też są jakieś nienormalne chodzi mi tu o VECTPENDING = 508
    1000001000111111100001000110001

    Nie wiem czy to dobrze odczytujesz
  • REKLAMA
  • #17 9923116
    qczek
    Poziom 14  
    Posty: 148
    Pomógł: 1
    Ocena: 1
    sorrki, zrypałem coś.
    wygląda to tak, tylko nie wiem czy on teraz pokazuje low endian czy big endia czy jak to inczej interpretować....

    [stm32] debugowanie, resume i program ląduje w Default_Handler
  • #18 9923327
    michalko12
    Specjalista - Mikrokontrolery
    Posty: 3394
    Pomógł: 462
    Ocena: 321
    Odczytaj ten rejestr jeszcze przed wejście do DH().
  • #19 9924615
    qczek
    Poziom 14  
    Posty: 148
    Pomógł: 1
    Ocena: 1
    nie wiem czy o to Ci chodziło, niemniej dochodzę do takiego momentu w którym się to najczęściej wywala
    [stm32] debugowanie, resume i program ląduje w Default_Handler

    potem step into i jestem tutaj
    [stm32] debugowanie, resume i program ląduje w Default_Handler

    kolejne step into nie działają już, tzn musze dać susspend zeby zatrzymać się w dh...

    wywala mi także od czasu do czasu błedy "stm32.cpu -- clearing lockup after double fault"....

    pozdro
    Krzysiek
  • #20 9925185
    michalko12
    Specjalista - Mikrokontrolery
    Posty: 3394
    Pomógł: 462
    Ocena: 321
    Z Vector Table Offset Register (0xE000ED08) = 0x08000000 wynika, że wartości wyświetlane są w LE.

    Z kolei z 0xE000ED08 wynika, że procesor wchodzi w Hard Fault. Masz oddzielny wektor dla Hard Fault?
  • #21 9926241
    qczek
    Poziom 14  
    Posty: 148
    Pomógł: 1
    Ocena: 1
    Hej,
    No nie mam HardFault_Handler :(
    Jak wrócę jutro do domu to dorobię....
    A jakie masz podejrzenia?
    Pozdrawiam
    Krzysiek
  • #22 9931341
    qczek
    Poziom 14  
    Posty: 148
    Pomógł: 1
    Ocena: 1
    Sprawdziłem i faktycznie wchodzi w HardFault...

    W dodatku przy debugowaniu wysypują się jescze takie błedy

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    albo inna akcja, cały czas wykonuje tą linie, daje step over a on z uporem maniaka to samo...
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    przy tym wywala
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    generalnie, teraz to jest wszystko tak niedeterministyczne że szok...
    pozdrawiam
    Krzysiek

    stm32.cpu -- clearing lockup after double fault
  • #23 9931620
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    Generalnie jak wyskakuje Ci double fault, to raczej możesz w debuggerze klikać co chcesz, sesja debuggowania jest "zepsuta" - to tak jakbyś wcisnął podczas debuggowania reset.

    4\/3!!
  • #24 9931652
    michalko12
    Specjalista - Mikrokontrolery
    Posty: 3394
    Pomógł: 462
    Ocena: 321
    W NVICu masz ustawione 2 flagi - IMPRECISERR i INVSTATE
    Mnie to wygląda na niestabilna pracę uC, ale nie jestem tego pewny.
    Sprawdź dokładnie konfigurację RCC i FLASH_ACR
  • #25 9931947
    nsvinc
    Poziom 35  
    Posty: 2870
    Pomógł: 262
    Ocena: 88
    IMPRECISERR
    Imprecise bus error due to an explicit
    memory access. The Bus Fault
    Address Register is not written by this
    fault.

    Wniosek? Nie ma "niestabilnej" pracy procesora, tylko jest standardowy zonk z dostępem do pamięci...

    INVSTATE
    Attempt to execute in an invalid EPSR
    state (e.g. after a BX type instruction
    has changed state). This includes state
    change after entry to or return from
    exception, as well as from
    inter-working instructions.

    Z tym już gorzej, zdawałoby się, że wykonuje się kod który próbuje się np. przełączyć z trybu Thumb na ARM i wykonać instrukcję...

    Biorąc te dwa razem, można sądzić, że w samym kodzie jest krzak, ewentualnie jest lekko walnięty flash...
  • #26 9932063
    qczek
    Poziom 14  
    Posty: 148
    Pomógł: 1
    Ocena: 1
    Panowie,
    A czy to nie jest jakieś dziwne, że problem wystepuje tylko przy debugowaniu?
    może coś sam projekt hw jest walnięty (sprawdzałem na dwóch egzemplarzach tego kitu i to samo).
    schemat

    Jeśli chodzi o konfigurację rcc i flasha to wygląda ona tak
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    pozdrawiam
    Krzysiek
  • #27 9934271
    qczek
    Poziom 14  
    Posty: 148
    Pomógł: 1
    Ocena: 1
    Problem się rozwiązał poprzez zmianę
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    ktoś wie dlaczego tak jest ?
    pozdrawiam
    krzysiek
  • #28 9934798
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    Bo po "monitor reset" Twój układ przez nieokreślony czas może sobie robić co chce, zanim wydasz mu polecenie "monitor halt". Swoją drogą setki razy już pisałem, żeby używać "reset halt"...

    4\/3!!
  • #29 9934824
    gaskoin
    Poziom 38  
    Posty: 4159
    Pomógł: 436
    Ocena: 102
    Masz za wolny debugger :)
  • #30 9935093
    qczek
    Poziom 14  
    Posty: 148
    Pomógł: 1
    Ocena: 1
    dzięki w każdym razie za pomoc
    Pozdrawiam
    Krzysiek

Podsumowanie tematu

✨ Użytkownik napotkał problem podczas debugowania programu na mikrokontrolerze STM32F103Vx, gdzie po naciśnięciu resume program lądował w Default_Handler. Po analizie kodu, zidentyfikowano, że problem może być związany z funkcją USART_Init oraz zbyt małym stosem. Użytkownik próbował zwiększyć rozmiar stosu, ale problem nadal występował. W trakcie debugowania pojawiały się błędy związane z przerwaniami, a także z dostępem do pamięci. Ostatecznie rozwiązanie problemu polegało na zmianie sekwencji poleceń w OpenOCD z "monitor reset" na "monitor reset halt", co zapobiegło nieprzewidywalnemu zachowaniu układu po resecie.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA