Volevo visualizzare i dati contenuti nei file di test del database MNIST spesso usati come esempi delle rete neurali (vedi esempi di TensorFlow)
il formato file e' IDX descritto in fondo alla pagina sopra linkata
----------------------------------------------------------------------------------------
clear all;
filename = "C:/Users/l.innocenti/Downloads/train-images.idx3-ubyte";
immagini_id = fopen(filename,"r");
immagini = fread(immagini_id,Inf,"uint8");
numero_immagini = immagini(7,1)*256+immagini(8,1);
righe = immagini(9,1)*16777216+immagini(10,1)*65536+immagini(11,1)*256+immagini(12,1)*1
colonne = immagini(13,1)*16777216+immagini(14,1)*65536+immagini(15,1)*256+immagini(16,1)*1
indice_immagine = 1016;
im1 = immagini(17+(indice_immagine*784):17+((indice_immagine+1)*784)-1);
im1_s = reshape(im1,28,28);
imshow(fliplr(rot90(im1_s,-1)),[]); # mostra a scala di grigi
f2 = "C:/Users/l.innocenti/Downloads/train-labels.idx1-ubyte";
f2_id = fopen(f2,"r");
f2 = fread(f2_id,Inf,"uint8");
valore = f2(indice_immagine+9);
venerdì 13 settembre 2019
venerdì 30 agosto 2019
Stringhe in C
Mi sono rimesso a studiare un po' di C
--------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//calcola la lunghezza di una stringa
// con un ciclo for ed i puntatori
int strlen_for(char *s)
{
int n;
for(n=0; *s!='\0'; s++)
n++;
return n+1;
}
//calcola la lunghezza di una stringa
// con un ciclo while ed i puntatori
//il trucco di fine ciclo e' che
// il terminatore di una stringa in C
// e' 0 che corrisponde anche alla condizione
// False
void print_for(char *s)
{
for (; *s; s++)
printf("%c",*s);
printf("\n");
}
// stampa una stringa
void print_while(char *s)
{
while(*s){
printf("%c",*s);
s++;
}
printf("\n");
}
//crea una nuova stringa di una lunghezza non predefinita
char *new_string(int lunghezza)
{
char *transi = malloc(lunghezza + 1);
memset(transi, 'a', lunghezza);
transi[lunghezza] = 0;
return transi;
}
// concatena due stringhe
char *concatena(char *uno, char*due)
{
//printf("%i\n",sizeof(uno));
char *transi = malloc(sizeof(uno)+sizeof(due) + 1);
int contatore = 0;
for (; *uno; uno++)
{
transi[contatore] = *uno;
contatore++;
}
for (; *due; due++)
{
transi[contatore] = *due;
contatore++;
}
transi[contatore] = 0;
return transi;
}
// taglia una stringa
char *taglia(char *stringa,int caratteri)
{
stringa[caratteri] = 0;
return stringa;
}
int main()
{
char *a = "chiara";
char b[5] = "luca";
print_for(a);
print_while(a);
int lung = strlen_for(b);
printf("%i\n",lung);
char *nuova_stringa = new_string(10);
print_for(nuova_stringa);
char *nome = "Luca";
char *cognome = "Innocenti";
char *unione = concatena(nome,cognome);
print_for(unione);
char *tagliato = taglia(unione,5);
print_for(tagliato);
printf("%i\n",sizeof(tagliato)+1);
//array di puntatori
char *elementi[] = {"Luca", "Innocenti", "Firenze"};
print_for(elementi[0]);
print_for(elementi[2]);
return 0;
}
--------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//calcola la lunghezza di una stringa
// con un ciclo for ed i puntatori
int strlen_for(char *s)
{
int n;
for(n=0; *s!='\0'; s++)
n++;
return n+1;
}
//calcola la lunghezza di una stringa
// con un ciclo while ed i puntatori
//il trucco di fine ciclo e' che
// il terminatore di una stringa in C
// e' 0 che corrisponde anche alla condizione
// False
void print_for(char *s)
{
for (; *s; s++)
printf("%c",*s);
printf("\n");
}
// stampa una stringa
void print_while(char *s)
{
while(*s){
printf("%c",*s);
s++;
}
printf("\n");
}
//crea una nuova stringa di una lunghezza non predefinita
char *new_string(int lunghezza)
{
char *transi = malloc(lunghezza + 1);
memset(transi, 'a', lunghezza);
transi[lunghezza] = 0;
return transi;
}
// concatena due stringhe
char *concatena(char *uno, char*due)
{
//printf("%i\n",sizeof(uno));
char *transi = malloc(sizeof(uno)+sizeof(due) + 1);
int contatore = 0;
for (; *uno; uno++)
{
transi[contatore] = *uno;
contatore++;
}
for (; *due; due++)
{
transi[contatore] = *due;
contatore++;
}
transi[contatore] = 0;
return transi;
}
// taglia una stringa
char *taglia(char *stringa,int caratteri)
{
stringa[caratteri] = 0;
return stringa;
}
int main()
{
char *a = "chiara";
char b[5] = "luca";
print_for(a);
print_while(a);
int lung = strlen_for(b);
printf("%i\n",lung);
char *nuova_stringa = new_string(10);
print_for(nuova_stringa);
char *nome = "Luca";
char *cognome = "Innocenti";
char *unione = concatena(nome,cognome);
print_for(unione);
char *tagliato = taglia(unione,5);
print_for(tagliato);
printf("%i\n",sizeof(tagliato)+1);
//array di puntatori
char *elementi[] = {"Luca", "Innocenti", "Firenze"};
print_for(elementi[0]);
print_for(elementi[2]);
return 0;
}
giovedì 29 agosto 2019
6502 RetroShield
Ho provato un progetto interessante... in pratica invece di emulare un processore con RetroShield viene accoppiato ad una Arduino Mega un vero processore 6502 (puo' montare anche uno z80) su cui vengono realmente eseguite le istruzioni senza emulazione software
Il clock e' molto piu' basso rispetto al 6502 puro (circa 10 volte piu' lento ovvero 100 KHz) ma la cosa divertente e' che si puo' emulare un Apple 1 con un apposito sketch Arduino con inclusi nel firmware Apple Basic 1 e Woz Monitor (l'interfaccia avviene sulla porta seriale come terminale)
Per accedere al basic si attende il prompt dopo una CPU Reset e si digita
E000R
per rientrare al Basic
E2B3R
per effettuare il dump della memoria del programma in basic
004A.00FF
0800.0FFF
.
Il clock e' molto piu' basso rispetto al 6502 puro (circa 10 volte piu' lento ovvero 100 KHz) ma la cosa divertente e' che si puo' emulare un Apple 1 con un apposito sketch Arduino con inclusi nel firmware Apple Basic 1 e Woz Monitor (l'interfaccia avviene sulla porta seriale come terminale)
Per accedere al basic si attende il prompt dopo una CPU Reset e si digita
E000R
per rientrare al Basic
E2B3R
per effettuare il dump della memoria del programma in basic
004A.00FF
0800.0FFF
.
L'aspetto che lascia piu' interdetti e' il basic di Apple I e' altrimenti conosciuto come Integer Basic perche' sono ammessi solo numeri interi come variabili compresi tra -32.768 3 e 32767. Inoltre il nome delle variabili puo' essere solo una lettera o una lettera ed un numero. Tanto per dare un'idea il manuale originale era di 14 pagine
Resuscitare un telefono Vernee
Un telefono Android di marca Vernee era andato in modalita' bootloader e quando mi e' arrivato oramai non aveva piu' batteria perche' il proprietario non lo aveva spento
Nonostante avere tenuto il telefono in carica per piu' di un giorno non presentava segni di vita..a questo punto il dispositivo e' stato smontato per staccare fisicamente la batteria (un tentativo come un altro). La batteria era collegata da una flat con connettore a pressione ed e' stato facile disconnetterla. A telefono aperto e' stato semplice verificare (anche per la presenza di due comode piazzole) che la tensione della batteria era di circa 3.2 V e nonostante il cavo USB di alimentazione la batteria non veniva ricaricata.
Leggendo su internet e' emerso che il voltaggio aveva raggiunto un livello tale che il circuito di ricarica impediva la ricarica stessa...E' stato quindi collegata un cavo USB alle due piazzole ed la batteria e' stata alimentata a 5V dal cavo USB fino a quando non ha raggiunto i 3.6 V. Dopo di cio' il circuito di ricarica e' entrato in azione ed il telefono e' ripartito in bootloader senza problemi (l'origine del problema era un corruzione del sistema Android)...un reset alle impostazioni di fabbrica (con menu ovviamente in cinese) ed il telefono e' ripartito.
Probabilmente avere lasciato il telefono in modalita' bootloader ha impedito ad Android di evitare l'eccessivo scaricamento della batteria e probabilmente non ci sono dispositivi hardware immediatamente collegati alla batteria (come accade nelle LiPo vendute singolarmente)
Nonostante avere tenuto il telefono in carica per piu' di un giorno non presentava segni di vita..a questo punto il dispositivo e' stato smontato per staccare fisicamente la batteria (un tentativo come un altro). La batteria era collegata da una flat con connettore a pressione ed e' stato facile disconnetterla. A telefono aperto e' stato semplice verificare (anche per la presenza di due comode piazzole) che la tensione della batteria era di circa 3.2 V e nonostante il cavo USB di alimentazione la batteria non veniva ricaricata.
Leggendo su internet e' emerso che il voltaggio aveva raggiunto un livello tale che il circuito di ricarica impediva la ricarica stessa...E' stato quindi collegata un cavo USB alle due piazzole ed la batteria e' stata alimentata a 5V dal cavo USB fino a quando non ha raggiunto i 3.6 V. Dopo di cio' il circuito di ricarica e' entrato in azione ed il telefono e' ripartito in bootloader senza problemi (l'origine del problema era un corruzione del sistema Android)...un reset alle impostazioni di fabbrica (con menu ovviamente in cinese) ed il telefono e' ripartito.
Probabilmente avere lasciato il telefono in modalita' bootloader ha impedito ad Android di evitare l'eccessivo scaricamento della batteria e probabilmente non ci sono dispositivi hardware immediatamente collegati alla batteria (come accade nelle LiPo vendute singolarmente)
lunedì 26 agosto 2019
TSC_DEADLINE error su Lenovo X1 Carbon e Debian
Il mio Lenovo mi dava sempre al boot un errore di TSC_DEADLINE e pensavo che fosse necessario aggiornare il BIOS (cosa che per pigrizia e per paura di rendere inutilizzabile il computer non ho mai fatto)
Ho scoperto che basta aggiungere il seguente pacchetto
apt-get install intel-microcode
per risolvere il problema
Ho scoperto che basta aggiungere il seguente pacchetto
apt-get install intel-microcode
per risolvere il problema
giovedì 22 agosto 2019
USB seriale su STM32 Nucleo F302RB
Per inviare dati seriali sulla porta USB (collegata ad STLink) si devono prima attivare i pin tramite Cube MX e si devono configurare i parametri di trasmissione di USART2 (in questo caso 9600 8N1)
fatto cio' si apre il progetto e si trova gia' configurata la porta huart2 su cui trasmettere un buffer di caratteri
char buffer[12];
..........
HAL_UART_Transmit(&huart2,buffer,strlen(buffer),HAL_MAX_DELAY);
char newline[2] = "\r\n";
HAL_UART_Transmit(&huart2,(uint8_t *) newline,2,HAL_MAX_DELAY);
fatto cio' si apre il progetto e si trova gia' configurata la porta huart2 su cui trasmettere un buffer di caratteri
char buffer[12];
..........
HAL_UART_Transmit(&huart2,buffer,strlen(buffer),HAL_MAX_DELAY);
char newline[2] = "\r\n";
HAL_UART_Transmit(&huart2,(uint8_t *) newline,2,HAL_MAX_DELAY);
martedì 20 agosto 2019
Linux Windows Subsystem ed XOrg
Una delle limitazioni piu' significative di Linux Subsystem su Windows 10 e' quella di avere di default sostanzialmente la sola consolle.
Tale limitazione puo' essere superata in due modi differenti
1) Metodo con windows manager completo
Si installano un X Server per Windows come XMing o VcXsrv
dalla shell si inserisce il comando (oppure lo si include in bashrc)
export DISPLAY=:0.0
si installa poi con apt il pacchetto XFCE
apt-get install xfce4
si apre quindi il programma XLaunch selezionando FullScreen o One Large Window, e premendo in successiione Next. Al termine si ritorna alla shell e si digita
xfce4-session
3) Metodo a singola applicazione
a differenza del caso precedente invece di aprire window manager si possono eseguire singole applicazioni come xterm (quindi dopo export DISPLAY=:0.0 e dopo aver lanciato XLaunch ) si puo' digitare per esempio
xterm
Tale limitazione puo' essere superata in due modi differenti
1) Metodo con windows manager completo
Si installano un X Server per Windows come XMing o VcXsrv
dalla shell si inserisce il comando (oppure lo si include in bashrc)
export DISPLAY=:0.0
si installa poi con apt il pacchetto XFCE
apt-get install xfce4
si apre quindi il programma XLaunch selezionando FullScreen o One Large Window, e premendo in successiione Next. Al termine si ritorna alla shell e si digita
xfce4-session
3) Metodo a singola applicazione
a differenza del caso precedente invece di aprire window manager si possono eseguire singole applicazioni come xterm (quindi dopo export DISPLAY=:0.0 e dopo aver lanciato XLaunch ) si puo' digitare per esempio
xterm
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...