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

[stm32][FreeRTOS] program ląduje w default_handler

polimorf 06 Sty 2012 16:52 3479 15
  • #1 06 Sty 2012 16:52
    polimorf
    Poziom 13  

    Witam.

    Jakie są różnice pomiędzy FreeRTOS 6.1.1 a 7.1.0?

    Prosty program mrugający diodą działa mi pod wersją 6.1.1 a pod 7.1.0 ląduje w default_handler.

    Przerwanie następuje po wykonaniu tego kodu freertos'a.

    Code:
    void vPortStartFirstTask( void )
    
    {
       __asm volatile(
                   " ldr r0, =0xE000ED08    \n" /* Use the NVIC offset register to locate the stack. */
                   " ldr r0, [r0]          \n"
                   " ldr r0, [r0]          \n"
                   " msr msp, r0         \n" /* Set the msp back to the start of the stack. */
                   " cpsie i            \n" /* Globally enable interrupts. */
                   " svc 0               \n" /* System call to start first task. */
                   " nop               \n"
                );
    }

    0 15
  • #2 17 Sty 2012 10:10
    Marico
    Poziom 19  

    Czy może rozwiązałeś swój problem? Ja mam problem dokładnie z tą samą funkcją tylko na innej arch (pic32). Wygląda na problem z alignmentem (ostatnio zmienili z 4 na 8 bajtów).

    0
  • #3 17 Sty 2012 13:06
    gaskoin
    Poziom 38  

    polimorf napisał:
    Witam.

    Jakie są różnice pomiędzy FreeRTOS 6.1.1 a 7.1.0?

    Prosty program mrugający diodą działa mi pod wersją 6.1.1 a pod 7.1.0 ląduje w default_handler.

    Przerwanie następuje po wykonaniu tego kodu freertos'a.
    Code:
    void vPortStartFirstTask( void )
    
    {
       __asm volatile(
                   " ldr r0, =0xE000ED08    \n" /* Use the NVIC offset register to locate the stack. */
                   " ldr r0, [r0]          \n"
                   " ldr r0, [r0]          \n"
                   " msr msp, r0         \n" /* Set the msp back to the start of the stack. */
                   " cpsie i            \n" /* Globally enable interrupts. */
                   " svc 0               \n" /* System call to start first task. */
                   " nop               \n"
                );
    }


    Przypisałeś odpowiednie handlery tam gdzie trzeba ? W trakcie wykonywania tego kodu powinien nastąpić skok do jednego z nich. Jak ich nie przypiszesz to wylądujesz tam gdzie lądujesz :)
    Ważne też jest żeby kompilator nie generował pro0logu dla handlerów SVC i PendSV

    0
  • #4 22 Mar 2012 22:23
    gudaja
    Poziom 11  

    Witam
    Czy może ktoś rozwiązał problem bo mam dokładnie to satmo na stm32

    0
  • #5 22 Mar 2012 22:28
    gaskoin
    Poziom 38  

    Mi działa :)

    Masz przypisane dobrze handlery ?

    0
  • #6 23 Mar 2012 21:09
    polimorf
    Poziom 13  

    Mi też nie udało się tego rozwiązać - mimo dobrze przypisanych handlerów program skacze do defaulthandler dla 7.1.0.
    Po prostu korzystam ze starszej wersji freeRTOS'a (6.1.1).

    0
  • #7 23 Mar 2012 21:33
    gudaja
    Poziom 11  

    Tablice wektorów mam z przykładów ze strony http://www.freddiechopin.info
    Nic w niej nie zmieniałem i wersja 6.1.1 działa dobrze a 7.1.0 wiadomo

    Tak wygląda tablica wektorów:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    W załączniku jeszcze cały projekt, jest tam mały chaos ale ogólnie działa i można się połapać.

    0
  • #8 23 Mar 2012 21:56
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Przecież to od razu wiadomo o co chodzi... Ja nigdy w życiu nie używałem RTOSa ale powiem Ci gdzie masz błąd:

    \STM32Rtos7.1.0\STM32Rtos\RtosV611\Source\portable\GCC\ARM_CM3\port.c

    Kod: C
    Zaloguj się, aby zobaczyć kod


    Teraz znajdź takie przypisanie dla wersji 7.1.0

    Możesz sobie te definicje dodać poprzez Makefile albo do analogicznego pliku z FreeRTOSa w nowszej wersji.

    Swoją drogą niezła głupota, że w starej wersji coś było fajnie zrobione - standardowo - a w nowej już tego nie ma /;

    P.S. Dostępna jest minimalnie nowsza wersja przykładów jakbyś był zainteresowany, choć zmian tam nie ma zbyt wielu.

    4\/3!!

    0
  • #9 24 Mar 2012 09:01
    gudaja
    Poziom 11  

    Dzięki Freddie jesteś wielki, po dodaniu tych #define program od razu ruszył, jeszcze raz wielkie dzięki.

    0
  • #11 24 Mar 2012 17:34
    polimorf
    Poziom 13  

    A ja mam te #define zdefiniowane a program nie ruszył.
    Już do tego wracam - bo jak widać działa.

    0
  • #12 24 Mar 2012 18:25
    Freddie Chopin
    Specjalista - Mikrokontrolery

    No to teraz Ty wrzuć swój projekt, napisz na czym dokładnie polega problem (wywala się zaraz po starcie, po wywołaniu funkcji uruchamiającej scheduler, czy coś jeszcze innego) i opisz swoją konfigurację.

    4\/3!!

    0
  • #13 22 Maj 2012 08:14
    polimorf
    Poziom 13  

    Problem rozwiązałem - dopiero teraz do tego siadłem.
    Miałem przerobiony na .cpp plik vectors.c Frediego i był problem ponieważ freeRTOS definiował funkcjie w c a deklaracje były w cpp który to dekoruje nazwy funkcji (czy jak to się nazywało) - objęcie 3 handlerów przez extern "C" rozwiązało problem.

    0
  • #14 22 Maj 2012 08:25
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Proponowałbym raczej plik vectors jednak mieć w C, a nie C++ (nic to nie zmienia, poza właśnie problemem z manglowaniem nazw funkcji) (; Ewentualnie właśnie "extern" umieścić w pliku z tablicą wektorów.

    4\/3!!

    0
  • #15 22 Maj 2012 21:50
    polimorf
    Poziom 13  

    A jak plik z tablicą wektorów jest w c to jak odwołać się do jakiejś klasy w przerwaniu (nigdy tego nie próbowałem)?

    0
  • #16 22 Maj 2012 22:49
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Nic nie stoi na przeszkodzie, aby ten plik był sobie i plikiem C++, byle miał owe extern "C" - ta deklaracja oznacza tylko, żeby nie manglowało nazw, możesz w takich funkcjach wywoływać dowolne klasy itp.

    Tak czy siak extern "C" przyda się w pliku z tablicą wektorów, ale i przed faktyczną funkcją obsługującą przerwanie (bo taka może być w dowolnym pliku i w dowolnym miejscu, a nie w vectors.c).

    Najlepiej wg mnie więc zrobić tak:
    1. W vectors.c (lub inne rozszerzenie) dorzucić:
    #ifdef __cplusplus
    extern "C" {
    #endif
    na początku i:
    #ifdef __cplusplus
    }
    #endif
    na końcu.

    2. Przy funkcjach obsługi przerwań w plikach C++ deklarować je tak:
    extern "C" void ..._IRQHandler(void) __attribute__ ...

    Pozatym tablica wektorów jest tylko uporządkowaniem adresów do funkcji w ładną tabelkę - linkera nie obchodzi czy te funkcje odwołują się do klas czy czegokolwiek innego.

    4\/3!!

    0