| Author |
Message
|
nsvinc Poziom 22

Joined: 25 Mar 2006 Posts: 2066 Location: otfock
|
#1
24 Jan 2012 12:39 FreeRTOS szybkie pytania o semafory i sygnaly |
|
|
|
Witam,
nie jestem super specem od FreeRTOS (lecz już go używałem), a chyba właśnie pojawiła się nowa konieczność użycia tego RTOSa, tyle, że w bardziej zaawansowany sposób:
- Wątek worker1 obsługuje pewien RX i parsowanie, w wyniku czego uaktualnia 'strukturkę do komunikacji z innym wątkiem', gdy ta strukturka jest pusta, a w kolejce RX są dane
- Wątek worker2 uzywa powyzszej strukturki i na jej podstawie pędzi potężną maszynę stanu.
Pytanie główne: Czy FreeRTOS przewiduje możliwość następującego:
- worker2 requestuje 'operację', po czym włącza workera1 a sam idzie spać na konkretny czas. Worker1 gdy coś RXnie, uaktualnia strukturkę i przerywa sen workera2.
Worker2 po obudzeniu sprawdza czy strukturka jest uaktualniona, mniej więcej tak:
if (strukturka_jest_uaktualniona) rx_data( ); else rx_timeout( );
Tak, wiem, wszystko jest w dokumentacji, wystarczy poczytać, itp itd. ALE: mam teraz do zrobienia na szybko soft, podręcznika do freeRTOSa nie mam :(, a czas mnie cholernie goni...
|
|
| Back to top |
|
 |
Freddie Chopin Poziom 25

Joined: 12 Dec 2005 Posts: 7300 Location: Zawiercie
|
#2
24 Jan 2012 13:19 Re: FreeRTOS szybkie pytania o semafory i sygnaly |
|
|
|
Jeśli komunikacja pomiędzy w1 a w2 będzie przez kolejkę, to masz to o czym piszesz "gratis" - wątek usypia, zostaje obudzony dopiero jak inny wątek wstawi coś do kolejki. Semafor generalnie zadziała tak samo, tyle że wtedy musisz mieć dodatkowo ten semafor i coś na same dane, a wystarczyłaby sama kolejka z danymi - takie "2w1"
4\/3!!
|
|
| Back to top |
|
 |
nsvinc Poziom 22

Joined: 25 Mar 2006 Posts: 2066 Location: otfock
|
#3
24 Jan 2012 13:24 Re: FreeRTOS szybkie pytania o semafory i sygnaly |
|
|
|
Nie chcę tam kolejki. Jednostka informacji jest zbyt duża, żeby robić z tego kolejkę. Jest jedna struktura, która ma byc zapisywana przez w1 a odczytywania i zerowana przez w2.
W2 nie dziala jesli w strukturce nie ma danych, W1 nie dziala jesli w strukturce są dane.
Ale: timeout. Czy jeśli dany wątek pójdzie spać na ileś czasu ( sleep( ) ? ) to czy jest funkcja do tego, ktora wątek obudzi (z innego wątka wywołana)? Zwykły semafor w RTOSie to zrobi?...
|
|
| Back to top |
|
 |
Google

|
#
24 Jan 2012 13:24 |
|
|
|
|
|
| Back to top |
|
 |
Freddie Chopin Poziom 25

Joined: 12 Dec 2005 Posts: 7300 Location: Zawiercie
|
|
| Back to top |
|
 |
michalko12 Poziom 22

Joined: 20 Nov 2004 Posts: 1661 Location: Gdzieś koło wawy
|
#5
24 Jan 2012 14:24 Re: FreeRTOS szybkie pytania o semafory i sygnaly |
|
|
|
xSemaphoreHandle sem_id1 = NULL;
xSemaphoreTake(sem_id1, 3000); Tą funkcję stosujesz w worker2 co powoduje, że worker2 wybudza się co 3s lub jeśli semafor zostanie ustawiony przez funkcję xSemaphoreGive(sem_id1); która może być w worker1
lub
xSemaphoreGiveFromISR(sem_id1, &xHigherPriorityTaskWoken); które może być w przerwaniu.
|
|
| Back to top |
|
 |
nsvinc Poziom 22

Joined: 25 Mar 2006 Posts: 2066 Location: otfock
|
#6
25 Jan 2012 12:21 Re: FreeRTOS szybkie pytania o semafory i sygnaly |
|
|
|
O, super! szybka i konkretna odpowiedź ;]
Z powyższego wynika, że funkcja xSemaphoreTake blokuje do czasu wywołania xSemaphoreGive lub timeouta.
Więc co się stanie, gdy worker1 rzuci give zanim wystąpi take:
[w1 give][w2 take]
Czy take zeruje semafor, więc give musi zawsze wystąpić po take?
Czy w2 take bedzie blokowac jesli wczesniej zostal wywolany w1 give?
|
|
| Back to top |
|
 |
Google

|
#
25 Jan 2012 12:21 |
|
|
|
|
|
| Back to top |
|
 |
michalko12 Poziom 22

Joined: 20 Nov 2004 Posts: 1661 Location: Gdzieś koło wawy
|
#7
25 Jan 2012 15:28 Re: FreeRTOS szybkie pytania o semafory i sygnaly |
|
|
|
| Quote: |
| Czy take zeruje semafor, więc give musi zawsze wystąpić po take? |
Tak
| Quote: |
| Czy w2 take bedzie blokowac jesli wczesniej zostal wywolany w1 give? |
Nie
|
|
| Back to top |
|
 |
nsvinc Poziom 22

Joined: 25 Mar 2006 Posts: 2066 Location: otfock
|
#8
25 Jan 2012 15:47 Re: FreeRTOS szybkie pytania o semafory i sygnaly |
|
|
|
Dobra. Rozumiem. Dzięki. I najostatniejsze pytanie:
Aby zmusic take do blokowania, przydalby sie reset semafora przed wywolaniem take. Czy xxxxCreateBinary( ) prawidlowo wyzeruje istniejacy binary semafor?
|
|
| Back to top |
|
 |
gaskoin Poziom 22

Joined: 02 Jun 2010 Posts: 2194 Location: Bytom
|
#9
25 Jan 2012 22:41 Re: FreeRTOS szybkie pytania o semafory i sygnaly |
|
|
|
Po co Ci zerowanie semafora ? Semafor binarny liczy do 1, więc nie musisz w nim niczego zerować. Generalnie najprostszy semafor działa mniej więcej tak:
static volatile int semCount; Take(){ while(count > 5); count++; } Give(){ count--; }
Jest to bardzo prymitywna konstrukcja, ale tak to mniej więcej działa. Binarny poprostu liczy do 1 i nie musisz go nijak resetować.
|
|
| Back to top |
|
 |
michalko12 Poziom 22

Joined: 20 Nov 2004 Posts: 1661 Location: Gdzieś koło wawy
|
#10
26 Jan 2012 00:16 Re: FreeRTOS szybkie pytania o semafory i sygnaly |
|
|
|
Zaraz po utworzeniu semafora wywołaj funkcje xSemaphoreTake(sem_id1, 0);
|
|
| Back to top |
|
 |
nsvinc Poziom 22

Joined: 25 Mar 2006 Posts: 2066 Location: otfock
|
#11
31 Jan 2012 18:01 Re: FreeRTOS szybkie pytania o semafory i sygnaly |
|
|
|
Ok, wszystko trzyma sie kupy, aczkolwiek wylazł mi jeden, wcześniej nie objawiony, zupełnie niespotykany i atakujący z zaskoczenia błąd.
Problem polega na tym, że gdy zatrzymam rdzen na breakpointcie w wątku (lub przerwaniu), a potem puszczę go dalej (po prostu, nie step), to całość się natychmiast hardfault'ci. To samo dotyczy zwykłego stop'a rdzenia.
Bywa też, że po puszczeniu, rdzen po raz drugi w prawidlowy sposób zatrzyma się na breakpoint'cie (zalezy od pozycji tego breakpointa). Po zatrzymaniu, widzę, że w jeszcze nieuzytych rejestrach zamiast typowego 0xA5A5A5A5 (czy jakoś tak), są zera, LR wynosi magiczne 0xFFFFFFFF, itp. To przy okazji wyjaśnia, dlaczego jest hardfault - kontekst wątka się źle odtworzył.
Chyba to nie jest problem wielkosci stosu lub sterty - jedno i drugie ustawilem na 16kB.
Domyślając się, że może jakies peryferium pracuje (abstrakcyjne, ale innych pomysłów nie miałem), gdy rdzen jest zatrzymany, z wykorzystaniem DBGMCU_CR kazałem zatrzymywać wszystko razem z rdzeniem. Nic nie pomogło.
Zmęczyłem trm do cm3, w poszukiwaniu jakichś info o systicku ale znalazłem, szczerze mówiąc, nic ciekawego.
Efekt obserwuję uruchamiając trzy wątki wyglądające tak:
volatile u32 wontek1licznik=0; void wontek1(void *arg) { while(1) { wontek1licznik++; vTaskDelay(100); } }
W kodzie oprócz tego mam tylko init rcc, 3x xTaskCreate i vTaskStartScheduler.
Dopóki rdzenia nie zatrzymam (breakpoint lub stop) wszystkie trzy liczniki wesoło idą przed siebie, godzinami. Zatrzymanie i puszczenie rdzenia natychmiast wywala hardfault...:(
Nigdy wcześniej nie miałem takich szopek, więc za bardzo nie wiem co z tym zrobić...
|
|
| Back to top |
|
 |
Google

|
#
31 Jan 2012 18:01 |
|
|
|
|
|
| Back to top |
|
 |
gaskoin Poziom 22

Joined: 02 Jun 2010 Posts: 2194 Location: Bytom
|
#12
31 Jan 2012 18:57 Re: FreeRTOS szybkie pytania o semafory i sygnaly |
|
|
|
A jak duży MSP i PSP ?
|
|
| Back to top |
|
 |
nsvinc Poziom 22

Joined: 25 Mar 2006 Posts: 2066 Location: otfock
|
#13
03 Feb 2012 15:32 Re: FreeRTOS szybkie pytania o semafory i sygnaly |
|
|
|
MSP ma 16kB, każdemu wątkowi RTOS przydziela po 1kB stosu. Tylko to jestem w stanie łatwo podać ;]
|
|
| Back to top |
|
 |