Save a tutti Sto facendo un programmino che scrive dei dati su un display e mi sono creato la funzione Display(); che fa tutte le operazioni di scrittura, Quando vado a compilare mi da questo errore:
function _Display appears in multiple call graphs: rooted at _prv_int and _main (error)
Praticamente non gli va bene che richiamo la funzione sia nel main che nella funzione di interrupt, però a me serve richiamarla in tutti e 2 i momenti.... Come si puo ovviare a questo problema? Io sto usando PicC della HI-TECH
non conosco il tuo compilatore ma la soluzione più ovviam mi pare sia dichiarare questa funzione #inline (direttiva del CCS) oppure copiare il codice della stessa nella ISR (è chiaro che occuperai più rom)
anche se credo il problema sia un altro... il chiamare una function è una jmp_to_address per la ISR per cui è forse un problema di ricorsione... la isr() chiama la display() la quale potrebbe essere interrotta dall'interrupt stesso e poi? prova a disattivare gli interrupt mentre stai eseguendo la display()
"ice" ha scritto nel messaggio news:45ae70f6$0$32722$ snipped-for-privacy@reader1.news.tin.it...
Gia provato a mettere GIE=0 durante l'esecuzione di display() ma il problema rimane. Ho anche provato a commentare le chiamate alla funzione prima nel main e poi nel interrupt e l'errore non viene piu dato quindi è proprio la presenza della stessa chiamata a darlo.
Non conosco l'HI-TECH, ma sembra sia una sua precauzione per impedirti di fare pasticci... Prova a dichiarare un puntatore a funzione (assumendo che non abbia parametri e non restituisca niente, ma puoi modificare di conseguenza)
void (*dispPtr)(void);
quindi assegni
dispPtr=display;
e chiami , sia nel main che nella routine di interrupt
"Pasu" ha scritto nel messaggio news:SXxrh.59767$ snipped-for-privacy@newsfe2-win.ntli.net...
Provato ma niente si accorge che puntano alla stessa funzione.. Ho anche provato a mettere il puntatore da una parte e la chiamata dall'altra ma sempre uguale..
//variabili unsigned int Credito,e,d,CountSec,SecInibit; //char Migliaia,Centinaia,Unita,Decine,TempoBase,TempoMin,Minuti,Secondi,ContaCifre,Dato[35],Cifra; char TempoBase,TempoMin; bit FTempo,FPagato;
//Impostazioni al reset Credito=0; CountSec=61; //Moltiplicatore per arrivare al secondo FTempo=0; FPagato=0; PagMacchina=0; Inibit=0; SecInibit=SecondiInibit;
//Inizio lettura dati TempoBase=BusBanco1; TempoMin=BusBanco2;
OPTION=0b11000101; //settaggio TMR0 GIE=1; //Attivo l'interrupt del timer per la visualizzazione delle cifre T0IE=1;
Un puntatore di puntatore? :-) Cambiare compilatore? :-)
Più che il codice forse sarebbe più utile avere un'idea del flusso del programma. Perchè ad esempio hai bisogno di chiamare la display() nel main? Se ho capito bene l'interrupt viene chiamato ogni 61esimo di secondo...Non puoi chiamare la display() quando fai il controllo del tempo (con un opportuno flag...), anzichè solo quando c'è credito?
Pasu
P.S. Lo sai che la routine di display la potevi fare con un decimo del codice? ;-) Probabilmente se googli MM5450, PIC, o roba del genere, trovi il codice già scritto!
Uhm...Forse l'ottimizzatore riesce a risolvere l'assegnazione e quindi toglie il puntatore e sostituisce la chiamata diretta. Prova, se puoi, a disabilitare l'ottimizzatore. Altrimenti dovresti cercare di ingannarlo facendo qualche assegnazione farlocca Non so...
nel main e all'interrupt: if (++cippolo) dispPtr=display; if (dispPtr) dispPtr(); //questo if è buona cosa metterlo comunque quando usi puntatori
Ma resto dell'idea che basta chiamare la display() solo nella routine di interrupt. Questi sono soltanto esperimenti, non fare queste cose nel codice finale!! Ci vado poco a lavare la macchina, ma quando ci vado non voglio buttare via i soldi! :-))
Guarda, io mi son trovato bene con il loro (Microchip). Più che altro non ho avuto scelta, dato che il modello di PIC che usavo non era supportato dagli altri compilatori.. E poi mi piaceva l'idea che il compilatore fosse fatto da chi veramente conosce la macchina... Ma è solo un'opinione ovviamente, non ho avuto modo di provare altri compilatori. Poi mi serviva poter usare l'in circuit debugger e non so se altri lo supportano. Ma in generale non mi fido di compilatori ad alto livello, se l'applicazione lo permette programmo in assembler!! :-)
Ehm, sì, hai ragione, il C18 che uso è solo per i 18F a quanto pare. Penso che nessuno di quelli che hai elencato vada bene per la famiglia 16F. D'altra parte non sono pensati per essere usati con compilatori (--> il codice generato è molto poco efficiente) perchè, a differenza della famiglia
18F, non hanno adeguati modi di indirizzamento. Io ti consiglierei di usare l'assembler. All'inizio può sembrare pesante da imparare e scrivere, ma impazzisci di meno con questi problemi e soprattutto hai un effettivo controllo di quello che la macchina sta facendo.
"Pasu" ha scritto nel messaggio news:71Lrh.68628$ snipped-for-privacy@newsfe7-gui.ntli.net...
Si ma sono abbastanza capace anche in assembly il problema è che mi ci vuole molto piu tempo e poi conto di passare molto presto anche io a 18F e cosi inizio a imparare cosi..
ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here.
All logos and trade names are the property of their respective owners.