- Messaggi: 1222
- Ringraziamenti ricevuti 104
Assembly inline con C18
11 Anni 8 Mesi fa #1
da Alex68
Assembly inline con C18 è stato creato da Alex68
Ciao
volevo sapere come si possono inserire delle istruzioni in asm all'interno di una ISR in C18. In particolare ho bisogno di inserire un array di 16 elementi unsigned char in asm e decremnterne il valeore dei sngoli elementi
grazie
volevo sapere come si possono inserire delle istruzioni in asm all'interno di una ISR in C18. In particolare ho bisogno di inserire un array di 16 elementi unsigned char in asm e decremnterne il valeore dei sngoli elementi
grazie
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Alex68
- Autore della discussione
- Visitatori
11 Anni 7 Mesi fa #2
da StefA
..avevano magari fatto lo sgambetto al ka, ma il sangue restava sempre più denso dell'acqua.. [cit.]
Risposta da StefA al topic Assembly inline con C18
mi sembra che per inserire codice assembler in c18 lo devi includere tra queste due "parole..
_asm CODICE IN ASSEMBLER _endasm
come creare un array e decrementarlo in assembler..non so aiutarti.
Potresti scrivere le istruzioni in c e poi facendo "disassembly listing" vedi l'equivalente in assembler.
Ste
_asm CODICE IN ASSEMBLER _endasm
come creare un array e decrementarlo in assembler..non so aiutarti.
Potresti scrivere le istruzioni in c e poi facendo "disassembly listing" vedi l'equivalente in assembler.
Ste
..avevano magari fatto lo sgambetto al ka, ma il sangue restava sempre più denso dell'acqua.. [cit.]
Si prega Accedi o Crea un account a partecipare alla conversazione.
- StefA
- Moderator
Riduci
Di più
11 Anni 7 Mesi fa #3
da Alex68
Risposta da Alex68 al topic Assembly inline con C18
Ciao
grazie per l'intervento, ma ho risolto così.
1) ho dichiarato il mio array di appoggio da utilizzare nalla parte assembly com array globale"unsigned char _servo[12];"
2) dopo di che ho inserito, come anche da te suggerito, la parte di codice assembly tra le due parole _asm ef _endasm
ecco la parte di codice:
for (i=255;i>0;i--)
{
_asm
dcfsnz _servo+0 ,1,1 //decrementa e salta se no zero
bcf LATB,0,0 // azzera in bit 0 del LATB
dcfsnz _servo+1 ,1,1 //decrementa e salta se no zero
bcf LATB,1,0 // azzera in bit 1 del LATB
dcfsnz _servo+2 ,1,1 //decrementa e salta se no zero
bcf LATB,2,0 // azzera in bit 2 del LATC
dcfsnz _servo+3 ,1,1 //decrementa e salta se no zero
bcf LATB,3,0 // azzera in bit 3 del LATB
dcfsnz _servo+4 ,1,1 //decrementa e salta se no zero
bcf LATB,4,0 // azzera in bit 4 del LATB
dcfsnz _servo+5 ,1,1 //decrementa e salta se no zero
bcf LATB,5,0 // azzera in bit 5 del LATB
dcfsnz _servo+6 ,1,1 //decrementa e salta se no zero
bcf LATB,6,0 // azzera in bit 6 del LATB
dcfsnz _servo+7 ,1,1 //decrementa e salta se no zero
bcf LATB,7,0 // azzera in bit 7 del LATB
dcfsnz _servo+8 ,1,1 //decrementa e salta se no zero
bcf LATA,0,0 // azzera in bit 0 del LATC
dcfsnz _servo+9 ,1,1 //decrementa e salta se no zero
bcf LATA,1,0 // azzera in bit 1 del LATC
dcfsnz _servo+10 ,1,1 //decrementa e salta se no zero
bcf LATA,2,0 // azzera in bit 2 del LATC
dcfsnz _servo+11 ,1,1 //decrementa e salta se no zero
bcf LATA,3,0 // azzera in bit 3 del LATC
_endasm
}
Ho dovuto scrivere la pate in assembler perchè in C impiegava troppo tempo ad eseguire il ciclo "for (i=255;i>0;i--)", infatti sono passato da 4,3 ms in C a 1.53 ms, quasi tre volte più veloce.
Inoltre, ho notato che per riempire il mio array di apoggio con un semplice ciclo
// riempie le variabili temporanee dei servo
for ( a=0;a<12;a++){_servo [a]=servo [a];}
impiega 56.2us mente eseguendo una semplice sequenza di uguaglianza
_servo[0]=servo[0];
_servo[1]=servo[1];
_servo[2]=servo[2];
_servo[3]=servo[3];
_servo[4]=servo[4];
_servo[5]=servo[5];
_servo[6]=servo[6];
_servo[7]=servo[7];
_servo[8]=servo[8];
_servo[8]=servo[9];
_servo[10]=servo[10];
_servo[11]=servo[11];
impiega 4.8us 11.7 volte più veloce
Comincio a ricredermi sulla grande efficienza del C in quanto anche le operazioni più semplici impiegano un sacco di tempo.
ciao
grazie per l'intervento, ma ho risolto così.
1) ho dichiarato il mio array di appoggio da utilizzare nalla parte assembly com array globale"unsigned char _servo[12];"
2) dopo di che ho inserito, come anche da te suggerito, la parte di codice assembly tra le due parole _asm ef _endasm
ecco la parte di codice:
for (i=255;i>0;i--)
{
_asm
dcfsnz _servo+0 ,1,1 //decrementa e salta se no zero
bcf LATB,0,0 // azzera in bit 0 del LATB
dcfsnz _servo+1 ,1,1 //decrementa e salta se no zero
bcf LATB,1,0 // azzera in bit 1 del LATB
dcfsnz _servo+2 ,1,1 //decrementa e salta se no zero
bcf LATB,2,0 // azzera in bit 2 del LATC
dcfsnz _servo+3 ,1,1 //decrementa e salta se no zero
bcf LATB,3,0 // azzera in bit 3 del LATB
dcfsnz _servo+4 ,1,1 //decrementa e salta se no zero
bcf LATB,4,0 // azzera in bit 4 del LATB
dcfsnz _servo+5 ,1,1 //decrementa e salta se no zero
bcf LATB,5,0 // azzera in bit 5 del LATB
dcfsnz _servo+6 ,1,1 //decrementa e salta se no zero
bcf LATB,6,0 // azzera in bit 6 del LATB
dcfsnz _servo+7 ,1,1 //decrementa e salta se no zero
bcf LATB,7,0 // azzera in bit 7 del LATB
dcfsnz _servo+8 ,1,1 //decrementa e salta se no zero
bcf LATA,0,0 // azzera in bit 0 del LATC
dcfsnz _servo+9 ,1,1 //decrementa e salta se no zero
bcf LATA,1,0 // azzera in bit 1 del LATC
dcfsnz _servo+10 ,1,1 //decrementa e salta se no zero
bcf LATA,2,0 // azzera in bit 2 del LATC
dcfsnz _servo+11 ,1,1 //decrementa e salta se no zero
bcf LATA,3,0 // azzera in bit 3 del LATC
_endasm
}
Ho dovuto scrivere la pate in assembler perchè in C impiegava troppo tempo ad eseguire il ciclo "for (i=255;i>0;i--)", infatti sono passato da 4,3 ms in C a 1.53 ms, quasi tre volte più veloce.
Inoltre, ho notato che per riempire il mio array di apoggio con un semplice ciclo
// riempie le variabili temporanee dei servo
for ( a=0;a<12;a++){_servo [a]=servo [a];}
impiega 56.2us mente eseguendo una semplice sequenza di uguaglianza
_servo[0]=servo[0];
_servo[1]=servo[1];
_servo[2]=servo[2];
_servo[3]=servo[3];
_servo[4]=servo[4];
_servo[5]=servo[5];
_servo[6]=servo[6];
_servo[7]=servo[7];
_servo[8]=servo[8];
_servo[8]=servo[9];
_servo[10]=servo[10];
_servo[11]=servo[11];
impiega 4.8us 11.7 volte più veloce
Comincio a ricredermi sulla grande efficienza del C in quanto anche le operazioni più semplici impiegano un sacco di tempo.
ciao
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Alex68
- Autore della discussione
- Visitatori
11 Anni 7 Mesi fa #4
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Assembly inline con C18
Ciao Alex,
l'efficienza non viene dal C ma dal compilatore (anche se permette cose che altri linguaggi non hanno).
Nelle versioni base del C18 e XC8 non hai ottimizzazioni....e questo si nota, sia in dimensioni della flash utilizzata che velocità di esecuzione.
Saluti,
Mauro
l'efficienza non viene dal C ma dal compilatore (anche se permette cose che altri linguaggi non hanno).
Nelle versioni base del C18 e XC8 non hai ottimizzazioni....e questo si nota, sia in dimensioni della flash utilizzata che velocità di esecuzione.
Saluti,
Mauro
Si prega Accedi o Crea un account a partecipare alla conversazione.
11 Anni 7 Mesi fa #5
da Alex68
Risposta da Alex68 al topic Assembly inline con C18
Ciao Mauro
quindi posso ritenermi fortunato ad aver programmato in passato i pic 16f84 e 16f628 in assembler e che adesso mi torna utile ( speravo di non doverlo più usare ).
Comunque capisco che nella versione base del C18 non siano incluse le ottimizzazioni, ma aaddirittura sembra che siano inserite a livello di compilatore delle peggirazioni, se per un semplice ciclo for(..;..;..) impiega quasi 12 volte di più che non eseguire 12 assegnazini semplici.
Meno male che il mio array ha solo 12 elementi.
ciao e alla prossima
quindi posso ritenermi fortunato ad aver programmato in passato i pic 16f84 e 16f628 in assembler e che adesso mi torna utile ( speravo di non doverlo più usare ).
Comunque capisco che nella versione base del C18 non siano incluse le ottimizzazioni, ma aaddirittura sembra che siano inserite a livello di compilatore delle peggirazioni, se per un semplice ciclo for(..;..;..) impiega quasi 12 volte di più che non eseguire 12 assegnazini semplici.
Meno male che il mio array ha solo 12 elementi.
ciao e alla prossima
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Alex68
- Autore della discussione
- Visitatori
Moderatori: Mauro Laurenti, Pinna, StefA, Matteo Garia
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.