Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Dichiarazione: const rom char*

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[11] Re: Dichiarazione: const rom char*

Messaggioda Foto Utentegiovannispina » 2 ott 2013, 13:38

wizard ha scritto:Chiedo scusa per il ritardo Foto UtenteShockwaver
Il problema da te esposto mi è noto ma ti assicuro che non è questo il caso, la scritta rom è presente sia nel .h che nel .c
Questo è il .c ----> void scrivi_stringa(const rom char *str)
Questo è il .h ----> void scrivi_stringa(const rom char *);


Vista così la funzione è chiarissima. Prende una stringa da ROM e la scrive in RAM. Siccome non passa il puntatore al nuovo indirizzo, presumo che venga scritta direttamente su un LCD. Intuitivo. Ora non ho letto i messaggi precedenti ma funziona così:

Codice: Seleziona tutto
// definizione
const rom char stringa[] = { "Sono una stringa in ROM" };

// chiamata
scrivi_stringa(stringa);
Avatar utente
Foto Utentegiovannispina
126 1 3
 
Messaggi: 43
Iscritto il: 27 lug 2013, 12:31

0
voti

[12] Re: Dichiarazione: const rom char*

Messaggioda Foto Utentegiovannispina » 2 ott 2013, 14:15

L'utilità sta nel fatto che i PIC16/18 non hanno abbastanza RAM per poter caricare interfacce grafiche da file. Quindi per evitare di usare tutta la RAM, si usa scrivere il tutto in ROM per poi trasferire temporaneamente la stringa in RAM e questo è ciò che fa scrivi_stringa. La funzione sostanzialmente carica in RAM la stringa per poi la mostrarla sul display, una volta fatta la visualizzazione viene deallocata la parte usata in memoria.
Avatar utente
Foto Utentegiovannispina
126 1 3
 
Messaggi: 43
Iscritto il: 27 lug 2013, 12:31

0
voti

[13] Re: Dichiarazione: const rom char*

Messaggioda Foto UtenteTardoFreak » 2 ott 2013, 14:19

Non c'è mica bisogno di copiare la stringa in RAM per scriverla.

Perché lo fai? :-M
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,9k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15754
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

[14] Re: Dichiarazione: const rom char*

Messaggioda Foto Utentegiovannispina » 2 ott 2013, 15:16

TardoFreak ha scritto:Non c'è mica bisogno di copiare la stringa in RAM per scriverla.

Perché lo fai? :-M

Perché lo faresti in ogni caso anche se la scrittura fosse diretta.
Ti faccio un esempio.

metti che la funzione per la visualizzazione di una stringa sia questa:
Codice: Seleziona tutto
LCD_DrawString(unsigned, unsigned, char*);

dove i primi parametri sono per la posizione e l'ultimo per la stringa.

Già per com'è definita la funzione non puoi passare un puntatore di tipo ROM. Allora si usa fare così:

Codice: Seleziona tutto
unsigned strlen_rom(const rom char* str)
{
   unsigned i;
   i = 0;
   while (str[i] != '\0')
      i++;
   
   return i;
}

void rom2mem(char** dest, const rom char* src)
{
   unsigned i, l;
   l = strlen_rom(str)+1;
   if (!(l-1)) {
      *dest = NULL;
      return;
   }

   *dest = (char*)malloc(l);

   for (i = 0; i < l; ++i)
      *dest[i] = src[i];
}

LCD_DrawRomString(unsigned x, unsigned y, const rom char* str)
{
   char* tmp;

   rom2mem(&tmp, str);
   LCD_DrawString(x, y, tmp);
   free(tmp);
}


In questo caso la funzione che t'ho fornito ti impone di allocare in ram una stringa per poi visualizzarla, ma anche se fosse stato un DrawChar dovresti spostare il singolo byte in RAM (poiché lo passi dallo stack) e quindi una chiamata del tipo
Codice: Seleziona tutto
DrawChar(x, y, rom_str[index]);

comporterebbe lo stesso uno spostamento. In un modo o nell'altro devi per forza spostare dalla ROM alla RAM.
Avatar utente
Foto Utentegiovannispina
126 1 3
 
Messaggi: 43
Iscritto il: 27 lug 2013, 12:31

1
voti

[15] Re: Dichiarazione: const rom char*

Messaggioda Foto UtenteTardoFreak » 2 ott 2013, 16:08

Suppongo che tu abbia anche una LCD_DrawChar per scrivere un singolo carattere ed una funzione per posizionare il cursore quindi
Codice: Seleziona tutto
void LCD_DrawRomString(unsigned x, unsigned y, const rom char* str)
{
  LCD_SetPos(x,y);
  while(*str) LCD_DrawChar(*str++);
}


Non capisco tutte le altre complicazioni. :-M
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,9k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15754
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

[16] Re: Dichiarazione: const rom char*

Messaggioda Foto UtenteShockwaver » 2 ott 2013, 16:09

giovannispina ha scritto:Perché lo faresti in ogni caso anche se la scrittura fosse diretta.

Ma non è vero :lol:
Un sacco di librerie usano funzioni che pescano direttamente dalla memoria flash...
Non ho molto tempo ultimamente ma ad occhio e croce questo post sul forum della microchip forse può fare un po' di luce...
Anyone who has never made a mistake has never tried anything new
Two things are infinite: universe and human stupidity, and I'm not sure about the former
You did not really understand something unless you can explain it to your grandmother
A. Einstein
Avatar utente
Foto UtenteShockwaver
770 1 5 11
Expert
Expert
 
Messaggi: 859
Iscritto il: 3 mar 2010, 18:56

0
voti

[17] Re: Dichiarazione: const rom char*

Messaggioda Foto Utentegiovannispina » 2 ott 2013, 16:49

Shockwaver ha scritto:
giovannispina ha scritto:Perché lo faresti in ogni caso anche se la scrittura fosse diretta.

Ma non è vero :lol:
Un sacco di librerie usano funzioni che pescano direttamente dalla memoria flash...
Non ho molto tempo ultimamente ma ad occhio e croce questo post sul forum della microchip forse può fare un po' di luce...


TardoFreak ha scritto:Suppongo che tu abbia anche una LCD_DrawChar per scrivere un singolo carattere ed una funzione per posizionare il cursore quindi
Codice: Seleziona tutto
void LCD_DrawRomString(unsigned x, unsigned y, const rom char* str)
{
  LCD_SetPos(x,y);
  while(*str) LCD_DrawChar(*str++);
}


Non capisco tutte le altre complicazioni. :-M


Rispondo a tutti e due. Lo spostamento avviene lo stesso, anche se l'accesso è diretto.
Chiamando *str++ avviene lo stesso uno spostamento in RAM, byte per byte, ma avviene lo stesso.
Questo volevo dire. Quindi anche se la libreria permettesse la scrittura con un puntatore rom, alla fine farebbe lo stesso procedimento.

A volte, però, è necessario copiare l'intera stringa perché la libreria non te lo permette; da qui nascono le "altre complicazioni" con l'esempio che ho fatto prima...cioè supponevo che non vi era un DrawChar.
Avatar utente
Foto Utentegiovannispina
126 1 3
 
Messaggi: 43
Iscritto il: 27 lug 2013, 12:31

1
voti

[18] Re: Dichiarazione: const rom char*

Messaggioda Foto UtenteTardoFreak » 2 ott 2013, 16:55

giovannispina ha scritto:Chiamando *str++ avviene lo stesso uno spostamento in RAM, byte per byte, ma avviene lo stesso.


Ma cosa stai dicendo? :shock:
Non è affatto vero! [-X

Se poi mi vuoi venire a dire che comunque vengono utilizzate delle variabili in ram (tipo il puntatore stesso) allora, con tutto il rispetto, ti dico che O|

:mrgreen:
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,9k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15754
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

[19] Re: Dichiarazione: const rom char*

Messaggioda Foto Utentegiovannispina » 2 ott 2013, 17:30

TardoFreak ha scritto:
giovannispina ha scritto:Chiamando *str++ avviene lo stesso uno spostamento in RAM, byte per byte, ma avviene lo stesso.


Ma cosa stai dicendo? :shock:
Non è affatto vero! [-X

Se poi mi vuoi venire a dire che comunque vengono utilizzate delle variabili in ram (tipo il puntatore stesso) allora, con tutto il rispetto, ti dico che O|

:mrgreen:

Ermh...allora premetto che io non sono una cima in fatto di elettronica e che di microcontrollori conosco solo i P16/18, ma per quel che sapevo per eseguire un'istruzione
Codice: Seleziona tutto
LCD_DrawChar(var);


vengono usati dei registri, ed i registri (mi pare) che facciano parte della RAM. Voglio dire, in quale altro modo farebbe il microcontrollore a mandare un valore dalla ROM ad un LCD? Credo che debba necessariamente essere spostata in ram, no? Correggetemi se sbaglio.
Avatar utente
Foto Utentegiovannispina
126 1 3
 
Messaggi: 43
Iscritto il: 27 lug 2013, 12:31

0
voti

[20] Re: Dichiarazione: const rom char*

Messaggioda Foto UtenteShockwaver » 2 ott 2013, 17:33

No, ci sei..
Alla funzione viene passato una copia del valore puntato da *str, la copia avviene.
sorry

Edit: è altresì vero che OGNI funzione che verrà richiamata per la comunicazione col display, farà una copia dei bytes necessari, quindi farla tu prima aggiunge una fase di copiatura superflua.
Anyone who has never made a mistake has never tried anything new
Two things are infinite: universe and human stupidity, and I'm not sure about the former
You did not really understand something unless you can explain it to your grandmother
A. Einstein
Avatar utente
Foto UtenteShockwaver
770 1 5 11
Expert
Expert
 
Messaggi: 859
Iscritto il: 3 mar 2010, 18:56

PrecedenteProssimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 18 ospiti