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.

[Atmega][FreeRTOS] jak dopasować wielkość stosu?

ddokupil 15 Lip 2009 15:44 2886 5
  • #1 15 Lip 2009 15:44
    ddokupil
    Poziom 15  

    Od kilku dni siedzę nad programem opierającym się o FreeRTOS dla Atmegi32/128. Mam niesamowity problem z dobraniem wielkości stosu dla każdego z tasków. jakimi regułami się kierować? Obecnie mam 8 tasków. Dla każdego przydzielony stack wielkości 130. Mam też 4 kolejki komunikatów, nie przekraczajace wielkością 6 bajtów kazda. Heap size ustawiłem dla Atmegi 128 na 2000 czyli połowę ramu. W zależności od tego jakie ustawię wielkości stosów i heap size program zachowuje się inaczej. Albo się wiesza od razu, albo się wiesza po czasie, albo działa w zupełnie nieprzewidywalny sposób. Ewidentnie coś ze stosem nie tak.
    Najbardziej mnie dziwi, że czasami (jeszcze kiedy program był mniejszy) zmniejszenie przydzielonego stacku rozwiązywało problem. Dlaczego przydzielenie dużo za dużej wartości (ale nadal jest rezerwa w heap size) sypie program? Mogę dać kod ale uprzedzam, że jest bardzo zabałaganiony.
    Wszystko w nim działa, ale czasami dodanie jednej instrukcji do pętli wszystko psuje.

    0 5
  • #2 15 Lip 2009 16:14
    arrevalk
    Poziom 25  

    8 zadań? A czemu tak dużo? Założe się że można to skutecznie zoptymalizować, np przenosząc zadania o niskim priorytecie do IddleHook (np miganie diodkami). Na stronie freeRTOS jest krótki poradnik jak optymalizować aplikacje pod względem szybkości i zajętości ramu.

    0
  • #3 15 Lip 2009 19:05
    ddokupil
    Poziom 15  

    Nie migam diodkami. Mam tutaj dość skomplikowane menu, task czytający z ADC, Task kontrolujący PWM na podstawie odczytów z ADC, task sprawdzający czy stos sie gdzies nie skonczył, task do obsługi klawiatury, task odmierzający sekundy i idle. Może cos mozna by połączyć ze sobą ale po to używam RTOS zeby to bylo rozbite na taski. Chyba znalazłem metodą prób i błędów jakieś działające ustawienia ale nie wiem czy jak czegoś nie dodam to czy znów się nie zaczną jaja.

    0
  • #4 15 Lip 2009 21:27
    arrevalk
    Poziom 25  

    Przeczytaj sobie ten artykuł: Link.
    Kluczem do optymalnie napisanej aplikacji na każdym systemie operacyjnym jest odpowiednie podzielenie jej na "klocki". Rozdzielenie jej na wiele wątków nie koniecznie jest dobrym pomysłem, bo czasem więcej można stracić na przełączaniu kontekstu niż fakcie że dwie lub 3 czynnosci wykonują się w tym samym tasku. Szczególnie jest to ważne w przypadku małych mikrokontrolerów, a przecież każdy task to miejsce na stosie.

    0
  • #5 15 Lip 2009 22:31
    ddokupil
    Poziom 15  

    I całkowicie się z Tobą zgadzam. problemem moim nie jest mała ilość pamięci tylko jej złe użycie. Najpierw aplikację rozwijałem na Atmedze 32 i szło całkiem nieźle. W końcu zaczęło brakować pamięci więc po kilku godzinach kombinowania stwierdziłem, że czas się przesiąść na coś większego. Akurat znalazłem Atmegę 128 - w sumie to 2x więcej ramu. Ale okazało się, że zwyczajne zwiększanie stacku dla zadań i total heap size nie działa. Interesuje mnie zagadnienie jak przydzielać stack i total heap size żeby działała każda ilość zadań, nawet 50. Jeśli trzeba to mogę dołączyć nawet 128k ramu ale co z tego jeśli nie bardzo wiem jak go zagospodarować? A przełączanie kontekstu z punktu widzenia czasu jaki zajmuje ta czynność jest totalnie nieistotne. Nie mam tu nic co by było czasowo krytyczne.

    0
  • #6 16 Lip 2009 18:06
    grzeslab
    Poziom 11  

    Skoro podejrzewasz złe użycie pamięci, użyj wbudowanych we FreeRTOSa sposobów sprawdzania użycia stosów dla poszczególnych tasków. Mowa konkretnie o tym http://www.freertos.org/index.html?http://www....org/Stacks-and-stack-overflow-checking.html.. Podobnie jak koledzy uważam, że powinieneś jeszcze raz zaprojektować aplikację. Nie każda funkcja musi być wykonywana w osobnym tasku (choć takie podejście jest wygodne, ale gdy dysponujemy większymi zasobami).

    Używałeś funkcji void vTaskList( portCHAR *pcWriteBuffer )?
    Sprawdź ile tak naprawdę wykorzystują pamięci taski i dopiero wtedy dopasuj wielkości stosów.
    Pamiętaj, że to może być wina samego kodu, być może któraś z funkcji modyfikuje obszar pamięci używany przez inne taski, co mogłoby tłumaczyć inne zachowanie się programu przy zmianie rozmiaru stosu.
    Tyle gdybania, pozdrawiam.

    0