Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

stm32f1 eclipse openOCD - podczas debugu od razu wchodzi do Default_Handler

mijadzi 12 Jan 2016 14:15 2658 51
Computer Controls
  • #1
    mijadzi
    Level 10  
    Witajcie.

    Mam taki problem.
    Jest napisany program i działa na uC(także kod jest chyba w pożadku) ale jak chce uruchomić debug przez openOCD to od razu wchodzi mi w:

    Code:
    /* Domyślna procedura obsługi przerwania - nieoczekiwane
    
       przerwanie zawiesza mikrokontroler. */
    static void Default_Handler(void) {
      for (;;);
    }


    Przypuszczam że projekt się źle kompiluje do debugowania.

    Używam eclipse + GNU Tools for ARM Embedded Processors (arm-none-eabi-gcc) + OpenOCD.

    pokazuje niektóre ustawienia kompilacji.

    stm32f1 eclipse openOCD - podczas debugu od razu wchodzi do Default_Handler

    Nie wiem co może być nie tak.
    Proszę o pomoc:)
    Kamery 3D Time of Flight - zastosowania w przemyśle. Darmowe szkolenie 16.12.2021r. g. 10.00 Zarejestruj się
  • Computer Controls
  • #4
    mijadzi
    Level 10  
    Widzę że dosyć cich.
    dorzucam jeszcze skrypt linkera i startup.

    nawet mam brakepointa w void Reset_Handler(void) i w niego nie wchodzi.
    ale na brakepointa w Default_Handler reaguje.
    Zanaczam że jak wgram program na mikrokontlorer to działa bez zarzutu...

    Code: c
    Log in, to see the code
  • #5
    Freddie Chopin
    MCUs specialist
    Ja mam odpowiedź, ale ona może Ci się nie do końca spodobać... Na mojej stronie znajdziesz przykładowy projekt dla STM32F107, wraz ze startupem, skryptem linkera, tablicą wektorów i plikiem Makefile. Całość na pewno działa, tyle że nie korzysta z w tyczki której Ty używasz w Eclipse.
  • #6
    mijadzi
    Level 10  
    o jakiej wtyczce mówisz?
  • #8
    mijadzi
    Level 10  
    Próbuje od wczoraj dostosować mój projekt do twojego makefila.
    Dodałem includy do INC_DIRS i do SRCS_DIRS dodałem foldery z plikami .c, ale cały czas linker mówi ze nie odnajduje definicji funkcji które są w tych includach. Te dojście do plików .h musze gdzieś jeszcze dodać oprócz INC_DIRS?
  • Computer Controls
  • #9
    Freddie Chopin
    MCUs specialist
    1. Pokaż konkretny błąd jaki wyświetla się w konsoli.
    2. Zacznij na początek od uruchomienia projektu i debuggowania, potem dodawaj kolejne funkcjonalności.
    3. Zerknij do tego artykułu - http://www.freddiechopin.info/pl/artykuly/35-...-stm32-stm32f10x-standard-peripherals-library
  • #10
    mijadzi
    Level 10  
    dzięki za artykuł, dzięki niemu dodałem odpowiednie rzeczy do CXX_DEFS i C_DEFS których wcześniej nie dodałem.

    Ale problem pozostał ten sam.

    zmieniony makefile:
    Code: c
    Log in, to see the code


    kompilacja:
    Code: actionscript
    Log in, to see the code


    Poniżej przedstawiam orientacyjnie jak mam pliki porozkładane w folderach:
    stm32f1 eclipse openOCD - podczas debugu od razu wchodzi do Default_Handler
  • #12
    mijadzi
    Level 10  
    no racja ścieżki bez cudzysłowów powinny być:)
    Już prawie się skąpilowało:)

    wyskoczyło mi jeszcze takie cos:
    Code:
    Compiling file: ./lwip-1.4.0/src/netif/slipif.c
    
    arm-none-eabi-gcc -c -mcpu=cortex-m3 -mthumb -O0 -ffunction-sections -fdata-sections -Wall -Wextra -std=gnu89 -g -ggdb3 -fverbose-asm -Wa,-ahlms=out/slipif.lst -DSTM32F10X_CL -DUSE_STDPERIPH_DRIVER -DHSE_VALUE=8000000  -DSystemInit=low_level_init_1 -MD -MP -MF out/slipif.d -I.  -I./include  -I./include/eth  -I./objdict  -I./include/CANFestival  -I./include/CANFestival/CanFestival  -I./st/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x  -I./st/Libraries/CMSIS/CM3/CoreSupport  -I./st/Libraries/STM32_ETH_Driver/inc  -I./st/Libraries/STM32F10x_StdPeriph_Driver/inc  -I./lwip-1.4.0/src/include  -I./lwip-1.4.0/src/include/ipv4 ./lwip-1.4.0/src/netif/slipif.c -o out/slipif.o
     
    Linking target: out/waga_przep_eth.elf
    arm-none-eabi-g++ -mcpu=cortex-m3 -mthumb -TSTM32F103RC_rom.ld -g -Wl,-Map=out/waga_przep_eth.map,--cref,--no-warn-mismatch -Wl,--gc-sections -nostartfiles  out/startup.o out/main.o out/vectors.o out/ai.o out/backup.o out/bt.o out/can.o out/canopen.o out/di.o out/dipSwitch.o out/eeprom.o out/eth.o out/eth_eth.o out/led.o out/lwip_eth.o out/program.o out/relay.o out/stm32f10x_it.o out/ti.o out/timer_can.o out/timer_eth.o out/uart.o out/dcf.o out/emcy.o out/lifegrd.o out/lss.o out/nmtMaster.o out/nmtSlave.o out/objacces.o out/pdo.o out/sdo.o out/states.o out/symbols.o out/sync.o out/timer.o out/system_stm32f10x.o out/core_cm3.o out/stm32_eth.o out/misc.o out/stm32f10x_adc.o out/stm32f10x_bkp.o out/stm32f10x_can.o out/stm32f10x_cec.o out/stm32f10x_crc.o out/stm32f10x_dac.o out/stm32f10x_dbgmcu.o out/stm32f10x_dma.o out/stm32f10x_exti.o out/stm32f10x_flash.o out/stm32f10x_fsmc.o out/stm32f10x_gpio.o out/stm32f10x_i2c.o out/stm32f10x_iwdg.o out/stm32f10x_pwr.o out/stm32f10x_rcc.o out/stm32f10x_rtc.o out/stm32f10x_sdio.o out/stm32f10x_spi.o out/stm32f10x_tim.o out/stm32f10x_usart.o out/stm32f10x_wwdg.o out/def.o out/dhcp.o out/dns.o out/init.o out/mem.o out/memp.o out/netif.o out/pbuf.o out/raw.o out/stats.o out/sys.o out/tcp.o out/tcp_in.o out/tcp_out.o out/timers.o out/udp.o out/autoip.o out/icmp.o out/igmp.o out/inet.o out/inet_chksum.o out/ip.o out/ip_addr.o out/ip_frag.o out/etharp.o out/ethernetif.o out/slipif.o    -o out/waga_przep_eth.elf
    c:/arm/bet/gcc-arm-none-eabi-4_8-131228/bin/../lib/gcc/arm-none-eabi/4.8.3/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-sbrkr.o): In function `_sbrk_r':
    /home/freddie/bleeding-edge-toolchain/src/newlib/newlib/libc/reent/sbrkr.c:58: undefined reference to `_sbrk'
    collect2.exe: error: ld returned 1 exit status
    make: *** [out/waga_przep_eth.elf] Error 1

    16:54:12 Build Finished (took 56s.510ms)


    ta linijka mnie zastanawia:
    /home/freddie/bleeding-edge-toolchain/src/newlib/newlib/libc/reent/sbrkr.c:58
  • #13
    polprzewodnikowy
    Level 26  
    Nie masz syscallsów, ściągnij je ze strony Freddiego.
  • #14
    mijadzi
    Level 10  
    Dziękuję polprzewodnikowy i Freddie Chopin.
    Wszystko ładnie się skąpilowało.
    Debuger też ładnie działa.
    No i mam fajny makefile i startup dla następnych projektów na stmie:)

    Dzięki za pomoc.
    Temat zamknięty.
  • #15
    mijadzi
    Level 10  
    Witam ponownie.

    Mam jeszcze pytanie.
    Ponieważ chciałem dodać obsługę:
    ETH_WKUP_IRQHandler i ETH_IRQn.

    Więc w pliku vaectors.c dodałem takie linijki:
    Code: c
    Log in, to see the code

    i
    Code: c
    Log in, to see the code


    Oczywiście w innych plikach dodałem obsługę tych wyjątków.
    Czy dobrze dodałem do tablicy wektorów przerwań te przerwania czy jakoś innaczej się to robi? Bo przyznaje ze mi cos nie działą:( tzn. raz mi wchodzi w HardFault_Handler raz w __Default_Handler a jeszcze innym razem wchodzi do ETH_WKUP_IRQHandler ale nie może rozpoznać że własnie to przerwanie wystąpiło(if(EXTI_GetITStatus(EXTI_Line19) != RESET)). Więc ogólnie dziwacznie działa.

    poniżej cały plik vectors.c:
    Code: c
    Log in, to see the code


    Czy moze jeszcze w jakimś pliku powinienem coś zmienić?
  • #19
    mijadzi
    Level 10  
    Dzięki za szybką odpowiedź.

    Ściągnąłem odpowiednią wersję vectors.c

    Ale nadal wchodzi mi w HardFault_Handler w szczególnym miejscu w kodzie.

    Jeśli debuguje krokowo, linijka po linijce w c, to wchodzi w HardFault_Handler (chodzi o miejsce w którym skacze do innej funkcji)
    Jeśli to samo miejsce debuguje krokowo, linijka po linijka w asemblerze, to przechodzi wszystko gładko.

    O czym to może świadczyć?
  • #21
    mijadzi
    Level 10  
    No wiec tak, te dwie rzeczy są takie same w obu twoich przykładach i ich nie zmieniałem:
    __main_stack_size = 0;
    __process_stack_size = 1024;

    Przedstawiam poniżej to co teraz mam w moim projekcie:
    STM32F103RC_rom.ld
    Code: c
    Log in, to see the code


    startup.S
    Code: armasm
    Log in, to see the code


    vectors.c
    Code: c
    Log in, to see the code


    makefile:
    Code: c
    Log in, to see the code


    a dokładnie posiadam uC: STM32F107RCT6
  • #22
    grko
    Level 33  
    __main_stack_size = 0; -> stos przerwań, jak chcesz ich używać to ustaw tutaj jakąś sensowną wartość
  • #23
    mijadzi
    Level 10  
    /* Handler mode (core exceptions / interrupts) can use only main stack */
    /* Thread mode can use main stack (default) or process stack - selected in CONTROL special register */

    To nie znaczy że później gdzieś jest ustawione aby używał __process_stack_size?

    Ale możemy spróbować. To rozumiem że mam ustawić tak?
    __main_stack_size = 1024;
    __process_stack_size = 1024;
  • Helpful post
    #24
    grko
    Level 33  
    Tak. Możesz to tak ustawić. Przykłady Freddiego korzystają z obu stosów. Process stack -> kontekst aplikacji, main stack - > kontekst przerwania.
  • #26
    mijadzi
    Level 10  
    Skrypty linkera w stm32_blink_led-1.2.1-120107 i w stm32cl_blink_led-1.2.1-120107 są identyczne. Różnią się tylko wielkością ram, a i tak ram i rom musiałem przystosować do siebie.

    Ogólnie dzięki.
    Linijka:
    __main_stack_size = 1024;
    rozwiązała sprawę.

    Swoją drogą nie rozumiem czemu w przykładach jest podane:
    __main_stack_size = 0;
    Mam jeden strzał:
    Jest tak podane ponieważ w przykładzie migania diodkami nie używa się żadnego przerwania?
  • #28
    mijadzi
    Level 10  
    Odgrzewam stary temat.
    Kod się rozbudowuje i zaczyna mi brakować miejsca w ramie i flash. Chciałbym trochę zoptymalizować kod. Jak najlepiej określić:
    __main_stack_size i __process_stack_size.
    Można jakoś te wielkości obliczyć na podstawie kodu?
  • #29
    grko
    Level 33  
    W skrócie, nie możesz tego dokładnie oszacować. Możesz jedenie zgrubnie obliczyć ile powinny wynosić te wartości. W pierwszej kolejności szukałbym osczędności w innych miejscach. Jakie masz aktualne ustawiania stosów?
  • #30
    Freddie Chopin
    MCUs specialist
    W nowszych wersjach przykładów wszystkie stosy były zerowane, a wiec po "dłuższym" czasie działania swojego programu możesz sobie podejrzeć pamięć i po prostu zobaczyć ile jest wciąż wyzerowane i zmniejszyć dany stos o tą wartość (zostawiając sobie jakiś tam margines bezpieczeństwa). Generalnie dla aplikacji rzadko potrzeba więcej niż 1kB, a dla przerwań (jeśli nie są zagnieżdżone) wystarcza kilkaset bajtów (128-256), oczywiście pod warunkiem że nie wywołujesz w przerwaniach dużej ilości funkcji (które wywołują kolejne funkcje, które wywołują kolejne funkcje, ...) i że nie alokujesz na stosie dużych obiektów.

    Można też wyłączyć użycie dwóch stosów, wtedy musisz dobrze dobrać rozmiar tylko jednego (; Dla aplikacji bez RTOSa może to być lepsze rozwiązanie.

    Statyczna analiza "zużycia" stosu jest skomplikowana, choć możliwa.