FAQ | Points | Add... | Recent posts | Search | Register | Log in


FreeRTOS szybkie pytania o semafory i sygnaly


Post new topic  Reply to topic      Main Page -> Forum Index -> Microcontrollers Generally -> FreeRTOS szybkie pytania o semafory i sygnaly
Author
Message
nsvinc
Poziom 22
Poziom 22


Joined: 25 Mar 2006
Posts: 2066
Location: otfock

Post#1 Post from the author of the topic 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
Poziom 25


Joined: 12 Dec 2005
Posts: 7300
Location: Zawiercie

Post#2 24 Jan 2012 13:19helpful post - solution   

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
Poziom 22


Joined: 25 Mar 2006
Posts: 2066
Location: otfock

Post#3 Post from the author of the topic 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

Google Adsense


Post# Post from the author of the topic 24 Jan 2012 13:24   





Back to top
   
Freddie Chopin
Poziom 25
Poziom 25


Joined: 12 Dec 2005
Posts: 7300
Location: Zawiercie

Post#4 24 Jan 2012 13:26helpful post - solution   

Re: FreeRTOS szybkie pytania o semafory i sygnaly


Tu masz przykład tego o co pytasz:
http://www.freertos.org/tutorial/solution2.html

Semafory to taka kolejka bez danych - służy właśnie do tego o czym mówisz.
http://www.freertos.org/Inter-Task-Communication.html#Binary

Oczekiwanie na kolejkę/semafor może mieć timeout.

4\/3!!
Back to top
   
michalko12
Poziom 22
Poziom 22


Joined: 20 Nov 2004
Posts: 1661
Location: Gdzieś koło wawy

Post#5 24 Jan 2012 14:24helpful post - solution   

Re: FreeRTOS szybkie pytania o semafory i sygnaly


Code C - [expand]
xSemaphoreHandle sem_id1 = NULL;

Code C - [expand]
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ę
Code C - [expand]
xSemaphoreGive(sem_id1);
która może być w worker1

lub
Code C - [expand]
xSemaphoreGiveFromISR(sem_id1, &xHigherPriorityTaskWoken);
które może być w przerwaniu.
Back to top
   
nsvinc
Poziom 22
Poziom 22


Joined: 25 Mar 2006
Posts: 2066
Location: otfock

Post#6 Post from the author of the topic 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

Google Adsense


Post# Post from the author of the topic 25 Jan 2012 12:21   





Back to top
   
michalko12
Poziom 22
Poziom 22


Joined: 20 Nov 2004
Posts: 1661
Location: Gdzieś koło wawy

Post#7 25 Jan 2012 15:28helpful post - solution   

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
Poziom 22


Joined: 25 Mar 2006
Posts: 2066
Location: otfock

Post#8 Post from the author of the topic 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
Poziom 22


Joined: 02 Jun 2010
Posts: 2194
Location: Bytom

Post#9 25 Jan 2012 22:41helpful post - solution   

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:

Code C - [expand]
 
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
Poziom 22


Joined: 20 Nov 2004
Posts: 1661
Location: Gdzieś koło wawy

Post#10 26 Jan 2012 00:16helpful post - solution   

Re: FreeRTOS szybkie pytania o semafory i sygnaly


Zaraz po utworzeniu semafora wywołaj funkcje
Code C - [expand]
xSemaphoreTake(sem_id1, 0);

Back to top
   
nsvinc
Poziom 22
Poziom 22


Joined: 25 Mar 2006
Posts: 2066
Location: otfock

Post#11 Post from the author of the topic 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:
Code C - [expand]
 
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

Google Adsense


Post# Post from the author of the topic 31 Jan 2012 18:01   





Back to top
   
gaskoin
Poziom 22
Poziom 22


Joined: 02 Jun 2010
Posts: 2194
Location: Bytom

Post#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
Poziom 22


Joined: 25 Mar 2006
Posts: 2066
Location: otfock

Post#13 Post from the author of the topic 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
   
Post new topic  Reply to topic      Main Page -> Forum Index -> Microcontrollers Generally -> FreeRTOS szybkie pytania o semafory i sygnaly
Page 1 of 1
Similar topics
Zasilanie mikrokontrolera 3,3V i sygnaly wejsciowe 5V (12)
RS232- i sygnaly kontrolne?? (19)
Klasy thread-safe, malloc, free, zarządzanie pamięcią i semafory bez OSa (4)
Ada95 GNAT - jak dołączyć semafory? (1)
Problem 5 filozofów. Semafory i monitory. (4)
Semafory - Linux (2)
FreeRTOS, NutOS, TNKernel ... pytania (3)
[STM32][C] FreeRTOS sterowniki peryferiów i semafory (5)
[FreeRTOS] Semafory i mutexy (16)
VHDL, testbanch,sygnaly z architecture widziane w testbanchu (7)

Page generation time: 0.202 seconds


FAQ || Administrator || Moderators || Widgets and banners || Contact
elektroda.pl topic RSS feed