Skocz do zawartości

Co wybrać dla ESP32 - Arduino, czy IDF


Pomocna odpowiedź

Nie chce mi się zaglądać do dokumentacji, ale o ile pamiętam coś koło dwóch sekund. Oczywiście można to wszystko sobie poustawiać, możesz karmić watchdoga bez wywoływania delay/yield czy całkiem wyłączyć.

  • Pomogłeś! 1
12 minut temu, ethanak napisał:

Nie chce mi się zaglądać do dokumentacji, ale o ile pamiętam coś koło dwóch sekund. Oczywiście można to wszystko sobie poustawiać, możesz karmić watchdoga bez wywoływania delay/yield czy całkiem wyłączyć.

2 sekundy to kupa czasu...😉 dziekuje bardzo za odpowiedz...co do twojego przykladu no to fakt...bardzo schludnie i prosto wyglada...ale jako "zadanie domowe" juz mam taki mini zarys jak by to na millis wygladalo...choc jest duzo trudniej bo trzeba pare flag zapamietac a to dodatkowo komplikuje, ale nawet dla doksztalcenia spruboje to zrobic jak najprosciej..😜

8 minut temu, ethanak napisał:

Właśnie o to chodzi abyś porównał czytelność, stopień trudności napisania kodu i modyfikacji dla obu rozwiązań.

Z modyfikacja akurat to nie bylby problem bo zmiany tylko w tablicach...co do reszty? Hmmm..ciezko bedzie pobic te taski😉 ale zobacze co wyskrobie..napewno sie pochwale...🤔

(edytowany)
20 godzin temu, ethanak napisał:

Spróbuj zrobić to na tych swoich millisach(), a potem przerób na siedem diod 🙂

Zgodnie z postanowieniem wrzucam kod na milisach...wczoraj po polnocy mnie naszlo😉

#define LEDY 5
#define ILOSC_INTERVAL 5

uint32_t last_t[LEDY];
bool stan_led[LEDY] = {1,1,1,1,1};
uint8_t licznik[LEDY] = {1,1,1,1,1};
uint32_t atualny_t = 0;

int leds[LEDY][ILOSC_INTERVAL + 1] = {
    {9,100,200,300,400,500},
    {10,110,220,200,600,100},
    {11,200,250,300,350,400},
    {12,400,410,420,430,440},
    {13,100,110,110,100,90}};

void setup() {

for (int i = 0; i < LEDY; i++) {
   pinMode(leds[i][0], OUTPUT);
   digitalWrite(leds[i][0], LOW);
  }
}

void loop() {
  atualny_t = millis();
  h();

}


void h() {

  for (int i = 0; i < LEDY; i++) {
    if (atualny_t - last_t[i] > leds[i][licznik[i]]) { //jesli czas uplynal dla danej led
      digitalWrite(leds[i][0], stan_led[i]); //zmien stan
      licznik[i]++;                         //przestaw licznik na kolejny interval dla danej led
      last_t[i] = atualny_t;                //zapisz aktualny czas dla led
      stan_led[i] = !stan_led[i];           //ustaw na przeciwny stan
      
      if (licznik[i] > ILOSC_INTERVAL) {  //jesli ilosc intervalow sie skonczyla dla danej led...
      licznik[i] = 1;                     //to ustaw na pierwszy
      }
    } 
  }
}

co prawda nie ma tutaj na starcie tego samego stanu na led bo ilosc intervalow jest nieparzysta, ale to tylko jedna linijka ktorej poprostu nie chcialo mi sie dopisac...te jedynki na starcie w tablicach tez mozna sie pozbyc piszac w kodzie np

licznik[i + 1]

ale z lenistwa juz nie kombinowalem...jak widac na millis tez to w miare zgrabnie wyglada...😉 a co do zmiany ilosci led lub intervalow no to tylko w definicjach zmienic i ok...(choc wiadomo ze na taskach to jeszcze zgrabniej wyglada, no ale takie bylo "zadanie domowe" wiec zrobilem)

Edytowano przez farmaceuta

Świetnie

To teraz zobacz ile robisz rzeczy które nie są związane z programem. Jakieś dodatkowe liczniki, jakieś zapamiętywania stanów...

Nie publikowałem na razie całego kodu czytaka ale pomyśl, jak skomplikowałby się program gdybym chciał bawić się w jakieś millisy w przypadku syntezatora mbrola i synchronicznego odtwarzania dźwięku. Na dzisiaj wygląda to tak, że jeden task pcha zdania w kolejkę (przetwarzając to w międzyczasie na zapis fonetyczny) i czeka, aż się kolejka zwolni; drugi task pobiera zdania z kolejki, syntetyzuje mowę i pcha to do DMA. Żadnych millisów, delay jest po to aby jeden task mógł odczytać fragment książki nie przejmując się tym co zrobi gadacz

 No i po to są delaye w gadaczu, żeby reader miał czas na wrzucenie mu danych do gadania...

 

 

Niewiele zrozumialem z powyzszego...😉hehe no ale sens wypowiedzi rozumiem, i wiem ze w prostych sytuacjach to na milis ujdzie, ale w tych bardziej "pro" to byla by katorga gdzie na taskach to latwizna jak sie je zna...(przyjdzie i czas na rtos'a dla mnie)

Po prostu wystarczy zrozumieć jak działa scheduler i kiedy może uruchomić inny task. Taki delay to najprostszy przykład, ale jak już to zrozumiesz to reszta jest prosta.

  • Lubię! 1
  • 4 tygodnie później...
(edytowany)
Dnia 6.12.2021 o 04:03, ethanak napisał:

@farmaceuta no to taki mały przykład - program z serii "blink", czyli miganie pięcioma diodami w różnym rytmie niezależnie (pisane "na kartce" czyli mogą być błędy):



int leds[5][6] = {
    {18,100,200,300,400,500},
    {19,110,220,200,600,100},
    {21,200,250,300,350,400},
    {22,400,410,420,430,440},
    {23,100,110,110,100,90}};

void ledTask(void *param)
{
    int *led=(int *)param;
    int i;
    pinMode(*led, OUTPUT);
    digitalWrite(*led, 0);
    while (1) {
        for (i=1; i< 6; i++) {
            digitalWrite(*led, !digitalRead(*led));
            delay(led[i]);
        }
    }
}

void setup()
{
    int i; char name[5];
    for (i=0; i<5; i++) {
        sprintf(name,"led%d", i);
        xTaskCreate(ledTask, name, 5000, (void *)leds[i], 0, NULL);
    }
}

void loop()
{
    // a tu jakiś kawałek kodu
}

 

W międzyczasie powstało całkowicie nowe środowisko dla ESP32 z pogranicza Arduino i MicroPython, które zachwyciło mnie prostotą i szybkością z jaką umożliwia programowanie. Nazywa się Toit i zostało stworzone w czasie ostatnich kilku lat przez programistów o ugruntowanym dorobku. Poniżej kod zainspirowany postem @ethanak napisany w Toit.

import gpio

leds ::= [[19, 100,200,300,400,500],
          [18, 110,220,200,600,100],
          [ 5, 200,250,300,350,400],
          [17, 400,410,420,430,440],
          [16, 100,110,110,100,90]]

main:
  for i := 0; i < 5; i++:
    task:: ledTask i

ledTask ledN:
  led := gpio.Pin leds[ledN][0] --output --input
  while true:
    for i := 1; i < 6; i++:
      led.set (led.get + 1) % 2
      sleep --ms=leds[ledN][i]

Ostatnio do środowiska dodano pakiet Jaguar, który dodatkowo przyspiesza tworzenie i uruchamianie programów bez potrzeby korzystania z chmury Toit.  

 

blink-leds-toit.thumb.gif.c2b0635b105a572a04cfb56572b2f651.gif

Edytowano przez krzychb
  • Lubię! 1
Dnia 22.12.2018 o 02:14, Elvis napisał:

@krzychb dzięki za linka - co prawda sama odpowiedź nie do końca rozwiała moje wątpliwości, ale pod wpisem znalazłem list do książki Neil-a Koban'a: https://leanpub.com/kolban-ESP32/applinked

O ile rozumiem Arduino ma co najmniej jedną wadę związaną z brakiem wsparcia dla wielowątkowości - ktoś ma z tym jakieś doświadczenia? ESP32 ma dwa rdzenie, trochę szkoda byłoby nie dość że wykorzystywać tylko jeden to jeszcze w jednym wątku...

Dziękuję

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