MicroPython: incrementare un byte

di il
11 risposte

MicroPython: incrementare un byte

Buongiorno,


Ho una difficoltà in quanto è la prima volta che ho necessità di maneggiare i byte (8 bit di precisione) con Python. (MicroPython in realtà).

In pratica io ho una variabile x=b”\x00” che deve essere incrementata per indicare di volta in volta l’indirizzo di un registro. Non sempre i due registri su cui devo scrivere sono consequenziali.

Grazie

Andrea

11 Risposte

  • Re: MicroPython: incrementare un byte

    In Python i ‘bytearray’ sono oggetti su cui non si possono fare operazioni. 

    Direi che ti mancano i FONDAMENTI di Python!

    Mi sa che devi ripassarli! 

  • Re: MicroPython: incrementare un byte

    Un elemento di bytearray è un intero a 16 bit scritto come byte. Almeno questo esce se printi il type. Sbaglio?


    Per scrivere i registri hai bisogno di 8bit e se passi un int ovviamente non stai dicendo la stessa cosa al driver e scrivi registri a caso.

    Devo fare una prova se su micropython il bytearray è gestito in maniera diversa. Ma non credo.


    Temo che l’unica sia trasformalo in int con from_bytes, incrementarlo e riportarlo a byte con to_bytes.

    Anche se mi sembra un po’ assurdo che non ci sia una variabile da 8 bit gestita interamente come tale.

  • Re: MicroPython: incrementare un byte

    23/02/2024 - Amx ha scritto:


    1. Un elemento di bytearray è un intero a 16 bit scritto come byte. Almeno questo esce se printi il type. Sbaglio?
    2. Per scrivere i registri hai bisogno di 8bit e se passi un int ovviamente non stai dicendo la stessa cosa al driver e scrivi registri a caso
    3. Devo fare una prova se su micropython il bytearray è gestito in maniera diversa. Ma non credo.
    4. Temo che l’unica sia trasformalo in int con from_bytes, incrementarlo e riportarlo a byte con to_bytes.
    5. Anche se mi sembra un po’ assurdo che non ci sia una variabile da 8 bit gestita interamente come tale.
    1. praticamente TUTTO: un elemento di un bytearray E' UN BYTE e BASTA
    2. ANCHE NO: molto probabilmente usa SOLO i primi 8 bit dell'intero (tutti i sistemi funzionano in questo modo)
    3. non sono espero di MicroPython MA di Python E mi sono letto come funziona E DICHIARA di essere perfettamente compatibile
    4. vedi che ci sei arrivato? ;-) 
      Alleluia !!!!
    5. e' Python, NON C. NON E' NATO per questi utilizzi, ma per fare ALTRO.

    .

  • Re: MicroPython: incrementare un byte

    1. ok allora era solo un misunderstanding dovuto al fatto che se pronto type(bytearray_item) mi dice int. pensavo occupasse comunque 16 bit.
    2. -
    3. È totalmente compatibile come codice, ma usa precisioni diverse. O meglio: dipende dal controller e dal firmware.
    4. Non è che ci sono arrivato. Banalmente speravo ci fosse il modo per incrementare il valore senza fare due cambi di dimensione. Cosa che tra l’altro sui microcontrollori è oltremodo garbage collector. Lo sarebbe pure su un normale computer, ma prima di accorgersene…
    5. Chiaro. Purtroppo quando devinunire operazioni di comunicazione con quelle di calcolo numerico devi scegliere il male peggiore. Finora mi ero scontrato col rovescio della medaglia di C, ottimo per scrivere registri pesante per il calcolo.
  • Re: MicroPython: incrementare un byte

    Non capisco cosa intendi per “pesante per il calcolo”.
    Giusto come chiarimento, che cosa o chi NON E' pesante per il calcolo?

  • Re: MicroPython: incrementare un byte

    Prendere un byte da 8 bit, aggiungere altri 8 bit ‘inutili’, salvarlo in RAM, fare l’incremento, poi nuovamente prendere quei 16 bit, tagliarne 8.


    Fai tre operazioni anziché 1 in RAM e hai bisogno di 16 bit anziché 8. Oddio forse addirittura 24 bit anziché 8 perché in un certo momento hai salvato entrambe le variabili.

    Se potessi fare, come per un int, bytevalue+=1 è molto più veloce (e vabbè) come calcolo. E occupi meno RAM.


    Chiaro che un controllore con 260kB è un lusso che con Arduino a 2kB non avevo e i problemi non si presentano. Però è un modo per intasare la RAM inutilmente. Tutto qui

  • Re: MicroPython: incrementare un byte

    23/02/2024 - Amx ha scritto:


    Se potessi fare, come per un int, bytevalue+=1 è molto più veloce …

    Magari usando l'OR ottieni quello che vuoi : 

    <pseudocodice> bytevalue=bytevalue OR 2#1 <fine pseudocodice>

  • Re: MicroPython: incrementare un byte

    Prendere un byte da 8 bit, aggiungere altri 8 bit ‘inutili’, salvarlo in RAM, fare l’incremento, poi nuovamente prendere quei 16 bit, tagliarne 8

    @Amx: quello che ai descritto lo fai in quel modo nei seguenti linguaggi di programmazione

    C, C++, Assembly, Rust, D, Zig, Nim

    ed altri che ora non ricordo. Come noti, non ho messo Python  nella lista. 

    Anche NO: CHI HA DETTO che devi aggiungere bit inutili? 
    DIPENDE dalla CPU e dalla dimensione MINIMA dei dati che possono essere trasferiti DA E PER la memoria. In genere e' un byte, MA potrebbero essere anche 2 byte alla volta QUINDI i byte inutili sono AGRATIS. Inoltre dipende da quanti bit e' la CPU: se e' a 32 bit e gestisce SOLO dati a 32 bit, anche se leggi 8 bit la CPU DEVE convertirli in una sequeza di 32 bit. E' quello che NORMALMENTE FANNO le CPU moderne quando leggono dati con un numero di bit INFERIORI alla destinazione.
    .
    E questo e' implementato in HARDWARE, QUINDI NON C'E' perdita di tempo perche' E' FISICAMENTE IMPOSSIBLE fare di meglio.
    .
    Comunque i processori Intel, AMD, ARM SUPPORTANO tutte queste “caratteristiche”. 
    E' SOLO un problema del “programmatore” che non sa usarle!

    .

    Se potessi fare, come per un int, bytevalue+=1 è molto più veloce (e vabbè) come calcolo. E occupi meno RAM.

    Anche NO! 

    Le idee sono PARECCHIO confuse! Questo e' quello che scrivi con un linguaggio ad alto livello NON quello che fai a livello HARDWARE/CPU

    TUTTE le CPU ‘mainstream’ Iintel, AMD, ARM, RiscV, Motorola,…)  sono basate su registri QUINDI l'operazione sara':

    leggi un byte dalla memoria e portalo NEL registro, incrementa di uno il valore del registro, scrivi il contenuto del registro in memoria.

    Meno di cosi' non si puo' fare perche' lo fa DIRETTAMENTE l'hardware.


    Usare Python, un linguaggio INTERPRETATO, in cui TUTTI I valori sono oggetti, e'

    100/1000 VOLTE PIU' INNEFICIENTE

    ANCHE SE a te sembra che si scriva meno codice! NON E' COSI. Tu PENSI di scrivere meno codice MA IN REALTA" la quantita' di operazioni fatte e' DECINAIA di volte maggiore.

    Ti consiglio di acquistare un libro su ‘architettura dei calcolatori’ e studiare un po'.
    Ed anche uno su “linguaggi formali e compilatori”/


    Non capisco come, lavorando con hardware poco potente e quindi con la necessità di scrivere codice il piu'efficiente possibile, tu non sappia gia' queste cose. 

    Si faceva grafica 3d in real time quando le CPU viaggiavano a DECINE DI MEGAHERZ, implementando tutto in assembly. 

    Oggi la CPU piu' scalcinata e' cento volte piu' potente (QUALCHE GIGAHERZ)! Ci puoi implementare la VR immersiva! 

  • Re: MicroPython: incrementare un byte

    Ciao migliorabile, ti ringrazio per la risposta super dettagliata. Sono ‘programmatore’ per hobby. Delle cose che hai detto ho molte nozioni, ma non le conosco fino in fondo. O meglio: fino a ieri ho lavorato in C su questo tipo di CPU quindi per Python son cose che comincio a pormi oggi da questo punto di vista.

    Cioè Python l’ho sempre usato per analizzare quattro dati. È più lento…ma tant’è. Neanche me ne accorgo.

    La scelta di Python al posto del C è stata la seguente: ho provato a fare quello che sto facendo con Arduino (e quindi C). Purtroppo la memoria e la velocità di esecuzione non era sufficiente e ad un certo punto cominciava a perdersi dati in arrivo nella seriale. Il problema stava tutto lato hardware 2kB e 16Mhz

    Ho optato per un arm cortex m0. A quel punto avendo ben più del necessario ho optato per la semplicità di Python nel fare tutto il resto dei calcoli. Ho poi fatto il pensiero seguente, magari sbagliato, correggimi nel caso: nella CPU andrà sempre codice macchina, per cui l’interpretato in questo caso non dovrebbe influire nel senso che l’interpretazione dovrebbe venire prima che il codice macchina venga scritto. 
    In ogni caso, in questa situazione, non ho problemi di memoria o velocità. Però mi sto scontrando con delle situazioni che vorrei capire per quelle volte in cui questi problemi li avrò è dovrò aggirarli, magari scrivendo in C o modificando le precisioni mettendo mano al codice del firmware (ho letto, non fatto, che è possibile ad esempio chiedere che interpreti i float a 64bit anziché 32 come nativo di micropython).


    Quello che proprio non avevo idea è che l’hardware comunque lavori su 8bit o 16bit indipendentemente da quello che gli dici a livello di codice. O meglio: io pensavo che se gli dico prendi un int e incrementali lui legge la memoria (16bit) incrementa di 1 e salva (16bit) mentre se richiamo un byte facesse la stessa cosa su 8bit.

    Però scusa: se io definisco un int lui va ad allocare obbligatoriamente 16bit. Anche se poi non lo usa.

    Sbaglio? Cioè la mia domanda era: in Python non c’è alcun modo per creare un oggetto da 8bit?


    Grazie

  • Re: MicroPython: incrementare un byte

    23/02/2024 - max.riservo ha scritto:


    23/02/2024 - Amx ha scritto:


    Se potessi fare, come per un int, bytevalue+=1 è molto più veloce …

    Magari usando l'OR ottieni quello che vuoi : 

    <pseudocodice> bytevalue=bytevalue OR 2#1 <fine pseudocodice>

    Diciamo che se quanto proposto fosse applicabile a Python  funzionerebbe solo per i numeri pari :) :)

    Quindi ‘forget it’

  • Re: MicroPython: incrementare un byte

    24/02/2024 - max.riservo ha scritto:


    23/02/2024 - max.riservo ha scritto:


    23/02/2024 - Amx ha scritto:


    Se potessi fare, come per un int, bytevalue+=1 è molto più veloce …

    Magari usando l'OR ottieni quello che vuoi : 

    <pseudocodice> bytevalue=bytevalue OR 2#1 <fine pseudocodice>

    Diciamo che se quanto proposto fosse applicabile a Python  funzionerebbe solo per i numeri pari :) :)

    Quindi ‘forget it’

    Ok grazie, stavo giusto accendendo il computer per fare qualche prova e completare il codice

Devi accedere o registrarti per scrivere nel forum
11 risposte