PIC24/dsPic : Bootloader e Interrupts
13 Anni 6 Mesi fa #6
da Gianni
Sono tutti bravi ad essere "open" con il "source" degli altri.
Un amico è colui che ti dice sempre quando stai sbagliando. Il mio miglior amico è il parser.
SettoreZero
Risposta da Gianni al topic Re: PIC24/dsPic : Bootloader e Interrupts
Niente da fare.
Se utilizzo il linker fornito di default per l'utilizzo col bootloader e tratto gli interrupt in maniera normale, mplab compila ma poi il programma non funziona.
Se utilizzo quell'esempio di fare la funzione isrtable, mplab mi restituisce un errore:
address for section .application_ivt conflicts with absolute section _[numero lungo]
in ogni caso la funzione isrtable la devo dichiarare dopo la funzione di interrupt (void _ISR _T1Interrupt(void)), se la dichiaro prima mi viene detto che il simbolo _T1Interrupt (ad esempio) non è definito... quando in realtà sul C30 i simboli di interrupt sono già definiti nel linker e nell'header... boh
Se utilizzo il linker fornito di default per l'utilizzo col bootloader e tratto gli interrupt in maniera normale, mplab compila ma poi il programma non funziona.
Se utilizzo quell'esempio di fare la funzione isrtable, mplab mi restituisce un errore:
address for section .application_ivt conflicts with absolute section _[numero lungo]
in ogni caso la funzione isrtable la devo dichiarare dopo la funzione di interrupt (void _ISR _T1Interrupt(void)), se la dichiaro prima mi viene detto che il simbolo _T1Interrupt (ad esempio) non è definito... quando in realtà sul C30 i simboli di interrupt sono già definiti nel linker e nell'header... boh
Sono tutti bravi ad essere "open" con il "source" degli altri.
Un amico è colui che ti dice sempre quando stai sbagliando. Il mio miglior amico è il parser.
SettoreZero
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Gianni
- Autore della discussione
- Elite Member
Riduci
Di più
13 Anni 6 Mesi fa #7
da Gianni
Sono tutti bravi ad essere "open" con il "source" degli altri.
Un amico è colui che ti dice sempre quando stai sbagliando. Il mio miglior amico è il parser.
SettoreZero
Risposta da Gianni al topic Re: PIC24/dsPic : Bootloader e Interrupts
RISOLTO
Il problema principale stava nel fatto che in realtà... non avevo abilitato l'interrupt (!!)
Lo so è un erroraccio... ma passare da pic16 a pic18 a pic24 di continuo fa fare anche di questi errori stupidi. Poi in ogni caso funziona tutto come giustamente detto in quel link sul forum della microchip.
Basta semplicemente utilizzare il link fornito per l'utilizzo col bootloader: nel linker i vettori di interrupt vengono già rimappati senza che noi dobbiamo impazzire, è tutto assolutamente indolore.
La nota presente nei file sorgenti della MAL, che dice di creare una funzione ISRTABLE e piazzarla nella locazione 0x1404 sarà qualche residuo rimasto dalle vecchie versioni e quindi DA NON TENERE IN CONSIDERAZIONE, perchè facendo così si crea un conflitto col nuovo linker dato che le locazioni di memoria usate dalla tabella interrupt rimappata occupano pure la locazione 0x1404 sfruttata da questa funzione, ecco il senso di quell'errore che avevo prima: si sovrappone la isrtable con una locazione di memoria definita nel linker... A maggior conferma che quella nota è un rimasuglio delle vecchie versioni.
Ultima nota: dopo una lettura più approfondita del manuale del C30 ho capito che nei vettori di interrupt dei pic24 non viene messa propriamente un'istruzione GOTO ma il compilatore ci piazza direttamente il valore dell'indirizzo di memoria nel quale risiede la funzione da eseguire per quell'interrupt.
Problema risolto, ho superato un altro scoglio. Basta leggere, leggere, leggere e rileggere e la maggior parte delle volte si scopre che una cosa non funziona per un errore assolutamente banale.
Il problema principale stava nel fatto che in realtà... non avevo abilitato l'interrupt (!!)
Lo so è un erroraccio... ma passare da pic16 a pic18 a pic24 di continuo fa fare anche di questi errori stupidi. Poi in ogni caso funziona tutto come giustamente detto in quel link sul forum della microchip.
Basta semplicemente utilizzare il link fornito per l'utilizzo col bootloader: nel linker i vettori di interrupt vengono già rimappati senza che noi dobbiamo impazzire, è tutto assolutamente indolore.
La nota presente nei file sorgenti della MAL, che dice di creare una funzione ISRTABLE e piazzarla nella locazione 0x1404 sarà qualche residuo rimasto dalle vecchie versioni e quindi DA NON TENERE IN CONSIDERAZIONE, perchè facendo così si crea un conflitto col nuovo linker dato che le locazioni di memoria usate dalla tabella interrupt rimappata occupano pure la locazione 0x1404 sfruttata da questa funzione, ecco il senso di quell'errore che avevo prima: si sovrappone la isrtable con una locazione di memoria definita nel linker... A maggior conferma che quella nota è un rimasuglio delle vecchie versioni.
Ultima nota: dopo una lettura più approfondita del manuale del C30 ho capito che nei vettori di interrupt dei pic24 non viene messa propriamente un'istruzione GOTO ma il compilatore ci piazza direttamente il valore dell'indirizzo di memoria nel quale risiede la funzione da eseguire per quell'interrupt.
Problema risolto, ho superato un altro scoglio. Basta leggere, leggere, leggere e rileggere e la maggior parte delle volte si scopre che una cosa non funziona per un errore assolutamente banale.
Sono tutti bravi ad essere "open" con il "source" degli altri.
Un amico è colui che ti dice sempre quando stai sbagliando. Il mio miglior amico è il parser.
SettoreZero
Si prega Accedi o Crea un account a partecipare alla conversazione.
13 Anni 5 Mesi fa #8
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: PIC24/dsPic : Bootloader e Interrupts
Ciao Gianni,
Grazie per aver condiviso la risoluzione del problema.
Relativamente ai vettori delle interruzioni, effettivamente lo scrivere gli indirizzi delle funzioni viene utilizzato piu’ frequentemente che non ilGOTO.
Anche se il goto e’ un salto ad un indirizzo, scrivere direttamente l’indirizzo porta dei vantaggi:
1) Ridurre iltempo di latenza, visto che non bisogna caricare e decodificare l’istruzione GOTO.
2) Minor latenza si puo’ tradurre anche in un risveglio del microcontrolore, da uno stato si sleep, piu’ rapido e quindi con un minor utilizzo di energia (importante per sistemi a batteria che devono durare per 10 anni alimentati da una sola batteria).
3) Si hanno a disposizione i due byte interamente per un indirizzo, permettendo di avere una maggior flessibilita’ nel localizzare la funzione ISR. In microcontrollori con 64K di memoria significa poter piazzare le funzioni ovunque. Se si avessero solo due byte e si facesse uso di un goto, il salto sarebbe limitato. Questa e’ la ragione per cui nei PIC18 si hanno piu’ byte a disposizione.
Saluti,
Mauro
Grazie per aver condiviso la risoluzione del problema.
Relativamente ai vettori delle interruzioni, effettivamente lo scrivere gli indirizzi delle funzioni viene utilizzato piu’ frequentemente che non ilGOTO.
Anche se il goto e’ un salto ad un indirizzo, scrivere direttamente l’indirizzo porta dei vantaggi:
1) Ridurre iltempo di latenza, visto che non bisogna caricare e decodificare l’istruzione GOTO.
2) Minor latenza si puo’ tradurre anche in un risveglio del microcontrolore, da uno stato si sleep, piu’ rapido e quindi con un minor utilizzo di energia (importante per sistemi a batteria che devono durare per 10 anni alimentati da una sola batteria).
3) Si hanno a disposizione i due byte interamente per un indirizzo, permettendo di avere una maggior flessibilita’ nel localizzare la funzione ISR. In microcontrollori con 64K di memoria significa poter piazzare le funzioni ovunque. Se si avessero solo due byte e si facesse uso di un goto, il salto sarebbe limitato. Questa e’ la ragione per cui nei PIC18 si hanno piu’ byte a disposizione.
Saluti,
Mauro
Si prega Accedi o Crea un account a partecipare alla conversazione.
13 Anni 5 Mesi fa #9
da Gianni
Sono tutti bravi ad essere "open" con il "source" degli altri.
Un amico è colui che ti dice sempre quando stai sbagliando. Il mio miglior amico è il parser.
SettoreZero
Risposta da Gianni al topic Re: PIC24/dsPic : Bootloader e Interrupts
Sul punto 3 non ci avevo ragionato e mi hai aperto la mente.
Forse il senso di quella frase: "It is necessary to define jump table as a function because C30 will not store 24-bit wide values in program memory as variables" è relativa proprio a questa questione?
Fammici ragionare....
I PIC24 hanno le "celle" di memoria programma a 24bit (in realtà a 32 ma gli 8 bit superiori sono bit "fantasma" posti sempre a zero), il che significa che per questa questione delle interruzioni potrebbe contenere un indirizzo per un dispositivo fino a 15Mb (!)...
Quella frase dice che il C30 non immagazzina i valori a 24 bit nella memoria programma come variabili... Il che può significare che: normalmente magari ler ISR vengono sempre allocate in una posizione standard in maniera da poter memorizzare nella memoria programma un indirizzo piu piccolo, diciamo a 16bit, quindi nella parte iniziale della memoria. In questo caso essendoci il bootloader e quindi subito dopo il programma, le isr devono essere spostate piu in basso e quindi non basta piu un indirizzo a 16bit, percio si deve definire una funzione esterna, posta piu in alto, da richiamare ogni volta che c'è un interrupt e la quale a sua volta richiama quella giusta?
Però nelle nuove revisioni questa cosa non esiste piu e la locazione della tabella interrupt viene impostata nel linker per cui anche il tempo di latenza dovrebbe essere minore.
Forse il senso di quella frase: "It is necessary to define jump table as a function because C30 will not store 24-bit wide values in program memory as variables" è relativa proprio a questa questione?
Fammici ragionare....
I PIC24 hanno le "celle" di memoria programma a 24bit (in realtà a 32 ma gli 8 bit superiori sono bit "fantasma" posti sempre a zero), il che significa che per questa questione delle interruzioni potrebbe contenere un indirizzo per un dispositivo fino a 15Mb (!)...
Quella frase dice che il C30 non immagazzina i valori a 24 bit nella memoria programma come variabili... Il che può significare che: normalmente magari ler ISR vengono sempre allocate in una posizione standard in maniera da poter memorizzare nella memoria programma un indirizzo piu piccolo, diciamo a 16bit, quindi nella parte iniziale della memoria. In questo caso essendoci il bootloader e quindi subito dopo il programma, le isr devono essere spostate piu in basso e quindi non basta piu un indirizzo a 16bit, percio si deve definire una funzione esterna, posta piu in alto, da richiamare ogni volta che c'è un interrupt e la quale a sua volta richiama quella giusta?
Però nelle nuove revisioni questa cosa non esiste piu e la locazione della tabella interrupt viene impostata nel linker per cui anche il tempo di latenza dovrebbe essere minore.
Sono tutti bravi ad essere "open" con il "source" degli altri.
Un amico è colui che ti dice sempre quando stai sbagliando. Il mio miglior amico è il parser.
SettoreZero
Si prega Accedi o Crea un account a partecipare alla conversazione.
13 Anni 5 Mesi fa #10
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: PIC24/dsPic : Bootloader e Interrupts
Ciao Gianni,
per il punto 3 non mi sono inventato nulla, ma mi fa piacere che ti sia tornato utile.
Riguardo agli altri punti credo che si scenda nell'architettura in un certo dettaglio.
Dovrei rivedere le varie modalità d'indirizzamento supportate. In particolare per le istruzione CALL, JP, GOTO e MOVE.
E' vero che la memoria programma e' più ampia ma i registri per manipolare i dati sono a 16 bit quindi rimane il vincolo nei salti.
La latenza nel servire un interrupt e' fissa e dipende dall'architettura (per il tempo minimo).
Al tempo minimo va aggiunto il resto che bisogna fare (salvare registri nello stack), saltare da una funzione ad un altra (remapping dei vettori).
Credo che vedere un programma in assembly dovrebbe chiarire la questione e mostrare quello che viene fatto.
Il codice assembly rifletterà le modalità d'indirizzamento legate all'architettura del particolare microcontrollore.
Saluti,
Mauro
per il punto 3 non mi sono inventato nulla, ma mi fa piacere che ti sia tornato utile.
Riguardo agli altri punti credo che si scenda nell'architettura in un certo dettaglio.
Dovrei rivedere le varie modalità d'indirizzamento supportate. In particolare per le istruzione CALL, JP, GOTO e MOVE.
E' vero che la memoria programma e' più ampia ma i registri per manipolare i dati sono a 16 bit quindi rimane il vincolo nei salti.
La latenza nel servire un interrupt e' fissa e dipende dall'architettura (per il tempo minimo).
Al tempo minimo va aggiunto il resto che bisogna fare (salvare registri nello stack), saltare da una funzione ad un altra (remapping dei vettori).
Credo che vedere un programma in assembly dovrebbe chiarire la questione e mostrare quello che viene fatto.
Il codice assembly rifletterà le modalità d'indirizzamento legate all'architettura del particolare microcontrollore.
Saluti,
Mauro
Si prega Accedi o Crea un account a partecipare alla conversazione.
Moderatori: Mauro Laurenti, Matteo Garia
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.