Skocz do zawartości

Czym są: RTOS, wielozadaniowość, taski?


SOYER

Pomocna odpowiedź

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Jeszcze do tego nie dotarłem, chyba się przeciągnie o parę dni, na razie walczę z przesuwaniem ekranów gestami w lvgl tylko nie umiem wyłączyc klikania przy okazji buttonów. Wprawdzie jest na to podobno funkcja 

lv_indev_wait_release(lv_indev_get_act());

ale albo nie działa, albo ja nie potrafię użyć.

Taki mały offtopic we własnym temacie;)

Link do komentarza
Share on other sites

(edytowany)

Pytania co do sekcji krytycznej, mam przygotowaną sekcję krytyczną (wg zaleceń @ethanak a) 

portMUX_TYPE mux = portMUX_INITIALIZER_UNLOCKED;

W pierwotnej wersji miało to dotyczyć obsługi tylko jednej struktury i tak to wykorzystywałem do tej pory:

         portENTER_CRITICAL(&mux);
           memcpy(&espdata, data, data_len);
         portEXIT_CRITICAL(&mux);

później kopiowanie zmiennej:

          portENTER_CRITICAL(&mux);
          sek = espdata.nextTtrans;
          uint8_t VCC = espdata.vzas / 1000;
          uint8_t VCD = (espdata.vzas % 1000)/10;
          portEXIT_CRITICAL(&mux);

Teraz doszło odczytywanie temperatury z 1wire. Czy mogę użyć tego samego muxa do kopiowania odczytanej wartości? W ogóle, task który obsługuje czujnik jest umieszczony na rdzeniu 2 chciałem tak zrobić żeby pracujący w tle program nie był przerywany magistralą 1Wire - mam obsługę programową.

if(ESP_OK == zh_ds18b20_read(rom, &ds_temperature))
	      {
           
        portENTER_CRITICAL(&mux);
        ds_temperature_celsius = ds_temperature;
        portEXIT_CRITICAL( &mux);

	      }else{
	    	  ESP_LOGW(TAG,"ERROR READ TEMP");
	      }
	  }

I jeszcze taka wątpliwość, skoro jakąś zmienną zapisuję w sekcji krytycznej to rozumiem że wszelkie inne operacje: odczyt, porównanie z czymś tam innym, kopiowanie. Również powinny odbywać się w tej sekcji?

 

Edytowano przez _LM_
Link do komentarza
Share on other sites

@_LM_ Sekcja krytyczna służy do tego, żeby operacja odbywała się atomowo i tylko do tego. W oryginalnym FreeRTOS po prostu blokowane są przerwania. Tu jest inaczej: blokuje się przez konkretny spinlock i nie  ma to nic wspólnego z przerwaniami ani z rdzeniami - po prostu spinlocka blokuje się raz a dobrze i dopiero próba zablokowania tego samego spinlocka (np. z przerwania albo z tasku na drugim rdzeniu) spowoduje zatrzymanie i czekanie aż ten pierwszy go odblokuje.

No a co tak w tej sekcji krytycznej umieścisz to już Twoja sprawa. Ja z reguły ograniczam się do pobrania/ustawienia jakiejś zmiennej (może być duża, np. jakaś struktura) a w kodzie operuję np. na kopii. I pamiętaj: dwie instrukcje w sekcji krytycznej to o jedna za dużo!

Link do komentarza
Share on other sites

A czyli coś na wzór atomic block, dobrze rozumiem że dotyczy obu rdzeni? Ok a jeśli chciałbym żeby blok dotyczył tylko funkcji umieszczonych na konkretnym alu? Czy to nie ma sensu.. 

Link do komentarza
Share on other sites

Tu wyjaśnienie dlaczego to tak drążę. Mam funkcję 1wire która ze swojej natury musi zająć trochę czasu procesora: na przykład zapis/odczyt magistrali to kilkadziesiąt mikrosekund. Po co blokować cały układ skoro dzieje się to na odrębnym rdzeniu, czy takie rozwiązanie jest możliwe?

Link do komentarza
Share on other sites

No przecież tak to działa - chyba że ta Twoja funkcja włazi do tej samej sekcji krytycznej. Po to masz dwa rdzenie żeby działały niezależnie.

Link do komentarza
Share on other sites

3 minuty temu, ethanak napisał:

Po to masz dwa rdzenie żeby działały niezależnie

Czyli dla funkcji odczytu 1Wire najlepiej zrobić odrębnego MUXa który zostanie z automatu przydzielony do rdzenia który korzysta z 1w?

Link do komentarza
Share on other sites

Spinlock nie jest przydzielany do konkretnego rdzenia! Po to on jest żeby dwa rdzenie nie właziły na raz z brudnymi paluchami do tej samej sekcji krytycznej. A spinlocków możesz mieć choćby sto...

  • Lubię! 1
Link do komentarza
Share on other sites

(edytowany)

Korzystam z tej biblioteki https://github.com/aZholtikov/zh_ds18b20 z powiązanym komponentem https://github.com/aZholtikov/zh_onewire No i nie widzę tam sekcji krytycznych podczas działania magistrali co czasem objawia się błędami CRC chciałbym po prostu poprawić tę bibliotekę 

Edytowano przez _LM_
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.