Materiały, dyskusje dotyczące projektów AVT, autorstawa/współautorstawa/nadzorowane przez Sławomira Skrzyńskiego

***** Musisz się zalogowac aby oglądac całe forum *****

Nie jesteś zalogowany na forum.

#1 2018-04-24 11:24:19

r-mik
Administrator
Dołączył: 2017-09-23
Liczba postów: 38
Windows XPFirefox 52.0

Wielowątkowość w Arduino

Wykonywanie wielu zadań równocześnie przez mikrokontroler (uC) dla początkujących jest dużym problemem. Kłopoty powoduje nadużywanie funkcji "Delay()". Pierwszym krokiem do wielozadaniowości jest pozbycie się delayów.

Na początek warto zapoznać się z opisem wykorzystania  millis() https://forbot.pl/blog/kurs-arduino-ii- … is-id18418 i
https://techniczny.wordpress.com/2012/0 … w-arduino/
oraz https://playground.arduino.cc/Code/Timer

Likwidacja drżenia styków bez delay https://www.arduino.cc/en/Tutorial/Debounce


Przydaną funkcje jest pomiar czasu wykonywania się pętli głównej programu.

volatile uint16_t TimLoop;
uint16_t TimLoopCurrent, TimLoopMax, TimLoopMin=0xFFFF;


void setu()
{
[....]
	TimLoop=0;
}


loop()
{
	TimLoopCurrent = TimLoop; TimLoop = 0;
	if( TimLoopCurrent > TimLoopMax ) TimLoopMax = TimLoopCurrent;
	if( TimLoopCurrent < TimLoopMin ) TimLoopMin = TimLoopCurrent;
[........]
}

W przerwaniu 1ms należy umieścić poniższy kod:

TimLoop++;

Można także użyć millis() ale trzeba pamiętać o przepełnieniu się licznika po ok 49 dniach.

Czasochłonne operacja, jak np obsługa wyświetlacza LCD, nadawanie USARTem z małą predkością, powinny być realizowane w przerwanicha.
Pod linkiem http://er-mik.prv.pl/ctac/ można znaleźć kod w C dla 8051 używający wielowątkowości.


Jeśli opisy z linków nie rozwiązują problemu lub są niejasne, proszę umieszczać kod funkcji sprawiających problemy.

Offline

Użytkowników czytających ten temat: 0, gości: 1
[Bot] CCBot

Stopka

Forum oparte na FluxBB