Rubrica Pic32: stima prestazioni velocità.
Ciao a tutti,
l'approccio ai PIC32 continua e visto che il progetto, a prescindere dal micro, funziona abbastanza bene ci accingiamo a realizzare dei prototipi su circuito stampato.
Prima di fare ciò stavo provando un attimo le prestazioni del micro: durante l'esecuzione del programma la CPU sarà sollecitata da una quantità di elaborazione abbastanza pesante o meglio, dovrà rispettare vincoli temporali piuttosto ristretti, e volevo quindi verificare effettivamente di usare il micro al masssimo delle sue potenzialità.
Il clock del sistema è 80 MHz (oscillatore XT 8MHz + PLL x10) quindi il massimo utilizzabile. Ho letto alcune discussioni che discutono del fatto che con C32 di Microchip per ottenere il masssimo delle prestazioni è necessario apporre la magic function:
che permette di settare il valore di "wait states" di flash e ram opportuno per ottenere il top delle prestazioni. Dopo aver cercato invano di replicare la funzione di libreria Microchip con MikroCpic32 sembra che gli sviluppatori MikroElektronika abbian chiarito che i valori sono automaticamente settati dal compilatore per ottenere il massimo delle prestazioni.
Detto questo veniamo al dunque:grazie alle istruzioni atomiche INV SET CLR che permettono di invertire, settare o pulire un registro con una sola istruzione dovrebbe quindi essere possibile ottenere un onda quadra in uscita di frequenza=40 MHz.
Ho trovato questo esempio scritto per C32
grazie al quale l'autore sostiene di riuscire ad ottenere in uscita un'onda quadra a 40 MHz.
Ho provato a scrivere qualcosa di simile in MikroC:
Ottenendo in uscita una onda quadra 10 MHz.
La mia domanda (che ai più sembrerà banale ma ben venga se questo sevirà a fugare ogni mio dubbio) è:
guardando l'equivalente assembly il codice corrisponde a:
Qui interviene la mia ignoranza nel rapporto linguaggio macchina-esecuzione del codice: da quante istruzioni è composto ogni ciclo? O meglio:quanto tempo impiega ogni ciclo?
O meglio ancora: sto viaggiando davvero a 80 MHz e quindi con l'acceleratore a manetta?
Grazie mille.
l'approccio ai PIC32 continua e visto che il progetto, a prescindere dal micro, funziona abbastanza bene ci accingiamo a realizzare dei prototipi su circuito stampato.
Prima di fare ciò stavo provando un attimo le prestazioni del micro: durante l'esecuzione del programma la CPU sarà sollecitata da una quantità di elaborazione abbastanza pesante o meglio, dovrà rispettare vincoli temporali piuttosto ristretti, e volevo quindi verificare effettivamente di usare il micro al masssimo delle sue potenzialità.
Il clock del sistema è 80 MHz (oscillatore XT 8MHz + PLL x10) quindi il massimo utilizzabile. Ho letto alcune discussioni che discutono del fatto che con C32 di Microchip per ottenere il masssimo delle prestazioni è necessario apporre la magic function:
- Codice: Seleziona tutto
SYSTEMConfigPerformance(80000000);
che permette di settare il valore di "wait states" di flash e ram opportuno per ottenere il top delle prestazioni. Dopo aver cercato invano di replicare la funzione di libreria Microchip con MikroCpic32 sembra che gli sviluppatori MikroElektronika abbian chiarito che i valori sono automaticamente settati dal compilatore per ottenere il massimo delle prestazioni.
Detto questo veniamo al dunque:grazie alle istruzioni atomiche INV SET CLR che permettono di invertire, settare o pulire un registro con una sola istruzione dovrebbe quindi essere possibile ottenere un onda quadra in uscita di frequenza=40 MHz.
Ho trovato questo esempio scritto per C32
- Codice: Seleziona tutto
#include <p32xxxx.h>
#include <plib.h>
// sysclock = 80MHz
#pragma config FPLLMUL = MUL_20, FPLLIDIV = DIV_2, FPLLODIV = DIV_2, FWDTEN = OFF
#pragma config POSCMOD = HS, FNOSC = PRIPLL, FPBDIV = DIV_1
extern void toggle(int *portinv, int mask);
int main(void)
{
// configure cache, wait states, PBDIV
SYSTEMConfigPerformance(80000000UL);
mJTAGPortEnable( 0);
// enable pin RA0 output
TRISA = 0xFFFE;
// call the infinite loop
toggle( &LATAINV, 0x0001); // toggle LED0 continuosly
return 0;
} // main
grazie al quale l'autore sostiene di riuscire ad ottenere in uscita un'onda quadra a 40 MHz.
Ho provato a scrivere qualcosa di simile in MikroC:
- Codice: Seleziona tutto
while(1)
LATGINV=0x2000; // toggle LED0 continuosly
Ottenendo in uscita una onda quadra 10 MHz.
La mia domanda (che ai più sembrerà banale ma ben venga se questo sevirà a fugare ogni mio dubbio) è:
guardando l'equivalente assembly il codice corrisponde a:
- Codice: Seleziona tutto
L_main274:
;Vision Salad.c,1177 :: LATGINV=0x2000; // toggle LED0 continuosly
ORI R2, R0, 8192
SW R2, Offset(LATGINV+0)(GP)
J L_main274
NOP
Qui interviene la mia ignoranza nel rapporto linguaggio macchina-esecuzione del codice: da quante istruzioni è composto ogni ciclo? O meglio:quanto tempo impiega ogni ciclo?
O meglio ancora: sto viaggiando davvero a 80 MHz e quindi con l'acceleratore a manetta?
Grazie mille.

]