Keresés

Hirdetés

Új hozzászólás Aktív témák

  • Janos250

    őstag

    válasz Panhard #7783 üzenetére

    Tippek:
    Gyanítom, hogy nem a várakozó task okozza a galibát, hanem valami másik, aki közben "nem jut szóhoz"
    1. Próbáld meg a prioritást variálni, hogy amíg a függvényed fut, mások is szóhoz jussanak
    2. tegyél be pl. vTaskDelay(20)-at, mert akkor is futhat más task is
    3. ha végképp nem megy, akkor én kilépnék a taskból, majd újra be.

    A freeRTOS valahogy taskonként kezeli a WDT-t, ezt nem tudom hogy csinálja, de megoldja. A WDT-t lehetne közvetlen írással nullázni, de nem tudom, felborít-e valami mást a freeRTOS-ban
    Egyébként az ESP32 kutyusa hardver szinten "idomítva van, hogy csak a gazditól fogadjon el kaját". :)
    A gazdi az, aki tudja a jelszót, ami valami 32 bites szám.

    [ Szerkesztve ]

    Az amerikaiak $ milliókért fejlesztettek golyóstollat űrbéli használatra. Az oroszok ceruzát használnak. Én meg arduinot.

  • Janos250

    őstag

    válasz Panhard #7785 üzenetére

    Igen, a delay() alatt tud futni másik task, így nem hal éhen szegény kutyus, mert a scheduler eteti :) De prioritási beállításokkal is megoldható, hogy a várakozó ciklus ne fogja le teljesen az adott core-t.

    [ Szerkesztve ]

    Az amerikaiak $ milliókért fejlesztettek golyóstollat űrbéli használatra. Az oroszok ceruzát használnak. Én meg arduinot.

  • Panhard

    tag

    válasz Panhard #7787 üzenetére

    Szerintem nem is az volt a baja a kutyának, hogy nem tudott a függvénytől futni a második task, hanem csak annyi, hogy nem csinál semmit 5mp-ig az első. Így néz ki a programban a task kezelés:

    xTaskCreatePinnedToCore(loop1, "loop1", 4096, NULL, 1, NULL, 1);
    xTaskCreatePinnedToCore(loop2, "loop2", 4096, NULL, 1, NULL, 0);

    }
    //***********************************************************************************************************
    void loop() {


    }
    //***********************************************************************************************************
    void loop1(void *pvParameters) {

    while (1) {

    gps();

    }
    }
    //***********************************************************************************************************
    void loop2(void *pvParameters) {

    while (1) {

    temp_millis = millis();
    if(temp_millis>temp_millis_1 ) { temp_millis_1 = temp_millis+2000; meghiv(); }

    }
    }
    //***********************************************************************************************************

    Ami fontos, hogy a gps függvénynek minden ciklusban hívódnia kell a loop1-ben, az nem állhat meg, mert akkor nem tudja beolvasni a gps vevőt a serial porton.
    Minden más programrész a loop2-ben van, aminél nem számít, ha le is lassul a ciklusidő pár másodpercre. Ott amúgy is 2másodpercenként hívom meg a meghív függvényt.

    [ Szerkesztve ]

  • Janos250

    őstag

    válasz Panhard #7788 üzenetére

    Igen, erről érdemes még néhány szót szólni, hátha másnak is lesz ilyen problémája.
    Nem a másik core-on futó taskot fogta meg, hanem ugyanazon a core-on a többi taskot.
    Ugyanis a freeRTOS futtat még pár egyéb rendszer-taskot is, amit pontosan nem tudunk mit, mert elvileg a
    vTaskList() lenne hivatott kilistázni, de az Arduino alatt valamiért nem működik.
    Írjuk be a következő programot:

    void loop() {
    Serial.println("loop begin");
    uint8_t i = uxTaskGetNumberOfTasks( );
    Serial.print("uxTaskGetNumberOfTasks = "); Serial.println(i);
    delay(60000) ;
    Serial.println("loop end");
    } ; // end loop

    A WDT nem okoz gondot, hiába a hosszú várakozás, mert a scheduler által beállított prioritások miatt futhat a többi task is.
    Ezt a kiírást kapjuk:
    uxTaskGetNumberOfTasks = 7

    Tehát a mi loop taskunkon kívül még vannak a core-on hatan, akik szintén futni akarnak.
    Ezért lényeges a prioritás.

    Ha megnézzük a main.cpp-t :
    void loopTask(void *pvParameters)
    {
    setup();
    for(;;) {
    micros(); //update overflow
    loop();
    }
    }

    extern "C" void app_main()
    {
    initArduino();
    xTaskCreatePinnedToCore(loopTask, "loopTask", 8192, NULL, 1, NULL, ARDUINO_RUNNING_CORE);
    }
    Itt a loop prioritása 1, így igazából én sem teljesen értem, hogy miért nem futhatnak a többiek is, hiszen a loop prioritása is 1, meg Te is ugyanezt a prioritást adtad, de valahogy mégis megfogja a többit.
    Tehát mégis az van, hogy ha valaki hatalomra jut, és olyan hangosan kiabál, hogy senki mást nem hagy szóhoz jutni, akkor egy idő után a WDT miatt összeomlik a rendszer. Szükséges egy delay!

    Még egy megjegyzés:
    Ha a loopodat akarod a másik core-ra tenni, azt a mainben tudod átírni, az xTaskCreatePinnedToCore paraméterében. Én néha átteszem a core0-ra, ha a core1-en elég időkritikus taskot futtatok.

    Az amerikaiak $ milliókért fejlesztettek golyóstollat űrbéli használatra. Az oroszok ceruzát használnak. Én meg arduinot.

  • Janos250

    őstag

    válasz Panhard #7788 üzenetére

    Még valami:
    Az esp_task_wdt_feed() -et és az esp_task_wdt_delete() -et hiába teszed be, mert az csak arra a taskra hatásos, amibe betetted. Ez is mutatja, hogy valamelyik másik task csinál balhét.

    Az amerikaiak $ milliókért fejlesztettek golyóstollat űrbéli használatra. Az oroszok ceruzát használnak. Én meg arduinot.

Új hozzászólás Aktív témák