Code Less AVR [Projekt edukacyjny] - wczesna wersja.

1

Witam,

Kilka dni temu byłem tu z libką z pinami - teraz skończyłem coś, co naprawdę jest według mnie fajne.

W CodeEasyAvr::Async można zarejestrować do 8 tasków na urządzenie, chaining(w implementacji), które będą wywoływane 1000 razy na sekundę (każdy), co jest wartością która pozwala na transfer danych, debouncowanie przycisków, obsługę wyświetlaczy.
Wszystko na jednym, 8 bitowym timerze!

https://github.com/pixellos/Easy-Code-AVR (kod jest NA RAZIE tragiczny, po zaimplementowaniu "Core" zabieram się za refactoring).

- mruganie diodą "w locie"

Pozdrawiam

Także chciałem wspomnieć o nieopisanej pomocy kolegów z czatu :P

1

Parę uwag z mojej strony:
Pomyśl o zamianie CLEAR i SET na f-kcje static inline. W tychże rzutuj val na uint8_t, bo bez optymalizacji może dojść do promocji do inta, który ma 16 bitów. To samo z innymi wartościami idącymi do 8bitowych rejestrów.

Nie dam głowy, że to źle (nie pamiętam, dawno na AVR nie pisałem), ale ISR w pliku .h? No, na pewno odważnie ;)

static void Register aź się prosi o while, for z breakiem jest imho mało czytelny.

Używasz nullptr, nie możesz używać default/delete dla metod?

Wołanie metody invoke w przerwaniu jest takie sobie. Nie lepiej zrobić to np. tak:

class Async {
  static volatile bool tick = false;
  static void tickSet() { tick = true; }
 
  /* costam costam */
}

ISR(TIM0_vect) {
  Async::tickSet();
}

void Async::Invoke() {
  if (tick) {
    //iterujesz jak tam sobie chcesz po akcjach
    tick = false;
  }

int main()  {
  Async::init(); //czy jak to się miało nazywać...
  while("forever") {
    Async::Invoke(); 
  } 
}

BTW - czemu nie uzależniłeś częstotliwości timera od F_CPU?

0

@alanger Dziękuję za uwagi, zaraz sprawdzę i poprawię! :)

Nie miałem pojęcia o promocji do inta :/, jak teraz pomyślę, to mogło przynieść niemiłe konsekwencje.

Dlaczego nie uzależniłem częstotliwości timera od F_CPU? Nie wiem, nie myślałem o tym, dzięki za fajny pomysł!

Co do wykonywania akcji w przerwaniu - chciałem, żeby czasy w miarę możliwości były równe - obsługa modułów z chipselect po spi, usart przy 500B/s.
W mojej metodzie jest możliwość tracenia przerwań, jak akcja się będzie wykonywać > niż jakieś 1800 asm rozkazów, a w Twojej nie jest gwarantowana stałość czasowa. Twoja jest bezsprzecznie lepsza przy takim samym założeniu, traci się max 31 rozkazów w najgorszym wypadku na ifjumpy
Na pewno zaimplementuję Twoje, bo do komunikacji z matrycą led czy hd44780 wydaje się być idealne. bo jest lepsze.

Wersja z samym generatorem pinów się nie sprawdziła - kłopoty przy robieniu fajnych bibliotek które można złączyć z tym fake asyncem, np dodanie 2.,3 wyświetlacza - kodu coraz więcej i końca nie widać.

Przerabiam teraz porty na generator + szablon, co pozwala na fajne ustawienia

Co do plików - tam jest niezły burdel :D. W pliku h metody, plików cpp ni ma - wiem, że to oczy wypala, ale na razie wszystko jest szkicem - nie wiem czy za chwilę pół rozwiązań nie pójdzie do kosza.

1 użytkowników online, w tym zalogowanych: 0, gości: 1