3 Replies Latest reply on May 25, 2015 1:45 PM by PabloM_Intel

    Issue :High CPU Usage when using Arduino WIFI in a thread

    Jacen

      Hi all,

      I found a issue ,that is when you running the Arduino WIFI operation into a thread ,the usage of CPU would be super high ,but if you put same code in to main thread (main function ),the usage would be very low.

      Here is a simple code that i changed from Adruino Example ->WIFI->WIFIWebClient ,which i put the major code into a thread ,then if you open your system terminate and type in "top" command. you will find cpu would keeping in a very high level when program start send http string

       

       

      /*

        Web client

       

      This sketch connects to a website (http://www.google.com)

      using a WiFi shield.

       

      This example is written for a network using WPA encryption. For

      WEP or WPA, change the Wifi.begin() call accordingly.

       

      This example is written for a network using WPA encryption. For

      WEP or WPA, change the Wifi.begin() call accordingly.

       

      Circuit:

      * WiFi shield attached

       

      created 13 July 2010

      by dlf (Metodo2 srl)

      modified 31 May 2012

      by Tom Igoe

      */

       

       

       

       

      #include <SPI.h>

      #include <WiFi.h>

       

       

      char ssid[] = "MySSID"; //  your network SSID (name)

      char pass[] = "passowrd";    // your network password (use for WPA, or use as key for WEP)

      int keyIndex = 0;            // your network key Index number (needed only for WEP)

       

       

      int status = WL_IDLE_STATUS;

      // if you don't want to use DNS (and reduce your sketch size)

      // use the numeric IP instead of the name for the server:

      //IPAddress server(74,125,232,128);  // numeric IP for Google (no DNS)

      char server[] = "www.google.com";    // name address for Google (using DNS)

       

       

      // Initialize the Ethernet client library

      // with the IP address and port of the server

      // that you want to connect to (port 80 is default for HTTP):

      WiFiClient client;

       

       

      void* MyThread(void *parm)

      {

        char c;

          // attempt to connect to Wifi network:

        while (status != WL_CONNECTED) {

          Serial.print("Attempting to connect to SSID: ");

          Serial.println(ssid);

          // Connect to WPA/WPA2 network. Change this line if using open or WEP network:   

          status = WiFi.begin(ssid, pass);

       

          // wait 10 seconds for connection:

          delay(10000);

        }

        Serial.println("Connected to wifi");

        printWifiStatus();

       

        Serial.println("\nStarting connection to server...");

        // if you get a connection, report back via serial:

        if (client.connect(server, 80)) {

          Serial.println("connected to server");

          // Make a HTTP request:

          client.println("GET /search?q=arduino HTTP/1.1");

          client.println("Host: www.google.com");

          client.println("Connection: close");

          client.println();

        }

       

          while(1)

        {

            while (client.available())

            {

          c = client.read();

          Serial.write(c);

            }

        }

       

       

        // if the server's disconnected, stop the client:

        if (!client.connected()) {

          Serial.println();

          Serial.println("disconnecting from server.");

          client.stop();

        }

      }

       

       

       

       

      void setup() {

        int rc;

        pthread_t aThread;

        //Initialize serial and wait for port to open:

        Serial.begin(9600);

        while (!Serial) {

          ; // wait for serial port to connect. Needed for Leonardo only

        }

       

        // check for the presence of the shield:

        if (WiFi.status() == WL_NO_SHIELD) {

          Serial.println("WiFi shield not present");

          // don't continue:

          while(true);

        }

       

       

        String fv = WiFi.firmwareVersion();

        if( fv != "1.1.0" )

          Serial.println("Please upgrade the firmware");

         

         

       

        // attempt to connect to Wifi network:

        while (status != WL_CONNECTED) {

          Serial.print("Attempting to connect to SSID: ");

          Serial.println(ssid);

          // Connect to WPA/WPA2 network. Change this line if using open or WEP network:   

          status = WiFi.begin(ssid, pass);

       

          // wait 10 seconds for connection:

          delay(10000);

        }

        Serial.println("Connected to wifi");

        printWifiStatus();

      rc = pthread_create(&aThread, NULL, MyThread, NULL);

      }

       

       

      void loop() {

       

       

      }

       

       

       

       

      void printWifiStatus() {

        // print the SSID of the network you're attached to:

        Serial.print("SSID: ");

        Serial.println(WiFi.SSID());

       

       

        // print your WiFi shield's IP address:

        IPAddress ip = WiFi.localIP();

        Serial.print("IP Address: ");

        Serial.println(ip);

       

       

        // print the received signal strength:

        long rssi = WiFi.RSSI();

        Serial.print("signal strength (RSSI):");

        Serial.print(rssi);

        Serial.println(" dBm");

      }

       

       

       

       

       

       

       

      Thanks

      Jacen