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;
}


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
.
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)

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

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);


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





sabato 17 agosto 2019

STM32F103C8T6 Blue Pill Blink

La scheda si basa su un Cortex M3 a 72 MHz e 32 bit con 20Kb di ram statica, 64 Kb di flash memory. Tensione di riferimento e' a 3.3 V ma alcuni pin permettono anche tensioni massime di 5 V



Nonostante disponga di una porta USB la programmazione avviene tramite ST Link esterno che deve essere collegato ai 4 pin sul lato corto (oppure usando un seriale TTL TX su A10 e RX su A9). In realta' e' possibile flashare un boot loader che permette la programmazione via USB e la compatilibita' con Arduino IDE perdendo pero' spazio di memoria (circa 20 Kb)






Proviamo adesso a programmmare il classisvo blink

Da questo schema si vede che il led integrato e' collegato alla porta GPIO C13. Attenzione ...rispetto ad una Arduino la numerazione dei Pin e' diffetente...ci sono piu' pin 13 per esempio PB13, PC13 perche' ci sono piu' porte GPIO


Si apre CubeMX e i crea un progetto selezionando selezionando STM32F103C8Tx ed attivando il il clock su HCE Crystal reconator e PC13 come GPIO Output e denominandolo  LED





Si genera il codice e si apre SW4STM32 e si modifica main.c come indicato

-------------------------------------------------
 while (1)
  {
    /* USER CODE END WHILE */
  HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
  HAL_Delay(5000);
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
-------------------------------------------------

Qui arriva la parte un po' complicata....se si effettua un semplice build and run si ottiene il seguente errore

Open On-Chip Debugger 0.10.0+dev-00021-g524e8c8 (2019-04-12-08:48)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
srst_only separate srst_nogate srst_open_drain connect_assert_srst
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
adapter speed: 8000 kHz
adapter_nsrst_delay: 100
Info : clock speed 8000 kHz
Info : STLINK v2 JTAG v34 API v2 SWIM v7 VID 0x0483 PID 0x3748
Info : using stlink api v2
Info : Target voltage: 3.142412
Info : Unable to match requested speed 8000 kHz, using 4000 kHz
Info : Stlink adapter speed set to 4000 kHz
Info : STM32F103C8Tx.cpu: hardware has 6 breakpoints, 4 watchpoints
Info : Listening on port 3333 for gdb connections
Error: timed out while waiting for target halted
TARGET: STM32F103C8Tx.cpu - Not halted
in procedure 'program'
in procedure 'reset' called at file "embedded:startup.tcl", line 500
in procedure 'ocd_bouncer'

embedded:startup.tcl:476: Error: ** Unable to reset target **
in procedure 'program'
in procedure 'program_error' called at file "embedded:startup.tcl", line 501
at file "embedded:startup.tcl", line 476


il trucco  sta nel premere il pulsante di reset della scheda, lanciare Run e circa un seconda dopo che inizia a lampeggiare STLink si deve rilasciare  il tasto di reset

il messaggio di corretto carivamente e;' il segiente

Open On-Chip Debugger 0.10.0+dev-00021-g524e8c8 (2019-04-12-08:48)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
srst_only separate srst_nogate srst_open_drain connect_assert_srst
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
adapter speed: 8000 kHz
adapter_nsrst_delay: 100
Info : clock speed 8000 kHz
Info : STLINK v2 JTAG v34 API v2 SWIM v7 VID 0x0483 PID 0x3748
Info : using stlink api v2
Info : Target voltage: 3.129153
Info : Unable to match requested speed 8000 kHz, using 4000 kHz
Info : Stlink adapter speed set to 4000 kHz
Info : STM32F103C8Tx.cpu: hardware has 6 breakpoints, 4 watchpoints
Info : Listening on port 3333 for gdb connections
target halted due to debug-request, current mode: Thread 
xPSR: 0x01000000 pc: 0x08000c50 msp: 0x20005000
Info : Unable to match requested speed 8000 kHz, using 4000 kHz
Info : Stlink adapter speed set to 4000 kHz
Info : Unable to match requested speed 8000 kHz, using 4000 kHz
adapter speed: 4000 kHz
** Programming Started **
auto erase enabled
Info : device id = 0x20036410
Info : flash size = 64kbytes
target halted due to breakpoint, current mode: Thread 
xPSR: 0x61000000 pc: 0x2000003a msp: 0x20005000
wrote 4096 bytes from file Debug/blue_piull.elf in 0.264664s (15.114 KiB/s)
** Programming Finished **
** Verify Started **
target halted due to breakpoint, current mode: Thread 
xPSR: 0x61000000 pc: 0x2000002e msp: 0x20005000
verified 3404 bytes in 0.072038s (46.145 KiB/s)
** Verified OK **
** Resetting Target **
target halted due to breakpoint, current mode: Thread 
xPSR: 0x61000000 pc: 0x2000002e msp: 0x20005000
shutdown command invoked

A questo punto si preme nuovamente il tasto reset per mandare in esecuzione il programma

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...