Elektroda.pl
Elektroda.pl
X

Search our partners

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

[STM32][CortexM3] - Run Time Statistics w FreeRTOS.

ordon 20 Nov 2012 14:04 2943 8
  • #1
    ordon
    Level 9  
    Hej,
    chciałem zaimplementować zbieranie statystyk w systemie FreeRTOS. Zrobiłem jak w opisie funkcji:
    1.włączyłem flagę configGENERATE_RUN_TIME_STATS
    2.portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() skonfigurowałem counter.
    3.portGET_RUN_TIME_COUNTER_VALUE() - obsłużyłem odczyt z countera.
    Przy kompilacji poszło ok.
    Jednak jeśli dodam funkcję
    Code:
    vTaskGetRunTimeStats( array );
    to kompilator mi wyrzuca:
    Quote:

    [cc] Starting link
    [cc] arm-none-eabi-gcc -Os -nostartfiles -Wl,-Map=SuperSystem.map -mcpu=cortex-m3 -mthumb -LC:\CooCox\CoIDE\workspace\SuperSystem -Wl,--gc-sections -Wl,-TC:\CooCox\CoIDE\workspace\SuperSystem/arm-gcc-link.ld -g -o SuperSystem.elf ..\obj\stm32f10x_tim.o ..\obj\startup_stm32f10x_md_vl.o ..\obj\core_cm3.o ..\obj\system_stm32f10x.o ..\obj\DisplayController.o ..\obj\stm32f10x_gpio.o ..\obj\main.o ..\obj\requiredMethodsFromMain.o ..\obj\timers.o ..\obj\stm32f10x_rcc.o ..\obj\MotorsController.o ..\obj\stm32f10x_exti.o ..\obj\tasks.o ..\obj\stm32f10x_adc.o ..\obj\alfanumDisplay.o ..\obj\list.o ..\obj\stm32f10x_flash.o ..\obj\stm32f10x_it.o ..\obj\MeasurementsController.o ..\obj\queue.o ..\obj\port.o ..\obj\SSBootstrapper.o ..\obj\misc.o ..\obj\heap_1.o
    [cc] c:/program files (x86)/gnu tools arm embedded/4.6 2012q2/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-sbrkr.o): In function `_sbrk_r':
    [cc] sbrkr.c:(.text._sbrk_r+0xc): undefined reference to `_sbrk'
    [cc] c:/program files (x86)/gnu tools arm embedded/4.6 2012q2/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-abort.o): In function `abort':
    [cc] abort.c:(.text.abort+0xa): undefined reference to `_exit'
    [cc] c:/program files (x86)/gnu tools arm embedded/4.6 2012q2/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-signalr.o): In function `_kill_r':
    [cc] signalr.c:(.text._kill_r+0xe): undefined reference to `_kill'
    [cc] c:/program files (x86)/gnu tools arm embedded/4.6 2012q2
    [cc] /bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-signalr.o): In function `_getpid_r':
    [cc] signalr.c:(.text._getpid_r+0x0): undefined reference to `_getpid'

    Wcześniej miałem chyba jeszcze błąd zbyt małej ilości ramu, ale zmniejszyłem sterte i włączyłem optymalizacje rozmiaru w ustawieniach projektu.
    Co to są za błędy, np. undefined reference to `_sbrk' ? gdzie to można znaleźć i ewentualnie naprawić ?

    pozdrawiam
  • #2
    stanleysts
    Level 27  
    Wywołania systemowe do zarządzania pamięcią, najczęściej musisz sobie je sam zaimplementować.
  • #3
    Freddie Chopin
    MCUs specialist
    To wszystko przez to, że te funkcje we FreeRTOSie korzystają ze sprintf(), a ten w newlibie korzysta m.in. z liczb zmiennoprzecinkowych, a więc wciąga całkiem pokaźną ilość dodatkowych funkcji... Najprościej to dla kompilacji samego FreeRTOSa (jego plików), albo i dla całego projektu, dorzucić taką flagę do kompilacji: -Dsprintf=siprintf, co spowoduje zastąpienie zwyczajnej funkcji wersją dla liczb całkowitych.

    4\/3!!
  • #4
    ordon
    Level 9  
    A funkcje sprintf mają jakieś znaczenie jeśli nic nie wypisuje na ekran, a dane chce tylko mieć w tablicy która podaję w vTaskGetRunTimeStats() ? Mógłbym wykomentować sprintf'y ? Zrobiłem tak, ale nie wiem czy teraz mi nie działa funkcja, czy mam źle skonfigurowany counter potrzebny przy tym feature. Wpisuje mi coś do tej tablicy, ale nie wydaje się to być ok.

    pozdrawiam.
  • #6
    ordon
    Level 9  
    Hmm, właśnie nie rozwiązało to problemu.
    Racja, używa tych sprintfów do dodawania danych do tablicy, którą mu podaję. Żeby rozwiązać problem dużej biblioteki użyłem printf-stdarg.c z demo użycia FreeRTOS'a.
    Teraz jest tylko jeden problem, po pierwszym wykonaniu funkcji TaskGetRunTimeStats() dane wydają się być ok, ale po późniejszych procenty przekraczają wielokrotnie 100%.
    Czy to może być spowodowane tym, że licznik się przepełnił i liczy od zera ?
    Skonfigurowałem 16bit timer TIM1 na cortexM3. Może muszę zerować ten licznik po każdym użyciu TaskGetRunTimeStats() ?

    pozdrawiam !
  • Helpful post
    #7
    Freddie Chopin
    MCUs specialist
    Jeśli timer jest 16-bitowy to musisz dorzucić coś więcej - 16-bitów to zbyt mało. Licznik z którego korzystają run-time stats musi być 32-bitowy...

    Ja na STM32 mam to zrobione tak...

    1. W FreeRTOSConfig.h mam:

    Code: C
    Log in, to see the code


    2. W jakimś pliku mam zaś:

    Code: C
    Log in, to see the code


    Tym sposobem masz timer niby-32-bitowy i wtedy to działa prawidłowo. Po prostu ta wartość MUSI być 32-bity i koniec... Inna opcja to połączenie kaskadowe dwóch timerów, wtedy masz też tak jakby timer 32-bitowy.

    4\/3!!
  • #8
    ordon
    Level 9  
    Prawda, z 32 bitowym licznikiem działa prawidłowo.
    Dzięki za pomoc !

    p.s. jeszcze jeden szczegół mnie zastanawia: Te statystyki są wyliczone z przedziału czasu od poprzedniego pobrania statystyk ? czy to znaczy, że dostaniemy bardziej dokładne statystyki jeśli będziemy rzadziej je pobierać ? a max czas pomiędzy kolejnymi pobieraniami to przedział od zera do przepełnienia licznika ?

    pozdrawiam !
  • Helpful post
    #9
    Freddie Chopin
    MCUs specialist
    Statystyki są sumaryczne, przecież to widać że liczby stale rosną. Odczyt niczego nie kasuje, częstotliwość odczytów jednak ma wpływ na działanie całego systemu - na czas generowania tych danych cały RTOS jest wyłączony.

    4\/3!!