Skocz do zawartości

Okresowe wołanie funkcji w Arduini


Behlur_Olderys

Rekomendowane odpowiedzi

2 godziny temu, Behlur_Olderys napisał:

Ogólnie - gdyby zaimplementować z boku gdzieś najprostszą protezę std::vector to mój "idealny" kod wyglądałby tak: (pseudo kod raczej)

Jest pare bibliotek. Przypuszczam jednak, ze beda miec istotny narzut, dlatego cuduje realloc z C. Przyznaje jednak, ze nie testowalem ich wplywu na wydajnosc.

https://github.com/maniacbug/StandardCplusplus

https://www.arduinolibraries.info/libraries/arduino-stl

https://github.com/zacsketches/Arduino_Vector

Odnośnik do komentarza
Udostępnij na innych stronach

@r.ziomber jeszcze komentarz do Twojego kodu, taki high level na szybko:

- brak enkapsulacji

- zmienne w def funkcji powinny byc self-explanatory

- usuwanie z tablicy jest bardzo nieefektywne, przesuwasz za kazdym razem ogon o jeden, robisz dużo reallocow (zobacz jak to jest u mnie) - złożoność masz tam O(n^2) + złożoność realloca + fragmentacja pamięci 

- ogólnie w embedded należy przyjąć ze malloc/realloc/free są drogie i optymalizować ich użycie 

- zwracasz id taska a pozniej usuwasz z tablicy, idki na zewnątrz będę wskazywały błędne taski

 

Gdyby się wczytać to jest tego dużo więcej. 

  • Lubię 2
Odnośnik do komentarza
Udostępnij na innych stronach

8 godzin temu, Sebo_b napisał:

@r.ziomber jeszcze komentarz do Twojego kodu, taki high level na szybko:

- brak enkapsulacji

- zmienne w def funkcji powinny byc self-explanatory

- usuwanie z tablicy jest bardzo nieefektywne, przesuwasz za kazdym razem ogon o jeden, robisz dużo reallocow (zobacz jak to jest u mnie) - złożoność masz tam O(n^2) + złożoność realloca + fragmentacja pamięci 

- ogólnie w embedded należy przyjąć ze malloc/realloc/free są drogie i optymalizować ich użycie 

- zwracasz id taska a pozniej usuwasz z tablicy, idki na zewnątrz będę wskazywały błędne taski

 

Gdyby się wczytać to jest tego dużo więcej. 

Co do alokacji:

Najlepiej byłoby mieć wektor z alokatorem na statycznej tablicy, o ile mniej więcej można oszacować ile będzie tasków (a wydaje się, że raczej nie mówimy o jakimś intensywnym dodawaniu / odejmowaniu elementów). Z drugiej strony, jeśli aplikacja jest tak wyżyłowana performance'owo, że trzeba się martwić takimi rzeczami, to znak, że pora zastanowić się nad zmianą hardware'u :) Mi ten timer jest potrzebny właśnie po to, żeby bez względu na czas różnych innych operacji te kluczowe (obsługa krokowca) odbywała się bez zakłóceń. 

Pozdrawiam!

Odnośnik do komentarza
Udostępnij na innych stronach

2 godziny temu, Behlur_Olderys napisał:

Z drugiej strony, jeśli aplikacja jest tak wyżyłowana performance'owo, że trzeba się martwić takimi rzeczami, to znak, że pora zastanowić się nad zmianą hardware'u :)

STM32!

https://github.com/stm32duino

https://www.aliexpress.com/item/1pcs-STM32F103C8T6-ARM-STM32-Minimum-System-Development-Board-Module-raspberry-raspberri-pi-2-watch-nmd-diy/32786765274.html

 

A ESP32 jest dwurdzeniowe i mozna jeden rdzen poswiecic na timer.

https://groups.google.com/forum/#!topic/pl.misc.elektronika/K3eQYMWwdf4

Odnośnik do komentarza
Udostępnij na innych stronach

4 hours ago, Behlur_Olderys said:

Najlepiej byłoby mieć wektor z alokatorem na statycznej tablicy,

Jeśli miała by to być statyczna tablica, to wektor na niej byłby chyba już przesadą :)

 

Rozwiązaniem pośrednim jest prealokacja tej tablicy w konstruktorze i (w przypadku tego co załączyłem) nie wołanie cleanup. 

 

PS: STL że względu na intensywne użycie template'ów jest dość ciężki dla footprintu (wielkość binarki). Szczególnie jeśli jest to nie optymalizowana wersja, w pełni zgodna ze standardem. Dlatego często unika się STLa w embedded i pewnie dlatego implementacje możecie znaleźć tylko na githubie a nie dołączoną do kompilatora. 

  • Lubię 2
Odnośnik do komentarza
Udostępnij na innych stronach

4 hours ago, Behlur_Olderys said:

Z drugiej strony, jeśli aplikacja jest tak wyżyłowana performance'owo, że trzeba się martwić takimi rzeczami, to znak, że pora zastanowić się nad zmianą hardware'u :) 

W komercyjnych projektach to zwykle nie możliwe :)

 

2 hours ago, r.ziomber said:

ESP32 jest dwurdzeniowe i mozna jeden rdzen poswiecic na timer.

A jeszcze jedno - pomimo załączonego kodu, wciąż uważam, że należy to zrobić na timerach hardwearowych. 

Odnośnik do komentarza
Udostępnij na innych stronach

  • 3 tygodnie później...
W dniu 25.08.2018 o 10:47, Behlur_Olderys napisał:

static_cast wygląda najbardziej elegancko, ale znowu - muszę sam się przekonać :)

Przy okazji millis() mozna sobie samemu "przekrecic". Dla ATmega328P dodaj do setup()

  extern volatile unsigned long timer0_millis;
  noInterrupts();
  timer0_millis += 4294963295;
  interrupts();

i bedziesz mial 4 s do przekroczenia zakresu unsigned long.

Przy okazji przydatne, jesli chcemy korygowac millis() o czas uspienia kontrolera i nie bawic sie w podmiane millis() na actualMillis() we wszystkich plikach.

unsigned long actualMillis()
{
	return millis() + sleepCorrection;
}

 

Odnośnik do komentarza
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę.