martedì 5 novembre 2019
Femore di cervo
Cercando funghi mi sono imbattuto in questo osso semi sepolto. Da una verifica con l'articolo riportato per riferimento alla fine di questo post sembra essere attribuibile ad un femore di cervo, forse un cucciolo viste la modesta lunghezza
lunedì 4 novembre 2019
Librerie con buildroot
per continuare il post precedente volevo provare a cross compilare linkando delle librerie dinamiche.
Il progetto Buildroot rende disponibile un plugin per Eclipse ma e' disponibile solo per Eclipse Luna mentre attualmente e' disponibile la versione 2019 (dove il plugin non funziona)
Se si prova scaricare Eclipse Luna e si cerca di esesguirlo su una Debian 11 non fuzionera' perche' necessita di JDK 11 (su Debian Java 8 e' stato rimosso e di default e' disponibile Java 11).
Non e' possibile usare i repository ufficiali per fare il downgrade per cui' ci si deve appoggiare ad un repository esterno con in comandi
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 0xB1998361219BD9C9
Il progetto Buildroot rende disponibile un plugin per Eclipse ma e' disponibile solo per Eclipse Luna mentre attualmente e' disponibile la versione 2019 (dove il plugin non funziona)
Se si prova scaricare Eclipse Luna e si cerca di esesguirlo su una Debian 11 non fuzionera' perche' necessita di JDK 11 (su Debian Java 8 e' stato rimosso e di default e' disponibile Java 11).
Non e' possibile usare i repository ufficiali per fare il downgrade per cui' ci si deve appoggiare ad un repository esterno con in comandi
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 0xB1998361219BD9C9
echo "deb http://repos.azulsystems.com/debian stable main" | sudo tee /etc/apt/sources.list.d/zulu.list
apt-get install zulu-8
fatto cio' In Help/Install New Software di Eclipse di aggiunge il link
http://buildroot.org/downloads/eclipse/luna
e si installa il plugin Buildroot
Come esempio si puo' provare a linkare in modo dinamico la libreria ZLib
Da make menuconfig di BuildRoot si spunta Register Toolchain within Eclipse dal menu Toolchain
dopo di cio' Target packages/Libraries/Compression/ si seleziona Zlib
si esce si effettua il make
Si ritorna ad Eclipse File/New/Project/Empty Project/Buildroot MIPS e si crea un nuovo file incollando questo esempio https://github.com/madler/zlib/blob/master/test/example.c
Per abilitare la libreria si va in Project Settings/C C++ Build/Settings e si scorre verso destra dal tab Tool Settings fino a trova Pkg-config e si seleziona zlib
L'eseguibile compilato (con il comando file) dovra' contenere la seguente stringa
h5: ELF 32-bit MSB executable, MIPS, MIPS32 version 1 (SYSV), dynamically linked, interpreter /lib/ld-uClibc.so.0, with debug_info, not stripped
Si fa quindi Build e si sposta il progetto sulla Arduino Yun in scp, si cambiano i permessi per l'esecuzione
warning: different zlib version
zlib version 1.2.11 = 0x12b0, compile flags = 0x55
uncompress(): hello, hello!
gzread(): hello, hello!
gzgets() after gzseek: hello!
inflate(): hello, hello!
large_inflate(): OK
after inflateSync(): hello, hello!
inflate with dictionary: hello, hello!
root@Yun2:~# ldd ./h5
libz.so.1 => /usr/lib/libz.so.1 (0x77124000)
libc.so.0 => /lib/libc.so.0 (0x770b8000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x77095000)
ld-uClibc.so.0 => /lib/ld-uClibc.so.0 (0x77146000)
apt-get install zulu-8
fatto cio' In Help/Install New Software di Eclipse di aggiunge il link
http://buildroot.org/downloads/eclipse/luna
e si installa il plugin Buildroot
Come esempio si puo' provare a linkare in modo dinamico la libreria ZLib
Da make menuconfig di BuildRoot si spunta Register Toolchain within Eclipse dal menu Toolchain
dopo di cio' Target packages/Libraries/Compression/ si seleziona Zlib
si esce si effettua il make
Si ritorna ad Eclipse File/New/Project/Empty Project/Buildroot MIPS e si crea un nuovo file incollando questo esempio https://github.com/madler/zlib/blob/master/test/example.c
Per abilitare la libreria si va in Project Settings/C C++ Build/Settings e si scorre verso destra dal tab Tool Settings fino a trova Pkg-config e si seleziona zlib
L'eseguibile compilato (con il comando file) dovra' contenere la seguente stringa
h5: ELF 32-bit MSB executable, MIPS, MIPS32 version 1 (SYSV), dynamically linked, interpreter /lib/ld-uClibc.so.0, with debug_info, not stripped
warning: different zlib version
zlib version 1.2.11 = 0x12b0, compile flags = 0x55
uncompress(): hello, hello!
gzread(): hello, hello!
gzgets() after gzseek: hello!
inflate(): hello, hello!
large_inflate(): OK
after inflateSync(): hello, hello!
inflate with dictionary: hello, hello!
root@Yun2:~# ldd ./h5
libz.so.1 => /usr/lib/libz.so.1 (0x77124000)
libc.so.0 => /lib/libc.so.0 (0x770b8000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x77095000)
ld-uClibc.so.0 => /lib/ld-uClibc.so.0 (0x77146000)
una volta in esecuzione il programma gira anche se si lamenta di una differenza di librerie tra quella linkata da buildroot e quella effettivamente presente sulla Yun
Se si prova a compilare con ncurses la cosa diventa piu' seria perche' buildroot linka contro ncurses 6 mentre su Yun opkg rende disponibili libncurses 5.7.5 ed il programma non si avvia
venerdì 1 novembre 2019
Cross compilare da Debian per Arduino Yun
Seguendo il precedente post su come poter continuare ad usare Yun nonostante il supporto end-of-life sono riuscito a settate la possiblita' di effettuare la cross compilazione da Debian verso Yun
Per prima cosa si scarica Buildroot e lo si configura (make menuconfig) con target MIPS big endian, ELF MIPS32 con toolchain uCLIb abilitando con Gdb per futuri sviluppi. Fatto cio' si lancia make e si aspetta
A questo punto per rendere piu' semplice la cross compilazione si usa Eclipse CDT
Si crea un nuovo progetto C con Cross GCC e si lasciano in bianco GCC Cross Command che saranno compilati in seguito
Si aprono quindi le proprieta' del progetto Eclipse selezionando Cross GCC in ToolChain Editor
Si setta come Prefix (attenzione al meno finale che deve essere incluso) e Path
mips-buildroot-linux-uclibc-
/home/luca/Downloads/buildroot-2019.02.6/output/host/usr/bin
A questo punto C Build Settings/Includes si include la directory
/home/luca/Downloads/buildroot-2019.02.6/output/host/usr/include
tutti i file necessari si trovano nella sottodirectory /output/host/ di Buildroot
Si aggiungono due pathe per le librerie
/home/luca/Downloads/buildroot-2019.02.6/output/host/usr/lib
/home/luca/Downloads/buildroot-2019.02.6/output/host/mips-buildroot-linux-uclibc/lib
Arrivati fino a qui si puo' compilare il file e copiarlo in scp sulla Yun
Per prima cosa si scarica Buildroot e lo si configura (make menuconfig) con target MIPS big endian, ELF MIPS32 con toolchain uCLIb abilitando con Gdb per futuri sviluppi. Fatto cio' si lancia make e si aspetta
A questo punto per rendere piu' semplice la cross compilazione si usa Eclipse CDT
Si crea un nuovo progetto C con Cross GCC e si lasciano in bianco GCC Cross Command che saranno compilati in seguito
Si aprono quindi le proprieta' del progetto Eclipse selezionando Cross GCC in ToolChain Editor
Si setta come Prefix (attenzione al meno finale che deve essere incluso) e Path
mips-buildroot-linux-uclibc-
/home/luca/Downloads/buildroot-2019.02.6/output/host/usr/bin
A questo punto C Build Settings/Includes si include la directory
/home/luca/Downloads/buildroot-2019.02.6/output/host/usr/include
tutti i file necessari si trovano nella sottodirectory /output/host/ di Buildroot
Si aggiungono due pathe per le librerie
/home/luca/Downloads/buildroot-2019.02.6/output/host/usr/lib
/home/luca/Downloads/buildroot-2019.02.6/output/host/mips-buildroot-linux-uclibc/lib
Arrivati fino a qui si puo' compilare il file e copiarlo in scp sulla Yun
giovedì 31 ottobre 2019
Si puo' ancora usare Arduino Yun??
Lo so....le Yun sono un prodotto dismesso da Arduino in tutte le sue versioni ma volevo riusarle per avere una piccola Linux box da nascondere in ufficio con funzione principale di imparare C su sistemi a sola shell
Dimenticavo...esiste il github di OpenWrt-YUN ma se si prova a compilare il codice il procedimento fallisce perche' lo script punta a codice contenuto sul defunto Google Code ed ad un link di Luci non piu' disponibile. Ho provato a correggere i link del file feeds.conf.default con https://github.com/x-wrt/x-wrt e https://github.com/openwrt/luci/tree/luci-0.11 ma senza riuscire a risolvere la situazione in modo completo
src-svn packages https://github.com/arduino/openwrt-packages-yun/trunk
src-svn xwrt https://github.com/x-wrt/x-wrt
src-svn luci https://github.com/openwrt/luci/tree/luci-0.11
src-git routing git://github.com/openwrt-routing/packages.git;for-12.09.x
src-git alljoyn https://github.com/alljoyn/core-openwrt_feed;attitude_adjustment
Per installare GCC su Yun si deve prima espandere la partizione del sistema operativo mediante la SD card perche' il pacchetto opkg e' troppo voluminoso. Si segua il tutorial
https://www.arduino.cc/en/Tutorial/ExpandingYunDiskSpace
usando lo sketch https://www.arduino.cc/en/uploads/Tutorial/YunDiskSpaceExpander.zip
a questo punto si puo'installare il pacchetto con
opkg install yun-gcc
Ma a questo punto ho provato a vedere se riuscivo a cross compilare il codice compilando su Debian e poi inviandolo alla Yun con scp in modo da non avere tempi morti di compilazione di sorgenti impegnativi (la Yun ha un Atheros 9331 che e' veloce ma non cosi' come un I5)
E qui sono iniziati i problemi
Il sistema operativo della Yun (Linino) e' basato su OpenWrt....a proposito gli ultimi aggiornamenti di Linino sono del 2015!!! . Ho compilato quindi l'ultima versione di OpenWrt (la 18) e dopo aver compilato senza error hello_world per MIPS ho ricevuto il seguente errore
/bin/ash: ./hello: not found
usando lo sketch https://www.arduino.cc/en/uploads/Tutorial/YunDiskSpaceExpander.zip
a questo punto si puo'installare il pacchetto con
opkg install yun-gcc
Ma a questo punto ho provato a vedere se riuscivo a cross compilare il codice compilando su Debian e poi inviandolo alla Yun con scp in modo da non avere tempi morti di compilazione di sorgenti impegnativi (la Yun ha un Atheros 9331 che e' veloce ma non cosi' come un I5)
E qui sono iniziati i problemi
Il sistema operativo della Yun (Linino) e' basato su OpenWrt....a proposito gli ultimi aggiornamenti di Linino sono del 2015!!! . Ho compilato quindi l'ultima versione di OpenWrt (la 18) e dopo aver compilato senza error hello_world per MIPS ho ricevuto il seguente errore
/bin/ash: ./hello: not found
dopo essermi grattato la testa per un po' ho capito che OpenWrt 18 e' basato sulle librerie MUSL mentre Linino e' basato su Chaos Calmer (OpernWRT 15) che usava le uCLib
Ho quindi scaricato OpenWRT legacy ma al momento del make menuconfig continuano i problemi perche' lo script non riconosce la presenza del pacchetto Git (si risolve con la patch a questo indirizzo)
La compilazione di interrompe con un errore Please port gnulib freadahead.c to your platform!
Non volendo incasinare il sistema rinuncio...un hardware non male gia' obsoleto
Dimenticavo...esiste il github di OpenWrt-YUN ma se si prova a compilare il codice il procedimento fallisce perche' lo script punta a codice contenuto sul defunto Google Code ed ad un link di Luci non piu' disponibile. Ho provato a correggere i link del file feeds.conf.default con https://github.com/x-wrt/x-wrt e https://github.com/openwrt/luci/tree/luci-0.11 ma senza riuscire a risolvere la situazione in modo completo
src-svn packages https://github.com/arduino/openwrt-packages-yun/trunk
src-svn xwrt https://github.com/x-wrt/x-wrt
src-svn luci https://github.com/openwrt/luci/tree/luci-0.11
src-git routing git://github.com/openwrt-routing/packages.git;for-12.09.x
src-git alljoyn https://github.com/alljoyn/core-openwrt_feed;attitude_adjustment
venerdì 25 ottobre 2019
Mandelbrot C64 con tabella dei quadrati
circa 40 minuti di esecuzione..usando l'algoritmo del post precedente
per togliere un po- di bordo bianco si puo' modificare la riga 60 con
60 FOR JI = -35 TO 0
Si puo' migliorare leggermente
per togliere un po- di bordo bianco si puo' modificare la riga 60 con
60 FOR JI = -35 TO 0
Si puo' migliorare leggermente
mercoledì 23 ottobre 2019
Mandelbrot e lookup table dei quadrati
Questo post deriva dalla lettura di questi due link (1 2)
In pratica oltre all'utilizzo della matematica intera viene calcolata una tabella di lookup dei quadrati dei numeri interi da 0 a 127 in modo che nel ciclo iterativo non si debbano fare i calcoli ma basti recuperare il risultato dalla tabella (la tabella non contiene i quadrati ma i quadrati divisi per il fattore di scala ovvero divisi per 64, operazione che viene effettuata con un bit shift di 6 posizioni)
Con la speranza di fare un porting verso C64 i numeri interi sono compresi da 0 a 65535 con un fattore di scala di 64 (-128 = -2.0, 127=2.0, la tabella dei quadrati non e' necessario che abbia i numeri negativi )
Per evitare di leggere fuori dalla tabella con relativo segmentation fault prima deve essere verifcato che l'indice sia inferiore a 127
---------------------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
int quadrati[127];
int zr,zi,a,k;
// base 1 = 64
int main()
{
// crea matrice dei quadrati
for (int i=0;i<128;i++){
quadrati[i] = (i*i)>>6;
}
for (int jr=-127; jr<127; jr++)
{
for (int ji=-127; ji<127; ji++)
{
zi = zr = 0;
for (k=0; k<=25; k++)
{
a = quadrati[abs(zr)] - quadrati[abs(zi)] + jr;
zi = quadrati[abs(zr)] + quadrati[abs(zi)] - quadrati[abs(zr-zi)] + ji;
zr = a;
if ((abs(zi) >126) || (abs(zr)>126))
{
break;
}
if ((quadrati[abs(zr)]+quadrati[abs(zi)]) > 256)
{
break;
}
}
if (k > 24)
{printf("O");}
else
{printf(" ");}
}
printf("\n");
}
return 0;
}
In pratica oltre all'utilizzo della matematica intera viene calcolata una tabella di lookup dei quadrati dei numeri interi da 0 a 127 in modo che nel ciclo iterativo non si debbano fare i calcoli ma basti recuperare il risultato dalla tabella (la tabella non contiene i quadrati ma i quadrati divisi per il fattore di scala ovvero divisi per 64, operazione che viene effettuata con un bit shift di 6 posizioni)
Con la speranza di fare un porting verso C64 i numeri interi sono compresi da 0 a 65535 con un fattore di scala di 64 (-128 = -2.0, 127=2.0, la tabella dei quadrati non e' necessario che abbia i numeri negativi )
Per evitare di leggere fuori dalla tabella con relativo segmentation fault prima deve essere verifcato che l'indice sia inferiore a 127
---------------------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
int quadrati[127];
int zr,zi,a,k;
// base 1 = 64
int main()
{
// crea matrice dei quadrati
for (int i=0;i<128;i++){
quadrati[i] = (i*i)>>6;
}
for (int jr=-127; jr<127; jr++)
{
for (int ji=-127; ji<127; ji++)
{
zi = zr = 0;
for (k=0; k<=25; k++)
{
a = quadrati[abs(zr)] - quadrati[abs(zi)] + jr;
zi = quadrati[abs(zr)] + quadrati[abs(zi)] - quadrati[abs(zr-zi)] + ji;
zr = a;
if ((abs(zi) >126) || (abs(zr)>126))
{
break;
}
if ((quadrati[abs(zr)]+quadrati[abs(zi)]) > 256)
{
break;
}
}
if (k > 24)
{printf("O");}
else
{printf(" ");}
}
printf("\n");
}
return 0;
}
mercoledì 16 ottobre 2019
Mandelbrot e moltiplicazioni veloci
Correva l'anno 1988...1989....quando su Le Scienze Italia lessi un articolo Dewdney che spiegava l'insieme di Mandelbrot e l'algoritmo per il calcolo consigliando di non usare il comando basic SQR (per calcolare i quadrati) ma usando X*X perche' per la CPU era piu' veloce effettuare il calcolo
Per caso ho trovato una interessante e semplice miglioramento che riduce la quantita' di moltiplicazioni
il ciclo di calcolo in Basic (Rosetta code)
Un primo miglioramento e' quello di sostituire
X*X + Y*Y +X0
con
(X+Y)*(X-Y)+X0
riducendo da 2 ad 1 la moltiplicazione.
Per quanto riguarda il controllo della condizione di uscita
(X*X)+(Y*Y) => 4
puo' essere riscritta
ABS(X) + ABS(Y) => 2.82842712 (equivalente a 2*SQRT(2)
per togliere una ulteriore moltiplicazione 2*X*Y puo' essere risulta con un byte shift a sinistra di 1
Per caso ho trovato una interessante e semplice miglioramento che riduce la quantita' di moltiplicazioni
il ciclo di calcolo in Basic (Rosetta code)
WHILE (x * x + y * y <= (2 * 2) AND iteration < maxIteration) xtemp = x * x - y * y + x0 y = 2 * x * y + y0 x = xtemp iteration = iteration + 1 WENDci sono 6 moltiplicazioni
Un primo miglioramento e' quello di sostituire
X*X + Y*Y +X0
con
(X+Y)*(X-Y)+X0
riducendo da 2 ad 1 la moltiplicazione.
Per quanto riguarda il controllo della condizione di uscita
(X*X)+(Y*Y) => 4
puo' essere riscritta
ABS(X) + ABS(Y) => 2.82842712 (equivalente a 2*SQRT(2)
per togliere una ulteriore moltiplicazione 2*X*Y puo' essere risulta con un byte shift a sinistra di 1
Iscriviti a:
Post (Atom)
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...
-
In questo post viene indicato come creare uno scatterplot dinamico basato da dati ripresi da un file csv (nel dettaglio il file csv e' c...
-
Questo post e' a seguito di quanto gia' visto nella precedente prova Lo scopo e' sempre il solito: creare un sistema che permet...
-
La scheda ESP32-2432S028R monta un Esp Dev Module con uno schermo TFT a driver ILI9341 di 320x240 pixels 16 bit colore.Il sito di riferiment...