Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Messaggio di errore dopo il build del mio firmware

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[11] Re: Messaggio di errore dopo il build del mio firmware

Messaggioda Foto Utentec1b8 » 12 ott 2013, 9:56

mros ha scritto:dichiarazioni di variabili la effettuavo mediante il comando Res dopo Org 0x20 ( nel mio caso PIC 16f877) pertanto, se ho capito bene, le stesse non venivano associate nella memoria RAM ma bensì nella parte della program memory ovvero dove viene scritto il firmware.

No, attenzione che le variabili sono sempre nella RAM.
Quando scrivi
Codice: Seleziona tutto
                 org   0x20
variabile1       res 1
variabile2       res 1

oppure
Codice: Seleziona tutto
                 cbloock   0x20
variabile1:1
variabile2:1
                 endc

fai esattamente la stessa cosa, ovvero definisci delle label (variabile1 e variabile2) alle quali assegni un valore costate (variabile1=0x20, variabile2=0x21). La stessa cosa si sarebbe potuta scrivere
Codice: Seleziona tutto
#define variabile1 0x20
#define variabile2 0x21

ma come vedi in modo meno pratico (devo definire il valore a tutte le label e non solo alla prima).
Dicevamo quandi: vengono definite delle label ed assegnate a queste dei valori costanti, non si parla ancora di RAM, FLASH, EEPROM o altro.
Poi posso utilizzare quelle label in istruzioni diverse del programma e, solo in quel momento, possono assumere significati diversi.
Se scrivo
Codice: Seleziona tutto
          movlw    variabile1

allora utilizza la label variabile1 come costante ed carico nel registro W il suo valore ovvero 0x020. In qualsiasi modo abbia dichiarato la label1.
Se scrivo
Codice: Seleziona tutto
          movf    variabile1, 0

Allora utilizzo la label variabile come indirizzo di variabile (la variabile locata all'indirizzo 0x20) della RAM perché le variabili possono essere solo in RAM. Anche in questo caso qualsiasi sia il metodo utilizzato per dichiarare quella label.


mros ha scritto:Perché prima, partendo da Org 0x00 con programmi abbastanza lunghi non ho mai avuto di questi problemi con tante variabili dichiarate con res.....e ora che ho utilizzato per la prima volta l'interrupt mi ha fatto sto casino....ma quando il datasheet parla di locazione dedicata alle variabili da ... A .... Che intende ?

Questo è per me un domandone, no so risponderti con precisione, posso fare delle ipotesi basate sulla mia esperianza.
Anzitutto vorrei che ti fosse chiaro perché non è formalmente corretto utilizzare la org per dichiarare variabili.
Come detto prima per dichiarare una label da usare come variabile avrei molti modi possibili, tutti sintatticamente corretti. Per cercare di mettere ordine e per cercare di segnalare eventuali errori logici nei programmi come può essere ad esempio l'impiego di troppa ram o pezzi di programma che si sovrappongono in memoria o altro, chi ha scritto mplab ha deciso, da una certa versione in poi, di eseguire controlli che prima non venivano eseguiti. Per fare questo hanno dato maggior significato alla org, trattandola come indicazioni di posizione assoluta per il codice (veniva fatto anche prima ma in maniera molto più blanda). Quando scrivi org 0x20 quindi il compilatore ha la presunzione di sapere che tu stia definendo un pezzo di codice programma che inizia da 0x20. Che poi il tuo codice programma siano in realtà delle res, ovvero solo un riservare memoria, questo a lui non interessa: dovrebbe altrimenti entrare nel merito del programma, capirlo e questo non sono ancora in grado di farlo.
Se poi nel tuo codice definisci una ulteriore org, con indirizzo precedente alla org 0x20 ed il codice che scrivi si va a sovrapporre alla locazione 0x20 ecco che ti viene segnalato.
Io non credo che il compilatore ti dia errore perché utilizzi gli interrupt, ma probabilmente ti da errore anche se scrivi org 0x10 dopo aver dichiarato le variabili con una org 0x20.
perché con la org 0 no? Non lo so. perché org 0 ha un significato particolare, perché c'è un bug nel controllo o, forse più probabile, perché quanto da me detto non è corretto? Sinceramente non lo so. sicuro è che definire una variabile con la org non è più corretto.
Ultima cosa, come ho accennato prima questo controllo è stato inserito in mplab a partire da una certa release, anche piuttosto recente se non ricordo male, prma non c'era. Non è che i programmi che prima non ti davano errore erano compilati con una diversa release? (lo so mi sto O| )
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

0
voti

[12] Re: Messaggio di errore dopo il build del mio firmware

Messaggioda Foto Utentemros » 12 ott 2013, 10:31

Fabio, ti ringrazio per il tempo che mi stai dedicando......

la tua risposta è chiarissima, come ti dicevo in qualche post precedente ho sostituito il metodo RES con cblock...quando assemblo MPLBA non mi da più errore di link...ma il firmware non funziona è come se la variabile non esistesse....ora sto facendo delle prove molto banali e cioè riscrivo il programma senza interrupt e con il vecchio metodo (org...res..) e vedo cosa succede.

Il bello di tutto questo che il tuo ragionamento è chiaro come l'acqua della sardegna...tu dici che nel momento in cui nel programma scrivi "ORG 0X20" stai dicendo al compilatore che il tuo programma lo deve iniziare a scrivere li....ed ha un senso e allora cosa cambia rispetto al programma che scritto ieri con la stessa release di MPLAB dove utilizzavo ORG e RES tranquillamente...l'unica cosa che mi viene da pensare è che utilizzando l'interrupt devo indicare il punto di partenza (ORG 0x04) dove deve puntare il vettore quando parte l'evento e quindi il compilatore trova ORG 0x20 e subito dopo ORG 0x04 e mi da errore.

ora prendo un mio vecchio firmware e sostituisco RES con Cblock e vedo se funziona, se così fosse devo capire perché allora questo bip di programma non vuole funzionare #-o

ti farò sapere :cry:
Avatar utente
Foto Utentemros
10 1 5
Frequentatore
Frequentatore
 
Messaggi: 131
Iscritto il: 28 giu 2010, 9:23

Precedente

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 5 ospiti