Skocz do zawartości

Dlaczego "millis jest złe" ;)


Pomocna odpowiedź

7 minut temu, 42n4 napisał:

nawet FreeRTOS-em nakładką na Arduino

Temat znany. Na UNO bez sensu 9RAm), na większych AVR raczej bez sensu (min czas wywłaszczania 15ms - WDG) albo pożegnasz się z timerem, których w AVR za dużo nie jest. Jakiś tam sens jest w mega128x, 256x, 1284 (ten ma dużo RAM a timery zdaje się tylko 4). Używałem RTOS na STM32 i zapotrzebowanie na pamięc jest spore no chyba, ze tylko LEDem chce się pomigać ale do tego nie trzeba angażować RTOS.

RTOS na Arduino ma sens, jak używa się STM32, ESP itp dużych uC one o czym już pisałem, aby rozwinąć skrzydła muszą używać DMA. Programowe łaty (1-Wire, WS281x, I2C, SPI, UART) to nieporozumienie a biblioteki Arduino praktycznie NIE UŻYWAJĄ sprzętu, przynajmniej w przypadki 1-Wire i WS2812. Jedyna korzyść z ARM taka, że w przeciwieństwie do AVR nie są w czasie komunikacji zawieszane przerwania ale funkcje są blokujące i program w czasie transferu "wisi".

Dla niezorientowanych, do 1-Wire używa się UART. To bez problemu działa nawet na AVR o czym można przeczytać w Elektronice praktyczne 1/2019. Do WS281x UART, SPI, zaawansowanych opcji timerów (Xmega da radę), na I2C (ARM o AVR można zapomnieć) też powinno się udać. W przypadku AVR WS281x przez UART działają ale obciążenie CPU jest 80..90% (zawsze lepiej niż 100% z bibliotekami arduino) i problemy z niektórymi przerwaniami.

 

Czyli te softwarowe timery http://bit.ly/arduinotimer używane na forum arduino są zbyt długo wywłaszczane?

Ludzie używają ich do wielu projektów i wystarczają, ale to zwykle jakieś karmiki, czy nawet klimy? Pewnie czasami trzeba szybszego przełaczania.

Co do hardwarowych timerów to Arduino rzeczywiście ma je przypisane do pinów i od 2 do 4.

Jasne potrzebne są mocniejsze układy typu STM do tak wymagających transferów przez UART.

25 minut temu, 42n4 napisał:

Czyli te softwarowe timery http://bit.ly/arduinotimer używane na forum arduino są zbyt długo wywłaszczane?

Szkoda zajmować się taką biblioteką. Ona działa poprawnie gdy pętla loop wykonuje się szybko. Wirtualne timery powinny być obsługiwane na przerwaniach. Jest to banalne.

irq( TIMER_1_MS ){
 if ( timer1 ) timer1-- 
 if ( timer2 ) timer2-- 
 if ( timer3 ) timer3-- 
 ...  
}

W pętli głównej np zmiana stanu led co 500ms

if( ! timer1 ){
 timer 1 = 500; 
  
 ZMIEN_STAN_LED;
}

naturalnie, trzeba zastosować się do moich wcześniejszych rad i być może użyć ATOMIC_BLOK jeśli te 500ms ma być w miarę dokładne. Nie poruszam tu tematu migania ledem w przerwaniu, bo nie o to chodzi).

Oczywiście, w kodzie nie może być jakiś odczytów dallasów przez 700ms, czy wyświetlania obrazków na LCD przez 2,7 sekundy bo led będzie się "zacinał". na to wszystko są różne rozwiązania ale to zawsze będą protezy i nic nie zastąpi lepszego uC.

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