Skocz do zawartości

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


Pomocna odpowiedź

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;)

(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_

@_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!

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.. 

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?

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?

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

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...