Windows ™ versus Linux on intel Galileo
Here is a really quick and dirty, non scientific comparison of a Galileo GEN1 board running Windows ™ against the same board running linux.
SPI Flash version is 1.0.2.
Login to windows is via telnet. Login to linux is via ssh.
Time taken from power-on to login:
Linux 48 Seconds Windows 68 Seconds
Time taken to power off:
Linux 3.25 Seconds Windows 12.54 Seconds
Next I wrote a simple ‘blink’ executable thats sets up Pin 13 for GPIO and then turns it on/off in a tight loop. Source code for both is below. Both are built in ‘release’ mode.
To write the app for Windows on Galileo you need an external PC running Windows 7 or later, and Visual Studio 2013 or later, with the Microsoft IoT dev kit extensions installed.
To write the app for Linux, you need any PC or Terminal capable of attaching via telnet or RS232.
Size of simple ‘blink’ executable
Linux 10080 Bytes Windows 19456 Bytes
Speed of executing GPIO Writes
The simple app after setting up the GPIO runs in a tight loop just switching the GPIO Pin to 1 and 0 continuously.
The Linux loop:
while(1)
{
write(fd,"1",1);
write(fd,"0",1);
}
The windows loop:
while(1){
digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
digitalWrite(led, HIGH); // turn the LED on by making the voltage HIGH
}
These gave the following results:
The Linux version gave a steady 223.9 Hz square wave with a 50% duty cycle. Pulse width is about 2.24 ms.
The Windows version gave a jittery 42.72 Hz wave with a 35% Duty cycle. Pulse width is about 14.97 ms, but there were occasional gaps in the wave form where it paused for 10 ms or so.
And finally, the full source code for each of the test apps.
Linux source code:
#include <stdint.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> void setGPIOPin(char* pin, char* dir, char* drive, char* val) { char buf[256]; int fd; // Open the GPIO Export file fd = open("/sys/class/gpio/export",O_WRONLY); if(fd == -1) exit(-1); // Export chosen pin write(fd, pin, strlen(pin)); // Export GPIO pin close(fd); // Open exported pin DIRECTION file sprintf(buf,"/sys/class/gpio/gpio%s/direction",pin); fd = open(buf,O_WRONLY); // open GPIOxx direction file if(fd==-1) exit(-1); // write out the direction write(fd,dir,strlen(dir)); // set GPIOxx direction to out close(fd); // open the drive file sprintf(buf,"/sys/class/gpio/gpio%s/drive",pin); fd = open(buf,O_WRONLY); // open GPIO drive strength file if(fd==-1) exit(-1); write(fd,drive,strlen(drive)); // set GPIO drive close(fd); sprintf(buf,"/sys/class/gpio/gpio%s/value",pin); fd = open(buf,O_WRONLY); if(fd==-1) exit(-1); write(fd,val,strlen(val)); // set GPIO value close(fd); } void setMux(void) { // Switch all the SPI1 pins through to the header pins. And enable level shifter. setGPIOPin("55","out","pullup","1"); // mux setGPIOPin("39","out","pullup","1"); // Pin 13 setGPIOPin("4","out","pullup","1"); // Level shifter } int main(int argc, char *argv[]) { int fd; setMux(); fd = open("/sys/class/gpio/gpio39/value",O_WRONLY); if(fd==-1) { printf("Failed to open GPIO On pin 13\n"); exit(-1); } while(1) { write(fd,"1",1); write(fd,"0",1); } return 0; }
Windows Source code:
#include "stdafx.h"
#include "arduino.h"
int _tmain(int argc, _TCHAR* argv[])
{
return RunArduinoSketch();
}
int led = 13; // This is the pin the LED is attached to.
void setup()
{
pinMode(led, OUTPUT); // Configure the pin for OUTPUT so you can turn on the LED.
}
// the loop routine runs over and over again forever:
void loop()
{
digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
digitalWrite(led, HIGH); // turn the LED on by making the voltage HIGH
}
How To spot a fake or phishing email. The difference between the UK, England and Great Britain explained.