[ITALIANO] Lo spamm bar (Part 2)

Sono DUE quarzi diversi, su due coppie di pin diversi e quindi, mancando entrambi, impatta su tutto. :confused:

P212 e P213 il quarzo di sistema ... WeAct monta un quarzo a 16 MHz.
P214 e P215 il quarzo del RTC ... WeAct monta un quarzo da 32.768 kHz

Guglielmo

Interessante...

:grin: :grin: :grin:

Guglielmo

2 Likes

Magic quale ? ... necromanzia ? :smiling_imp:

.

.

.

Salsa "piccante" ... :rofl:

1 Like

:joy: :joy: :joy:

Guglielmo

7 Likes

:rofl: :rofl: :rofl:

Almeno il pitone, se morde, non è velenoso.

Comunque fa un certo effetto scoprire che un mio "link" mi ha fatto guadagnare un "badge"...
Sono soddisfazioni! :grinning:

Vi segnalo QUESTO interessante articolo su una libreria utilizzabile per avere scambio di dati via seriale in modo affidabile. E in via di sviluppo, ma mi sembra valga la pena di seguire come prosegue ... :wink:

Guglielmo

Un pastore stava pascolando il suo gregge di pecore, in un pascolo decisamente lontano e isolato, quando all'improvviso vede avvicinarsi una BMW nuova fiammante che avanza lasciandosi dietro una nuvola di polvere.

Il guidatore, un giovane in un elegante abito di Versace, scarpe Gucci, occhiali Ray Ban e cravatta Yves Saint Laurent rallenta, si sporge dal finestrino dell'auto e dice al pastore : "Se ti dico esattamente quante pecore hai nel tuo gregge, me ne regali una ?"

Il pastore guarda l'uomo, evidentemente uno yuppie, poi si volta verso il suo gregge e risponde con calma :"Certo,perchè no?"

A questo punto lo yuppie posteggia l'auto,tira fuori il suo computer portatile della Del e lo collega al suo cellulare della A T&T .

Si collega a internet, naviga in una pagina della NASA, seleziona un sistema di navigazione satellitare GPS per avere un'esatta posizione di dove si trova e invia questi dati ad un altro satellite NASA che scansiona l'area e ne fa una foto in risoluzione ultradefinita.
Apre quindi un programma di foto digitale della Adobe Photoshop ed esporta l'immagine a un laboratorio di Amburgo in Germania che dopo pochi secondi gli spedisce una e-mail sul suo palmare Palm Pilot confermando che l'immagine è stata elaborata e i dati sono stati completamente memorizzati.
Tramite una connessione ODBC accede a un database MS-SQL e su un foglio di lavoro Excel con centinaia di formule complesse, carica tutti i dati tramite e-mail con il suo Blackberry.
Dopo pochi minuti riceve una risposta e alla fine stampa una relazione completa di 150 pagine, a colori, sulla sua nuovissima stampante HP Laserjet iper-tecnologica e miniaturizzata. e rivolgendosi al pastore esclama:

"Tu possiedi esattamente 1586 pecore".

"Esatto. Bene, immagino che puoi prenderti la tua pecora a questo punto" dice il pastore e guarda il giovane scegliere un animale che si appresta poi a mettere nel baule dell'auto.

Il pastore quindi aggiunge:" Ehi, se indovino che mestiere fai, mi restituisci la pecora ?".

Lo yuppie ci pensa su un attimo e dice: "Okay, perchè no ?"

"Sei un informatico" dice il pastore.

"Caspita, è vero - dice il giovane - come hai fatto a indovinare?"

"Beh non c'è molto da indovinare, mi pare piuttosto evidente - dice il pastore - sei comparso con un sacco di aggeggi elettronici, vuoi essere pagato per una risposta che io già conosco, impiegandoci il doppio del tempo e non capisci niente del mio lavoro...

Ora per favore restituiscimi il cane!"

Cosa c'entra?
Nulla
Solo che leggendo un post sui termostati mi è venuta in mente
Chi ha orecchie.... non dorme in roulotte

2 Likes

Preferisco l'autocaravan, ovvero il camper, meglio se furgonato 4x4!

Grazie , prendo nota

Traduco da un post letto nella sezione di lingua Inglese ... mettetevi le mani nei capelli ...

Finalmente ho capito qual è il problema della seriale sull'R4. Sapevo che inviava caratteri singoli e si bloccava, ma non avevo mai capito perché ... fino ad ora.

Invece di implementare le cose da soli, gli sviluppatori di Arduino hanno utilizzato il codice generato dal "generatore" di Renesas che ... non funziona con i ring-buffer.

Vorrei iniziare parlando di come funziona su una MCU AVR come è Arduino UNO-R3. È presente la classe HardwareSerial che interagisce direttamente con i registri del chip AVR per inviare i caratteri. La classe dispone di un buffer circolare con un puntatore di testa e uno di coda. Quando si chiama Serial.print("Qualcosa"), il "Qualcosa" viene aggiunto al ring buffer. La classe imposta anche un interrupt da attivare ogni volta che la linea seriale è pronta per un altro carattere e gestisce il caricamento del carattere successivo dal ring buffer nel registro dei dati.

In un AVR, quindi, tutto viene fatto direttamente nel codice del core di Arduino e abbiamo il controllo su tutti gli aspetti di come avviene. Quindi è impostato per utilizzare un buffer circolare che, effettivamente, ha molto senso.

Sull'R4 le cose sono molto diverse. Qui la classe UART eredita HardwareSerial, che ora agisce più come un'interfaccia. Ma tutto l'hardware è gestito dal codice generato nelle librerie FSP (Flexible Software Package). Queste non funzionano nello stesso modo in cui siamo abituati e non possiamo modificarle e ricompilarle facilmente.

Nel codice FSP, ciò che accade è che si passa un puntatore e una lunghezza alla funzione R_SCI_UART_Write() e questo puntatore e questa lunghezza vengono memorizzati nella struttura di configurazione uart. È previsto un interrupt che si attiva per gestire il caricamento dei caratteri nel registro dei dati uno per uno e chiama un callback da Serial.cpp che interagisce con la classe UART.

La cosa importante da notare è che non c'è un buffer intermedio. I dati non vengono copiati da nessuna parte. Vengono stampati direttamente dalla posizione da cui sono stati inviati. Ciò significa che se si stampa un array di grandi dimensioni e poi si cambia qualcosa al suo interno, ciò che verrà stampato potrebbe essere il nuovo dato.

Attualmente ciò è impedito da un'attesa bloccante nella funzione di scrittura della classe UART, in modo che il codice sia bloccato durante l'invio dei dati. Tuttavia, sono sicuro che si può ancora incasinare tutto con un interrupt.

La soluzione più ovvia sarebbe utilizzare un buffer intermedio nella classe UART. Il problema è che il codice FSP non è molto adatto ai buffer circolari. Con un buffer circolare, abbiamo bisogno di una situazione simile a quella dell'AVR, in cui il codice che gestisce lo spostamento dei byte nel registro dati è consapevole delle estremità del buffer circolare. Ma il codice in r_sci_uart.c è scritto in modo da aspettarsi che i dati che gli vengono passati siano disposti in modo contiguo.

Questo è un problema nel caso in cui i dati superano la fine del buffer e debbono ricominciare dall'inizio del buffer. Si passa una certa lunghezza, ma solo una parte di quella lunghezza è direttamente davanti a noi. Una altra parte si trova all'inizio del buffer. La funzione nell'HAL non ha modo di gestire questa situazione e si limita a leggere la fine del buffer circolare.

Questo crea un problema di codifica che i tecnici di Arduino sembrano aver ignorato.

La risposta è che quando i dati dovrebbero essere scritti all'inizio del buffer circolare (wrap), non è possibile inviare più della lunghezza alla fine del ring buffer. Bisogna testare prima di scrivere e se il dato va messo ad inizio buffer, bisogna resettare il buffer nel caso in cui non sia in corso alcuna trasmissione, oppure inviare solo i bit alla fine del buffer e prendere il resto la volta successiva, quando si verifica l'interrupt di fine trasmissione.

... in pratica ... una vera schifezza (come buona parte dei nuovi "core" delle schede basate su Renesas e su STM) :frowning_face:

Guglielmo

2 Likes

... l'autore del "post" (Delta_G) prosegue dando una piccola dimostrazione del problema, compilando il seguente codice:

uint32_t start;
uint32_t finish;

void setup() {
  Serial.begin(9600);
  Serial1.begin(9600);

  while(!Serial);

  Serial.println("\n\n** Speed Test **\n\n");

  start = micros();
  Serial1.print("Twas brillig and the slithy toves did gyre and gimbel in the wabe. ");
  finish = micros();

  Serial.print("Total Time : ");
  Serial.println(finish - start);
}

void loop() {}

... il risultato è che inviando una stringa di 67 caratteri, il codice resta completamente BLOCCATO per 68782 microsecondi ovvero poco più di 68 millisecondi (del resto, a 9600 bps, ogni carattere impiega circa 1 msec ad essere trasmesso). :confused:

Guglielmo

Sempre lo stesso autore ha provato a fare una semplice modifica nel "core" per usare il buffer circolare ... una modifica veloce ed altamente inefficiente che lui stesso descrive così:

Ho modificato il "core" nel mio ambiente di sviluppo per utilizzare il buffer circolare in modo molto grezzo. Carico solo un carattere alla volta. Sto sprecando la FIFO e tutto il resto. Ci sono un'infinità di modi per migliorarlo. Ma comunque compila e la stessa istruzione di stampa viene restituita in 254 microsecondi.

Quindi, con una semplice modifica che usa in modo totalmente NON ottimizzato un buffer circolare, si passa dai 68782 microsecondi a 254 microsecondi :scream: :scream: :scream:

Vedete un po' voi ... :roll_eyes:

Guglielmo

2 Likes

Mi sa che persino Google "Gemini" o "ChatGPT" riescano a produrre un codice più efficiente ... :joy:

Guglielmo

:laughing: :laughing: :laughing:

Guglielmo

2 Likes

Arrivata:
https://it.aliexpress.com/item/1005006327762396.html?spm=a2g0o.store_pc_home.0.0.708a4613amL6Jn&gps-id=pcStoreJustForYou&scm=1007.23125.137358.0&scm_id=1007.23125.137358.0&scm-url=1007.23125.137358.0&pvid=b767d33c-33db-414c-9b19-464a1468a29c&_t=gps-id%3ApcStoreJustForYou%2Cscm-url%3A1007.23125.137358.0%2Cpvid%3Ab767d33c-33db-414c-9b19-464a1468a29c%2Ctpp_buckets%3A668%232846%238108%231977&pdp_npi=4%40dis!EUR!2.45!2.45!!!2.57!2.57!%402103853617148304815752516e9e9d!12000036777011641!rec!IT!4862968976!&gatewayAdapt=glo2ita
Soprannominata picopurple, c'è la flash da 16M W25Q128.
Sembra funzionare come la originale, vedremo poiché ho preso anche il debuger:
https://it.aliexpress.com/item/1005005284269279.html?spm=a2g0o.order_list.order_list_main.11.62aa36960vHKlp&gatewayAdapt=glo2ita

Sto usando la sdk (no arduino ide).

Giustamente se stampo la macro PICO_FLASH_SIZE_BYTES il suo valore è: 2097152
Che sono i 2MB della pico standard.

Ciao.

1 Like

Che ambiente di sviluppo usi? O ... non ne usi :roll_eyes:

Guglielmo

Ho come l'impressione di essermi dimenticato qualcosa, ma sara' sicuramente qualcosa di nessuna importanza, come tirare il freno a mano ... :joy:

1 Like

Per adesso ho provato manualmente con cmake.
Ho tentato di configurare vscode, ma intellisense non lo capisco e il plugin cmake non funziona bene, comunque compila.
Ora sto provando con qtcreator con cui mi trovo sempre bene e funziona bene, tranne per #include <stdio.h> che lo mostra sottolineato. Il messaggio non l'ho comprendo, però se premo su "Follow Symbol Under Cursor" mi apre il file stdio.h corretto, cioè quello della newlib.

Devo riprovare con vscode principalmente perché non andiamo d'accordo e poi perché è l'IDE consigliato da raspberry e quindi deduco che sono io a sbagliare qualcosa. Però se riesco a configurare qtcreator anche per il debug non vedo motivo di usare il mattone come vscode, mattone specie sul PC 4 core, dove però qtcreator vola.

Ciao.

1 Like