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

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Alex68
  • Visitatori
  • Visitatori
11 Anni 7 Mesi fa #2 da StefA
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

..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
  • Avatar di StefA
  • Moderator
  • Moderator
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

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Alex68
  • Visitatori
  • 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

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Moderator
  • Moderator
Di più
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. :P

ciao e alla prossima

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Alex68
  • Visitatori
  • Visitatori
Moderatori: Mauro LaurentiPinnaStefAMatteo Garia

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.

Login