lunedì 16 maggio 2016

Opzioni di compilazione gcc in Eclipse e Netbeans

Un promemoria su come configurare gli switch di compilazione di gcc con Eclipse e Netbeans
In entrambi i casi si deve cliccare destro sul nome del progetto ed aprire le proprieta'

Eclipse

Optimizzazione e debug -O3 -Wall

 Include switch -I
Per lo switch -lm per esempio si scrive sono m omettendo -l
Library switch -l -L


Netbeans

Inclusione di librerie ed headers


Per aggiungere lo switch -l in Netbeans si apre Add Option/Other Option e si digita lo switch completo (al contrario di Eclipse)


collect2.exe: ld returned error 5 exit status

L'errore ld returned error 5 sul file collect2.exe  dovrebbe essere limitato all'IDE di Arduino 1.6.8 su piattaforma Windows XP.

In pratica compilando sketch perfettamente funzionanti puo' verificarsi che non venga generato l'eseguibile


L'errore e' visibile solo abilitando l'output dettagliato in fase di compilazione (da File/Impostazioni/Mostra output dettagliato) e si tratta dell'impossibilita' di rinominare un file temporaneo


L'errore non e' presente nella versione per Linux od in versioni precedenti dell'IDE di Arduino







Fractint per Arduino

Questo post prende spunto da Fractint, un software ormai molto datato (e' uno dei programmi open source che da piu' tempo e' sempre sviluppato) che permetteva il calcolo "veloce" di frattali nei calcolatori che erano privi di coprocessore matematico utilizzando gli interi per calcoli in virgola mobile.



Voluto vedere se riuscivo a fare qualcosa di simile con Arduino. Per fare cio' ho utilizzato la libreria AVRFix , libreria appositamente studiata per processori ATMEL

Il programma senza nessun tipo di ottimizzazione ha mostrato un tempo di esecuzione pari a 7581 ms. A parita' di condizioni di schermo la libreria AVRFix con il tipo di variabile short ha quasi dimezzato il tempo di calcolo per un totale di 4434 ms

Ovviamente questa non e' una soluzione generale. Basta infatti cambiare il tipo di varibiale lasciando intatto il codice per usa AVRFix che le prestazioni decadono rapidamente a 10590 ms per il tipo di varibile l a 18464 ms per il tipo di variabile ll

No AVRFix (7581 ms)
-----------------------------------------
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);



#define SCREEN_WIDTH 32
#define SCREEN_HEIGHT 128

#if (SSD1306_LCDHEIGHT != 32)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

//float re_min = -2.019531;
float a = -2.003906;
float im_min = -1.275;
float re_factor = 0.019531;
float im_factor = 0.075;

unsigned long tempo;

float b;
float x,y,x_new,y_new;

int k,j,i;

void setup()   {
  Serial.begin(115200);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  
  display.display();
  delay(100);
  display.clearDisplay();

  tempo = millis();
  
  for (i=0;i<SCREEN_HEIGHT;i++)
     {
     a = a + re_factor;
     b = im_min;
     for (j=0;j<SCREEN_WIDTH;j++)
      {
        b=b+im_factor;
        x = 0;
        y = 0;
      
        for (k=0;k<=64;k++)
            {
            x_new = (x*x)-(y*y)+a;
            y_new = (2*x*y)+b;
            if (((x_new*x_new)+(y_new*y_new))>4)
                {
                display.drawPixel(i, j, WHITE);
                //
                break;
                }
       x = x_new;
       y = y_new;
       } 
      }
     }
Serial.println(millis()-tempo);
display.display();
}


void loop() {
}
-----------------------------------------

AVRFix (tipo short 4728 ms)
-----------------------------------------
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 4

Adafruit_SSD1306 display(OLED_RESET);
extern "C"{
  #include <avrfix.h>
}

#define WIDTH 32
#define HEIGHT 128
lfix_t Im = ftosk(-1.275);
lfix_t DRe = ftosk(0.02);
lfix_t DIm = ftosk(0.075);
lfix_t A = ftosk(-2.0);
lfix_t B = ftosk(0.0);
lfix_t DUE = ftosk(2.0);
lfix_t X,Y;
lfix_t XN,YN,YNN;
lfix_t tt;
int j,k,i;
float test;

unsigned long tempo;

void setup() {
  Serial.begin(115200);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  
  display.display();
  delay(100);
  display.clearDisplay();
  tempo = millis();
  
  for (i=0;i<HEIGHT;i++)  
    {
      A=A+DRe;
      B=Im;
      for (j=0;j<WIDTH;j++)
        {
          B=B+DIm;
          X = ftosk(0.0); 
          Y = ftosk(0.0);
          for (k=0;k<=64;k++)
              {
               XN = smulsk(X, X)-smulsk(Y, Y)+A;
               YN = smulsk(X, Y);
               YNN = smulsk(X, Y);
               YN = smulsk(DUE, YNN) + B;
               tt = smulsk(XN,XN)+smulsk(YN,YN);
               test = sktof(tt);
               if (test > 4.0)
                    {
                        display.drawPixel(i, j, WHITE);
                        break;
                    }
               X=XN;
               Y=YN;
              }
        }
    }
  

  Serial.println(millis()-tempo);
  display.display();
  
}

void loop() {
}
-----------------------------------------

AVRFix (tipo l 10590 ms)
-----------------------------------------
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 4

Adafruit_SSD1306 display(OLED_RESET);
extern "C"{
  #include <avrfix.h>
}

#define WIDTH 32
#define HEIGHT 128
//lfix_t Re = ftolk(-2.00390625); 
lfix_t Im = ftosk(-1.275);
lfix_t DRe = ftok(0.019531);
lfix_t DIm = ftok(0.075);
lfix_t A = ftok(-2.00390625);
lfix_t B = ftok(0.0);
lfix_t DUE = ftok(2.0);
lfix_t X,Y;
lfix_t XN,YN,YNN;
lfix_t tt;
int j,k,i;
double test;

unsigned long tempo;

void setup() {
  Serial.begin(115200);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  
  display.display();
  delay(100);
  display.clearDisplay();
  tempo = millis();
  
  for (i=0;i<HEIGHT;i++)  
    {
      A=A+DRe;
      B=Im;
      for (j=0;j<WIDTH;j++)
        {
          B=B+DIm;
          X = ftok(0.0); 
          Y = ftok(0.0);
          for (k=0;k<=64;k++)
              {
               XN = mulk(X, X)-mulk(Y, Y)+A;
               YN = mulk(X, Y);
               YNN = mulk(X, Y);
               YN = mulk(DUE, YNN) + B;
               tt = mulk(XN,XN)+mulk(YN,YN);
               test = ktod(tt);
               if (test > 4.0)
                    {
                        display.drawPixel(i, j, WHITE);
                        break;
                    }
               X=XN;
               Y=YN;
              }
        }
    }
  

  Serial.println(millis()-tempo);
  display.display();
  
}

void loop() {

}
-----------------------------------------

AVRFix (tipo ll 18464 ms)
-----------------------------------------
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 4

Adafruit_SSD1306 display(OLED_RESET);
extern "C"{
  #include <avrfix.h>
}

#define WIDTH 32
#define HEIGHT 128
//lfix_t Re = ftolk(-2.00390625); 
lfix_t Im = ftolk(-1.275);
lfix_t DRe = ftolk(0.019531);
lfix_t DIm = ftolk(0.075);
lfix_t A = ftolk(-2.00390625);
lfix_t B = ftolk(0.0);
lfix_t DUE = ftolk(2.0);
lfix_t X,Y;
lfix_t XN,YN,YNN;
lfix_t tt;
int j,k,i;
double test;

unsigned long tempo;

void setup() {
  Serial.begin(115200);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  
  display.display();
  delay(100);
  display.clearDisplay();
  tempo = millis();
  
  for (i=0;i<HEIGHT;i++)  
    {
      A=A+DRe;
      B=Im;
      for (j=0;j<WIDTH;j++)
        {
          B=B+DIm;
          X = ftolk(0.0); 
          Y = ftolk(0.0);
          for (k=0;k<=64;k++)
              {
               XN = lmullk(X, X)-lmullk(Y, Y)+A;
               YN = lmullk(X, Y);
               YNN = lmullk(X, Y);
               YN = lmullk(DUE, YNN) + B;
               tt = lmullk(XN,XN)+lmullk(YN,YN);
               test = lktod(tt);
               if (test > 4.0)
                    {
                        display.drawPixel(i, j, WHITE);
                        
                        break;
                    }
               X=XN;
               Y=YN;
              }
        }
    }
  

  Serial.println(millis()-tempo);
  display.display();
  
}

void loop() {

}
-----------------------------------------


Disclaimer: il titolo di questo post non e' da intendersi come un plagio verso il nome del piu' noto software Fractint ma piuttosto come un tributo ad un programma che usavo sui 386 nei primi anni 90



Roccia lunare 14310

----------------------------------------------
Aggiornamento importante a questo post
----------------------------------------------
Ho avuto la fortuna di poter osservare da vicino (e come geologo e' una esperienza particolare) un frammento di roccia lunare ritagliato da campione piu' grande prelevato dalla missione Apollo 14


La roccia deriva dal punto G della seconda escursione lunare (scheda completa qui)



Le quattro facce (fotografabili) del campione. Di particolare interesse e' la foto sottostante perche' questo lato era quello esposto (gli altri lati derivano dal taglio effettuato a terra) e presenti segni dei micro meteoriti che hanno "lavorato" la superficie






Si tratta di una roccia decisamente giovane (circa 4 milioni di anni)  per lo standard lunare.
L'esame petrografico (originale a questo link) mostra un basalto feldspatico a grana fine e viene definito come composizione KREEP (Potassio, Terre Rare e Fosforo), ultimo resto del frazionamento del magma che ha formato la crosta lunare e che essendo composto da elementi incompatibili per entrare nella struttura cristallina rimangono isolati all'interno del magma stesso (fonte wikipedia, wikipedia inglese). I magmi ricchi in KREEP si sarebbero segregati tra la crosta ed il mantello lunare. Sono presenti fenocristalli di plagioclasi e pirosseni negli interstizi

Questo era l'aspetto della roccia lunare prima di essere sezionata per le analisi, piu' o come come la hanno vista Shepard e Mitchell (in origine era mezza sepolta dalla regolite dalla regolite). Non ci sono foto realizzate sulla Luna di questo esemplare


Come detto non esistono foto dirette del punto di campionamento. Questa dovrebbe essere nella zona compresa tra la stazione C1 ed H (nel mezzo tra le due c'e' la stazione G) ripresa da Project Apollo Archive

AS14-68-9471HR.jpg




venerdì 13 maggio 2016

Mandelbrot con GMP

Avevo gia' utilizzato la libreria GMP in questo post per il calcolo di PiGreco
Questa volta la utilizzero' per effettuare zoom estremi dell'insieme di Mandelbrot grazie alla sua caratteristica di poter utilizzare una precisione arbitraria ovvero di poter settare il numero di bit che rappresentano una quantita' in virgola mobile. Il tipo float cambia a seconda da compilatore a compilatore e da processore a processore ma diciamo che in generale puo' essere considerato a 32 bit, il che va bene quando il numero di cifre significative non e' molto esteso

Per mostrare la differenza nell'uso di GMP rispetto al solo tipo float ho scritto due programmi ed ho effettuato due zoom dell'insieme di Mandelbrot

Zoom 1:
In questo caso il risultato e' identico
GMP

Float


Zoom 2
Riducendo la finestra di visualizzazione di centesimo rispetto allo zoom precedente GMP continua a lavorare in modo corretto mentre il programma scritto in C++ puro "esplode"
GMP


Float

Naturalmente tutto cio' ha un prezzo in termini di memoria consumata (la precisione e' vero che e' arbitraria ma deve comunque fare i conti con la ram disponibile) ed il tempo di calcolo (ovviamente piu' lento con GMP).Curiosamente provando a lanciare questo programma in macchina virtuale VMWare, il programma mi diceva che non aveva abbastanza memoria disponibile e sono passato ad un calcolatore reale

esempio con l'utilizzo di GMP
----------------------------------------------------------

#include <stdio.h>
#include <math.h>
#include <gmp.h>
#include <iostream>

using namespace std;

#include <pngwriter.h>

#define SCREEN_WIDTH 1280
#define SCREEN_HEIGHT 960


int main(void){

mpf_t A,B, Im, DRe, DIm,test;
mpf_t X,Y,XN,YN,XX,YY,Xs,Ys;
float test2;

int j,k,i;

long int precision = 256;
double r;




mpf_set_default_prec(precision);

mpf_init2(A,precision);
mpf_init2(B,precision);
mpf_init2(Im,precision);
mpf_init2(DRe,precision);
mpf_init2(DIm,precision);
mpf_init2(test,precision);
mpf_init2(X,precision);
mpf_init2(Y,precision);
mpf_init2(XN,precision);
mpf_init2(YN,precision);
mpf_init2(XX,precision);
mpf_init2(YY,precision);
mpf_init2(Xs,precision);
mpf_init2(Ys,precision);

// punto vertice
// Re = -0.74364085
// Im = 0.13182733
// Diametro = 0.00012068
// Zoom = 25497

pngwriter png(SCREEN_WIDTH,SCREEN_HEIGHT,0,"mandelbrot2.png");
double iterazioni = 1024;

mpf_set_d(A,-0.74364085);
//mpf_set_d(A,-0.74370119);
mpf_set_d(B,0.13182733);
mpf_set_d(Im,0.13182733);
mpf_set_d(DRe,0.000000009428125);
mpf_set_d(DIm,0.00000001257083);



mpf_set_d(X,0.0);
mpf_set_d(Y,0.0);
mpf_set_d(Xs,0.0);
mpf_set_d(Ys,0.0);
mpf_set_d(XX,0.0);
mpf_set_d(YY,0.0);
mpf_set_d(XN,0.0);
mpf_set_d(YN,0.0);

cout << "Inizio" << endl;

for (i=0;i<SCREEN_HEIGHT;i++)
    {
    mpf_add(A,A,DRe);
    mpf_set(B,Im);
    for (j=0;j<SCREEN_WIDTH;j++)
    {
    mpf_add(B,B,DIm);
    mpf_set_d(X,0.0);
    mpf_set_d(Y,0.0);

    for (k=0;k<=iterazioni;k++)
        {
        mpf_pow_ui(Xs,X,2);
        mpf_pow_ui(Ys,Y,2);
        mpf_sub(XN,Xs,Ys);
        mpf_add(XN,XN,A); //XN = (x*x)-(y*y) +a
        mpf_mul(YN,X,Y);
        mpf_mul_ui(YN,YN,2);
        mpf_add(YN,YN,B); //YN = 2*X*Y

        mpf_pow_ui(XX,XN,2);
        mpf_pow_ui(YY,YN,2);
        mpf_add(test,XX,YY);// test = (XN*XN)+(YN*YN)
        test2 = mpf_get_d(test);
        if (test2 > 4.0)
            {
            r = k%2;
            png.plot(j,i,r,r,r);
            break;
            }
        mpf_set(X,XN);
        mpf_set(Y,YN);
        }
    }
    }

png.close();

mpf_clear(A);
mpf_clear(B);
mpf_clear(A);
mpf_clear(Im);
mpf_clear(DRe);
mpf_clear(DIm);
mpf_clear(X);
mpf_clear(Y);
mpf_clear(Xs);
mpf_clear(Ys);
mpf_clear(XX);
mpf_clear(YY);
mpf_clear(XN);
mpf_clear(YN);
mpf_clear(test);

cout << "Fine" << endl;

return 0;
}


----------------------------------------------------------
esempio in C++ puro
----------------------------------------------------------
#include <pngwriter.h>

#define SCREEN_WIDTH 1280
#define SCREEN_HEIGHT 960



// punto vertice
// Re = -0.74364085
// Im = 0.13182733
// Diametro = 0.00012068
// Zoom = 25497

double iterazioni = 1024;

float a = -0.74364085;
float b = 0.13182733;
float im = 0.13182733;

float dre = 0.000000009428125;
float dim = 0.00000001257083;


double r;

float x,y,x_new,y_new;

int test;

int k,j,i;

int keypress = 0;


int main() {

pngwriter png(SCREEN_WIDTH, SCREEN_HEIGHT,0,"mand_norm2.png");


for (i=0;i<SCREEN_HEIGHT;i++)
 {
 a=a+dre;
 b=im;
 for (j=0;j<SCREEN_WIDTH;j++)
  {
  b = b+dim;

  x = 0;
  y = 0;
  test = 0;

  for (k=0;k<=iterazioni;k++)
   {
   x_new = (x*x)-(y*y)+a;
   y_new = (2*x*y)+b;
   if (((x_new*x_new)+(y_new*y_new))>4)
    {
    r = k%2;
    png.plot(j,i, r, r, r);
    break;
    }
   x = x_new;
   y = y_new;
   }

  }

 }
png.close();
return(0);

}

----------------------------------------------------------







Intel Edison ed Arduino

La programmazione della parte Arduino Kit legato ad una Intel Edison si effettua mediante l'Arduino IDE.
La prima cosa da fare e' configurare il dispositivo perche' di default non e' inserito nella lista delle schede conosciute dall'IDE


Si procede selezionando il menu Strumenti dalla Arduino IDE/Scheda/Gestore Scheda. Si apre un menu e si cerca e si installa Intel i686 Boards

Per la programmazione si deve usare la microUsb di collegamento seriale OTG (J22) e non la porta J16 (terminale seriale) che puo' essere disconnessa.

A questo punto vengono scaricati i file e l'installazione ....si pianta (almeno sulla mia Centos 7). Per installare la Edison si deve andare nella propria home nella sottocartella (o qualcosa di simile)

/home/linnocenti/.arduino15/packages/Intel/tools/core2-32-poky-linux/1.6.2+1.0/i686

ed editare il file ./install_script.sh alla riga 106 (link originale) da

executable_files=$($SUDO_EXEC find "$native_sysroot" -type f -perm +111 -exec printf "\"%s\" " {} \; )

a
executable_files=$($SUDO_EXEC find "$native_sysroot" -type f -perm /111 -exec printf "\"%s\" " {} \; )


Si deve ovviamente cambiare i permessi dell'utente per poter accedere alla porta seriale con

sudo usermod -a -G tty yourUserName
sudo usermod -a -G dialout yourUserName

Edison e Arduino condividono le seguenti porte
Serial (Arduino)-> /dev/ttySG0 (Edison)
Serial1 (Arduino)-> /dev/ttyMFD1 (Edison) corrisponde ai pin D0 e D1 Rx e Tx di Arduino
Serial2 (Arduino)-> /dev/ttyMDF2 (Edison) messaggi del kernel per debug

Compilando e lanciando l'esempio blink si hanno i seguenti messaggi. Per quanto riguarda i messaggi di errore a questo link viene consigliato di usare la IDE 1.6.0 che risulterebbe piu' stabile
--------------------------------------------------
La scheda Intel:i686:izmir_ec non ha la proprietà 'build.board' definita. La imposto automaticamente a I686_IZMIR_EC
ATTENZIONE: La categoria '' della libreria DallasTemperature non è valida. La imposto a 'Uncategorized'
ATTENZIONE: La categoria '' della libreria EEPROM non è valida. La imposto a 'Uncategorized'
ATTENZIONE: La categoria '' della libreria Ethernet non è valida. La imposto a 'Uncategorized'
ATTENZIONE: La categoria '' della libreria EthernetShield non è valida. La imposto a 'Uncategorized'
ATTENZIONE: La categoria '' della libreria OneWire non è valida. La imposto a 'Uncategorized'
ATTENZIONE: La categoria '' della libreria SD non è valida. La imposto a 'Uncategorized'
ATTENZIONE: La categoria '' della libreria SPI non è valida. La imposto a 'Uncategorized'
ATTENZIONE: La categoria '' della libreria Servo non è valida. La imposto a 'Uncategorized'
ATTENZIONE: La categoria '' della libreria SoftwareServo non è valida. La imposto a 'Uncategorized'
ATTENZIONE: La categoria '' della libreria TimerOne non è valida. La imposto a 'Uncategorized'
ATTENZIONE: La categoria '' della libreria USBHost non è valida. La imposto a 'Uncategorized'
ATTENZIONE: La categoria '' della libreria WiFi non è valida. La imposto a 'Uncategorized'
Attenzione: platform.txt del core 'Arduino i686 Boards' contiene la stringa deprecata recipe.ar.pattern="{compiler.path}{compiler.ar.cmd}" {compiler.ar.flags} "{build.path}/{archive_file}" "{object_file}" convertita automaticamente in recipe.ar.pattern="{compiler.path}{compiler.ar.cmd}" {compiler.ar.flags} "{archive_file_path}" "{object_file}". Verifica la disponibilità di un aggiornamento di questo core.

Lo sketch usa 76.331 byte (0%) dello spazio disponibile per i programmi. Il massimo è 10.000.000 byte.
#!/bin/sh

# clupload script to invoke lsz
# Copyright (C) 2014 Intel Corporation
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
starting download script
Args to shell: /home/linnocenti/.arduino15/packages/Intel/tools/sketchUploader/1.6.2+1.0/x86/bin /tmp/buildccb8e9535cf076aa288bd991e81fb898.tmp/Blink.ino.elf /dev/ttyACM0
Serial Port PORT
Using tty Port /dev/ttyACM0
Sending Command String to move to download if not already in download mode
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
#

echo "starting download script"
echo "Args to shell:" $*
#
# ARG 1: Path to lsz executable.
# ARG 2: Elf File to download
# ARG 3: TTY port to use.
#
#path may contain \ need to change all to /
path_to_exe=$1
fixed_path=${path_to_exe//\\/\/}
#
tty_port_id=$3
echo "Serial Port PORT" $com_port_id
echo "Using tty Port" $tty_port_id
#
echo "Sending Command String to move to download if not already in download mode"
echo "~sketch downloadEdison" > $tty_port_id
#Give the host time to stop the process and wait for download
sleep 1
#
Deleting existing sketch on target
#Move the existing sketch on target.
echo "Deleting existing sketch on target"
"$fixed_path/lsz" --escape -c "mv -f /sketch/sketch.elf /sketch/sketch.elf.old" < $tty_port_id > $tty_port_id

Transfer incomplete
#
# Execute the target download command
#
#Download the file.
host_file_name=$2
"$fixed_path/lsz" --escape --binary --overwrite $host_file_name < $tty_port_id  > $tty_port_id
Sending: Blink.ino.elf

Bytes Sent:   1024/  75668   BPS:226647   ETA 00:00 
Bytes Sent:   9216/  75668   BPS:1890482  ETA 00:00 
Bytes Sent:  10240/  75668   BPS:2070761  ETA 00:00 
Bytes Sent:  11264/  75668   BPS:2253715  ETA 00:00 
Bytes Sent:  12288/  75668   BPS:2433294  ETA 00:00 
Bytes Sent:  13312/  75668   BPS:2606047  ETA 00:00 
Bytes Sent:  14336/  75668   BPS:2777730  ETA 00:00 
Bytes Sent:  15360/  75668   BPS:2945389  ETA 00:00 
Bytes Sent:  16384/  75668   BPS:3104141  ETA 00:00 
Bytes Sent:  17408/  75668   BPS:3263507  ETA 00:00 
Bytes Sent:  18432/  75668   BPS:3425317  ETA 00:00 
Bytes Sent:  19456/  75668   BPS:3599663  ETA 00:00 
Bytes Sent:  20480/  75668   BPS:3766689  ETA 00:00 
Bytes Sent:  21504/  75668   BPS:3928323  ETA 00:00 
Bytes Sent:  22528/  75668   BPS:4096652  ETA 00:00 
Bytes Sent:  23552/  75668   BPS:4257391  ETA 00:00 
Bytes Sent:  24576/  75668   BPS:4423241  ETA 00:00 
Bytes Sent:  25600/  75668   BPS:3941494  ETA 00:00 
Bytes Sent:  26624/  75668   BPS:4046863  ETA 00:00 
Bytes Sent:  27648/  75668   BPS:4164480  ETA 00:00 
Bytes Sent:  28672/  75668   BPS:4279378  ETA 00:00 
Bytes Sent:  29696/  75668   BPS:4388951  ETA 00:00 
Bytes Sent:  30720/  75668   BPS:4498447  ETA 00:00 
Bytes Sent:  31744/  75668   BPS:4498867  ETA 00:00 
Bytes Sent:  32768/  75668   BPS:4569569  ETA 00:00 
Bytes Sent:  33792/  75668   BPS:4632887  ETA 00:00 
Bytes Sent:  34816/  75668   BPS:4747208  ETA 00:00 
Bytes Sent:  35840/  75668   BPS:4831544  ETA 00:00 
Bytes Sent:  36864/  75668   BPS:4884653  ETA 00:00 
Bytes Sent:  37888/  75668   BPS:4943039  ETA 00:00 
Bytes Sent:  38912/  75668   BPS:4955029  ETA 00:00 
Bytes Sent:  39936/  75668   BPS:5038615  ETA 00:00 
Bytes Sent:  40960/  75668   BPS:5125718  ETA 00:00 
Bytes Sent:  41984/  75668   BPS:5210179  ETA 00:00 
Bytes Sent:  43008/  75668   BPS:5259603  ETA 00:00 
Bytes Sent:  44032/  75668   BPS:5306389  ETA 00:00 
Bytes Sent:  45056/  75668   BPS:5350468  ETA 00:00 
Bytes Sent:  46080/  75668   BPS:5378120  ETA 00:00 
Bytes Sent:  47104/  75668   BPS:5376598  ETA 00:00 
Bytes Sent:  48128/  75668   BPS:5456654  ETA 00:00 
Bytes Sent:  49152/  75668   BPS:5510342  ETA 00:00 
Bytes Sent:  50176/  75668   BPS:5585577  ETA 00:00 
Bytes Sent:  51200/  75668   BPS:5663045  ETA 00:00 
Bytes Sent:  52224/  75668   BPS:5692542  ETA 00:00 
Bytes Sent:  53248/  75668   BPS:5729267  ETA 00:00 
Bytes Sent:  54272/  75668   BPS:5753981  ETA 00:00 
Bytes Sent:  55296/  75668   BPS:5690094  ETA 00:00 
Bytes Sent:  56320/  75668   BPS:5758030  ETA 00:00 
Bytes Sent:  57344/  75668   BPS:5826506  ETA 00:00 
Bytes Sent:  58368/  75668   BPS:5883234  ETA 00:00 
Bytes Sent:  59392/  75668   BPS:5862332  ETA 00:00 
Bytes Sent:  60416/  75668   BPS:5914414  ETA 00:00 
Bytes Sent:  61440/  75668   BPS:5967995  ETA 00:00 
Bytes Sent:  62464/  75668   BPS:5987179  ETA 00:00 
Bytes Sent:  63488/  75668   BPS:5945122  ETA 00:00 
Bytes Sent:  64512/  75668   BPS:6002283  ETA 00:00 
Bytes Sent:  65536/  75668   BPS:6065936  ETA 00:00 
Bytes Sent:  66560/  75668   BPS:6095743  ETA 00:00 
Bytes Sent:  67584/  75668   BPS:6121225  ETA 00:00 
Bytes Sent:  68608/  75668   BPS:6139987  ETA 00:00 
Bytes Sent:  69632/  75668   BPS:6167541  ETA 00:00 
Bytes Sent:  70656/  75668   BPS:6235591  ETA 00:00 
Bytes Sent:  71680/  75668   BPS:6278929  ETA 00:00 
Bytes Sent:  72704/  75668   BPS:6299557  ETA 00:00 
Bytes Sent:  73728/  75668   BPS:6317676  ETA 00:00 
Bytes Sent:  74752/  75668   BPS:6339755  ETA 00:00  Moving downloaded file to /sketch/sketch.elf on target

Bytes Sent:  75668   BPS:3078945                        

Transfer complete
#
#mv the downloaded file to /sketch/sketch.elf
target_download_name="${host_file_name##*/}"
echo "Moving downloaded file to /sketch/sketch.elf on target"
"$fixed_path/lsz" --escape -c "mv $target_download_name /sketch/sketch.elf; chmod +x /sketch/sketch.elf" < $tty_port_id > $tty_port_id

Transfer complete
#
#
Trovata libreria non valida in /home/linnocenti/.arduino15/packages/Intel/hardware/i686/1.6.2+1.0/libraries/Wire: /home/linnocenti/.arduino15/packages/Intel/hardware/i686/1.6.2+1.0/libraries/Wire
Trovata libreria non valida in /home/linnocenti/.arduino15/packages/Intel/hardware/i686/1.6.2+1.0/libraries/Wire: /home/linnocenti/.arduino15/packages/Intel/hardware/i686/1.6.2+1.0/libraries/Wire
--------------------------------------------------

Ublox M8T + Intel Edison + RTKLib

Collegare un Ublox M8T e processare i dati direttamente all'interno della Edison con RTKLib e' un procedimento estremamente lineare e simile a quello di un normale PC


Il GPS, al contrario di YUN, viene riconosciuto immediatamente e le librerie RTKLib si compilano direttamente sulla Intel, complice anche l'assenza di dipendenze da altre librerie

L'unica accortezza e' quella di spostare lo switch SW1 verso la porta USB tipo A per abilitare questa porta (e conseguentemente disabilitare la porta microUsb OTG)

Debugger integrato ESP32S3

Aggiornamento In realta' il Jtag USB funziona anche sui moduli cinesi Il problema risiede  nell'ID USB della porta Jtag. Nel modulo...