Hirdetés

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

  • _q

    addikt

    válasz Janos250 #9062 üzenetére

    0-ás magra raktam a wifi kliens fogadás taskot 0-ás prioritással. Semmi más nem fut rajta, legalább is általam nem, max a háttérben amiről korábban írtál 6-7 task a rendszer által futhat esetleg. A kód elkészültével a végén csak 5-10 percenként akarom hogy hőmérséklet adatot küldjön a kliens (jelenleg 2-10 másodpercekkel teszteltem), de elkerülve, hogy pont akkor történjen más művelet, mikor pont jönne a klienstől adat, minden mást a core 1-re tettem. Az hogy leterhelném a cpu-t nem gondolnám, a fogadáson kívül 1-2 konverziót csinálok csak, de azért bemásolom ide is:

    void wificlientTask( void * parameter)
    {
    unsigned long CLIENT_TIMEOUT = 0;
    int idxBatLevel = 0;
    int idxTemp = 0;
    int i = 0;
    while(1)
    {
    WiFiClient client = wifiServer.available();
    if (client) {
    CLIENT_TIMEOUT = millis();

    while (client.available() == 0) { //itt jon a hiba, timeout-al valtozo idokozonkent
    if((millis() - CLIENT_TIMEOUT) > 10000) {
    Serial.println(">>> Client Timeout !");
    client.stop();
    break;
    }
    }

    if (client.available()) { // if there's bytes to read from the client,
    String clientData = client.readStringUntil('W');
    clientData = clientData + 'W';

    Serial.println(clientData);
    client.stop();

    idxTemp = clientData.indexOf('Y'); //get the index of Y separator (25.47Y)
    idxBatLevel = clientData.indexOf('W'); //get the index of W separator (3.12W)

    clientTemp = clientData.substring(0, idxTemp); //25.47
    clientBatLevel = clientData.substring(idxTemp+1, idxBatLevel); //3.12

    Serial.print("temp: "); Serial.println(clientTemp);
    Serial.print("bat: "); Serial.println(clientBatLevel);
    delay(10);
    }
    else{
    Serial.print("temp: "); Serial.println("-");
    Serial.print("bat: "); Serial.println("-");
    Serial.println("");
    }
    }
    delay(10);
    }
    }

    A javasoltak alapján átraktam a változó deklarálást az elejére, hogy csak 1x történjen meg, ne minden ciklusban, illetve a client.read-et lecseréltem, hát ha az okoz gondot, de nem. (Egyébként érdekes mert én 11 karaktert küldök, még is 12-re kellett a tömböt létrehozzam a client.read-né még. client.print küldésnél a végére betesz valamilyen jelző bitet, \r, \n vagy valamit?)

    "A wifi vétel elvileg pufferelt, és a 0-ás magon fut. "
    Ezt úgy érted, hogy mindegy hogy én a bemásolt task-ot core 0 vagy core 1-re teszem, a wifi fogadása mindenképpen a core 0-án, a háttérben történik? Tehát ha én egy client.read vagy client.readStringUntil meghívást csinálok, akkor már nem a klienstől fog olvasni, hanem egy már háttérben beolvasott bufferből szedi ki az adatot? Tegyük fel működik, hogy átteszem core 1-re a kiolvasást. Akkor a core 0-ra nem tehetek semmit? A core 1-en van ntp lekérdezés, hőmérséklet olvasás, kijelző és még a wifi kliens olvasás is ide kerülne, nem lesz ez sok a core 1-en? A 4 taskból a wifi lekérdezést ezért akartam core 0-ra tenni, hogy még is zökkenőmentesen menjen, mert a core 1 ami igaz nem időkritikus de már így is 3 taskot futtat.

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