Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

[C] Variabili globali o variabili puntatore?

Linguaggi e sistemi

Moderatori: Foto UtentePaolino, Foto Utentefairyvilje

5
voti

[41] Re: [C] Variabili globali o variabili puntatore?

Messaggioda Foto UtenteTardoFreak » 31 mag 2015, 15:26

EcoTan ha scritto:No, non mi basta ... Ma ho l'impressione di stare scrivendo cose ovvie, cos'altro c'è da dire sulla logica della realtà?

C' da dire molto.
A quanto pare tu stai facendo funzionare un micro (a 16bit) tirandolo per il collo e questo, di solito, non è cosa né buona né giusta.
Probabilmente usi il dsPIC per sfruttarne l'ADC o il DAC o tutti e due, ma sarebbe il caso di valutare la possibilità di usare un micro più potente. Un PIC32 a 80MHz, se vuoi rimanere in Microchip, fa molto di più e, soprattutto, lo fa meglio.
In che seno meglio? Nel senso che ti permette di scrivere programmi in modo ordinato e di evitare variabili globali inutili e trattare quelle utili con funzioni di set o get. In questo mdo, cioè passando attraverso una funzione, puoi controllarne meglio la gestione.
Inoltre, se hai problemi di velocità, dovresti guardare come lavora il compilatore. I compilatori della Microchip non mi piacciono, solo quello del PIC32 (in versione non lite) funziona in maniera decente.
Personalmente uso gli ARM anche perché ho visto come lavora il compilatore. Spesso e volentieri le chiamate alle funzioni setter e getter, ove queste sono semplici tipo:
Codice: Seleziona tutto
void setVarGlobale(int val)
{
  varGlobale = val;
}

int getVarGlobale(void)
{
  return varGlobale;
}

vengono sostituiti con il caricamento diretto, o l'assegnazione diretta della variabile con una sola operazione.
Lo stesso dicasi per le operazioni con i puntatori, proprio per il fatto che essendo micro a 32bit il puntatore è contenuto in una singola parola. Non solo, ma si permettono l'arbitrio, se gli chiedi di ottimizzare in velocità, di trasformare a loro discrezione le funzioni normali in inline, e anche di sostituirti cicli corti con operazioni ripetute. Un esempio è la funzione della radice babilonese che avevo postato. Il compilatore fa un lavoro egregio.
Inoltre i mirco a 32bit, quando le variabili locali sono poche, usano i registri interni della CPU (ne hanno molti a disposizione) senza utilizzare lo stack, più veloci di quelli non c'è nessuno.
In base a queste considerazioni e possibilità di una buona coppia compilatore-micro si possono scrivere programmi in modo ordinato, evitando di dichiarare variabili external ma utilizzando i setter/getter. Se poi usi un sistema operativo multitasking queste funzioni sono praticamente d'obbligo.
Avrai quindi un header del mail da includere negli altri moduli (perché non si scrive un programma in un solo file ma si usano il moduli per diminuirne la complessità) con le funzioni che ti permettono di accedere a queste variabili.
Per quanto riguarda le interrupt nessuno ti vieta di scriverla in un modulo con le sue variabili visibili all'interno (quindi trattate come globali) ma non accessibili dall'esterno. In questo modo, con eventuali funzioni si set e di get, possono essere modificate in modo controllato anche dall'esterno, ma in modo controllato!

Una piccola nota sul linguaggio C: ancora oggi è quello più utilizzato per scrivere programmi per microcontrollori, che sono macchine che comunque si portano dietro limitazioni di codice e di RAM. Il C permette di sfruttarle al meglio, ed il saper programmare bene ed in modo ordinato permette di non impazzire e di garantirsi una buona manutenibilità del codice. Inoltre alcuni micro sono stati pensati e progettati sapendo che poi saranno programmati in C e quindi ottimizzati per il linguaggio.
D'altro canto colossi come la IAR (gli Dei dei compilatori), la ARM stessa scrivo applicativi e middleware tutto in C. E se lo fanno loro non sarò certo io quello che dice che è una minchiata farlo. [-X

Macchine diverse significa anche un approccio diverso nella scelta del linguaggio. Se una macchina con microprocessore di una certa potenza, con RAM in abbondanza (mi viene in mente sistemi tipo il raspberry, tanto per fare un esempio) si va meglio di C++ perché più comodo. Nei telefonini si usa Java perché viene, in soldoni, compilato in codice nativo e quindi risulta essere comodo e veloce.

I micro che non costano, aggeggini da 0,2$ o meno, piccoli e con poche risorse, viene conveniente programmarli in assembler proprio per far fornte alle limitazioni.
"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

[42] Re: [C] Variabili globali o variabili puntatore?

Messaggioda Foto UtenteMax2433BO » 31 mag 2015, 15:59

iOi iOi iOi
Disapprovo quello che dite, ma difenderò fino alla morte il vostro diritto di dirlo [attribuita a Voltaire]

La gentilezza dovrebbe diventare lo stile naturale della vita, non l'eccezione [Siddhārtha Gautama]
Avatar utente
Foto UtenteMax2433BO
18,6k 4 11 13
G.Master EY
G.Master EY
 
Messaggi: 4724
Iscritto il: 25 set 2013, 16:29
Località: Universo - Via Lattea - Sistema Solare - Terzo pianeta...

3
voti

[43] Re: [C] Variabili globali o variabili puntatore?

Messaggioda Foto Utenteboiler » 31 mag 2015, 18:17

aldofad ha scritto:In qualità di programmatore il tuo compito è di metterla, non ci è dato sapere con quale logica il compilatore ottimizza la cache delle variabili.


Stiamo parlando di microcontroller. La stragrande maggioranza non ha una cache. Volatile serve qui ad evitare ottimizzazioni legate all'accesso di un registro che può essere modificato da un evento esterno, evento che il compiler non può conoscere e prevedere (interrupt, memory mapped I/O,...).

Boiler
Avatar utente
Foto Utenteboiler
26,4k 5 9 13
G.Master EY
G.Master EY
 
Messaggi: 5612
Iscritto il: 9 nov 2011, 12:27

1
voti

[44] Re: [C] Variabili globali o variabili puntatore?

Messaggioda Foto UtenteWALTERmwp » 31 mag 2015, 22:52

Max2433BO ha scritto: (...) ... lo so che nei miei esempi non era necessario ne l'uso delle variabili globali, ne, tanto meno, quello di variabili puntatore.(...) Era stato fatto semplicemente per vedere la differenza (...)
quanto riportato aveva proprio il proposito di agganciare la considerazione generale ai tuoi due esempi, conservando la valenza didattica; lungi il referenziare quel codice per un biasimo.
Quello che intendi approfondire e verificare costituisce più che un esercizio.

aldofad ha scritto:Questa discussione assurda sembra risalire al 1980 quando la programmazione non era object oriented ed esisteva solo codice monolitico.
non era una discussione assurda e non apparterrebbe a quel periodo per mancanza dei termini di comparazione.

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
30,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8990
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

4
voti

[45] Re: [C] Variabili globali o variabili puntatore?

Messaggioda Foto UtenteTardoFreak » 31 mag 2015, 23:38

Per tornare ne tema di Foto UtenteMax2433BO.
Le variabili globali: di loro si conosce l'indirizzo esatto (ottenuto durante la compilazione/linking), quindi qualsiasi operazione che si fa su di loro è un'operazione diretta "prendi il valore contenuto in questo indirizzo" o "scrivi questo valore a quell'indirizzo".
Puntatore a variabile (globale e non, sostanzialmente non c'è differenza): contiene il riferimento, l'indirizzo, dove si trova il valore. Quindi l'accesso in memoria viene fatto in modo indiretto: prima si carica l'indirizzo in un registro che funge da indice e poi si va a leggere o scrivere il valore puntato dall'indirizzo indice. Il costo di quest'operazione in più è da valutare e dipende dalla piattaforma, cioè dalla macchina su cui gira il programma. Nei PC, sistemi a microprocessore relativamente veloci (ARM9 per intenderci) e micro a 32bit il costo intermini di tempo e di codice si può considerare trascurabile, nei micro a 8 o 16 bit non lo è affatto.
Dove si può trovare vantaggio ad usare un puntatore al posto di una (o più, cosa importante) variabile nei termini da te posti? Beh, un vantaggio per esempio potrebbe essere quello di avere la possibilità di passare una struct come parametro tramite il puntatore. Più la struct è grande più il sistema diventa efficiente in quanto non viene passato una copia della variabile (cioè di tutti i suoi campi) ma solo il riferimento alla variabile. il C passa le stringhe e gli array in questo modo. Con i micro questo sistema si usa molto con gran vantaggio.
Variabili locali: qui il discorso diventa complesso e anche qui dipende dalla piattaforma. Se è possibile vengono utilizzati i registri interni della CPU (quindi velocità massima), se questo non è possibile si usa lo stack. Se la macchina non gestisce un vero e proprio stack sono caxxi. Ad esempio i PIC16 e PIC18 non hanno un vero e proprio stack quindi devono usare un sistema che lo simuli, uno stack sintetizzato. Questo porta ad un drammatico decadimento delle prestazioni. Un qualsiasi stack simulato è una struttura pesante se comparata all'utilizzo pratico, cioè alla gestione delle poche variabili locali di una funzione.

Visto e considerato che stai studiando il C piace dare qualche informazione in più.
Come ho accennato prima riferendomi all'intervento di Foto UtenteEcoTan, non c'è bisogno di dichiarare delle variabili globali (quindi visibili ovunque) per una funzione di servizio dell'interurpt. E' sufficiente racchiudere la funzione in un file a se (un modulo) e dichiarare le variabili come globali per quel modulo. In questo modo si ha il vantaggio di avere un indirizzamento veloce e si evita che queste variabili siano visibili all'esterno.
L' uso dei moduli in C è proprio per realizzare il cosiddetto "information hiding" cioè il nascondere le informazioni non necessarie e lasciare solo quelle veramente necessarie per il funzionamento del programma. Nascondere le informazioni non necessarie diventa una necessità nel momento in cui i programmi diventano grandi. Se non si usa questo sistema ci potremmo trovare migliaia e migliaia di defines o di variabili visibili e tutti (e quindi con il rischio di andarle a sporcare) e con una selva di nomi che farebbero impazzire chiuque.
Mediante l'utilizzo dei moduli si riesce ad ottenere una sorta di incapsulamento che nei linguaggio orientati agli oggetti è dato dalle classi. Nei linguaggi ad oggetti si mettono insieme i dati e le funzioni (o metodi che dir si voglia) che fanno qualcosa su questi dati. Il C è un linguaggio strutturato e quindi ci troviamo le struttre dati (i dati) in un qualche posto e delle funzioni che ci fanno delle operazioni sopra. Però, con un po' di attenzione e di buona volontà si riesce a fare una sorta si programmazione ad oggetti utilizza, appunto, le possibilità date dai moduli.
Secondo me è opportuno, mentre si studia il linguaggio, porre particolare attenzione alla visibilità delle variabili, le classi di memorizzazione ed approfondire l'utilizzo dei moduli.
Se è vero che si può scrivere un programma in un solo file e che questo funzioni bene, è anche vero che questo non è il sistema migliore. Una nota personale: nel 97 ho scritto il programma più importante della mia vita, quello che mi ha permesso di fare ottimo mercato dei miei prodotti e di dare una svolta alla mia vita. Era un programma veramente complesso scritto in un solo file. E c'è anche da dire che funzionava benissimo, era (grazie a Dio) una roccia.
Di tanto in tanto lo apro e me lo guardo. Mi vengono i capelli diritti nel vedere come l'ho scritto. Mai e poi mai farei una cosa del genere oggi ma allora ero giovane, con slancio da vendere ed anche un po' incoscente a dirla tutta.

E con queste parole ti auguro un buono studio del C. E' un gran linguaggio anche se per i miei gusti, aveva ed ha ancora oggi, una sintassi semplicemente orribile (il Pascal come sintassi è un signore al confronto ;-) ). Che dire, me ne sono fatto una ragione anche perché oramai è parte della mia esistenza. :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

[46] Re: [C] Variabili globali o variabili puntatore?

Messaggioda Foto Utentesimo85 » 1 giu 2015, 2:59

aldofad ha scritto:Questa discussione assurda


Questo è qualcosa di assurdo :!:



Scusate ma avevo il telefono intelligente in tasca ed all'improvviso un gallo ha cominciato a cantare... Quando ho visto il video avrei tanto voluto non capire lo spagnolo.. :mrgreen:
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[47] Re: [C] Variabili globali o variabili puntatore?

Messaggioda Foto UtenteMax2433BO » 1 giu 2015, 6:24

Foto UtenteTardoFreak...

... SEI UN MITO!!!!! :ok: >-O-< >-O-<

Sei stato veramente chiaro ed esaustivo, ti ringrazio veramente tantissimo per il tempo dedicato alla spiegazione.

Mi sono reso conto di quanto poco so...

... ma come disse Confucio: "Quel che sai, riconosci di saperlo. Quel che non sai, riconosci di non saperlo. Ecco la sapienza.".

Ancora grazie!!!

O_/ Max
Disapprovo quello che dite, ma difenderò fino alla morte il vostro diritto di dirlo [attribuita a Voltaire]

La gentilezza dovrebbe diventare lo stile naturale della vita, non l'eccezione [Siddhārtha Gautama]
Avatar utente
Foto UtenteMax2433BO
18,6k 4 11 13
G.Master EY
G.Master EY
 
Messaggi: 4724
Iscritto il: 25 set 2013, 16:29
Località: Universo - Via Lattea - Sistema Solare - Terzo pianeta...

0
voti

[48] Re: [C] Variabili globali o variabili puntatore?

Messaggioda Foto UtenteTardoFreak » 1 giu 2015, 9:58

Troppo buono. iOi

Auguri per il tuo studio! :D

Se hai bisogno di altre informazioni non esitare a chiedere. :ok:
"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

[49] Re: [C] Variabili globali o variabili puntatore?

Messaggioda Foto UtenteMax2433BO » 1 giu 2015, 10:01

Grazie :ok:
Disapprovo quello che dite, ma difenderò fino alla morte il vostro diritto di dirlo [attribuita a Voltaire]

La gentilezza dovrebbe diventare lo stile naturale della vita, non l'eccezione [Siddhārtha Gautama]
Avatar utente
Foto UtenteMax2433BO
18,6k 4 11 13
G.Master EY
G.Master EY
 
Messaggi: 4724
Iscritto il: 25 set 2013, 16:29
Località: Universo - Via Lattea - Sistema Solare - Terzo pianeta...

Precedente

Torna a PC e informatica

Chi c’è in linea

Visitano il forum: Nessuno e 24 ospiti