Ciao. Mi rivolgo specialmente a chi conosce mikroC.
Vorrei un consiglio su come poter ottimizzare l'accesso ad una matrice: mi spiego meglio.
Vorrei provare a generare un segnale VGA con un linguaggio ad alto livello, sfruttando un PIC18 a 64Mhz (P18F46K20).
Restando coi piedi per terra e 2 rapidi conti il problema maggiore è quello del generae i pixel per ogni riga.
L'utopia è quella di avere una matrice 24colonne*10righe di caratteri e una mappa caratteri di 128 (o al più 96) di 8 bit che verranno portati su una porta e ruotati. Ovviamente monocolore.
Lavorando con MikroC :
unsigned short idxrow
unsigned int vLine
una istruzione tipo... idxrow= ((vLine-116)>>5); viene esequita in 59 cicli xkè trasformata in questo modo dal compilatore:
;VgaTest.c,69 :: idxrow= ((vLine-116)>>5);
$0062 $0E74 MOVLW 116
$0064 $5C15 SUBWF _vLine, 0, 0
$0066 $6E03 MOVWF STACK_3, 0
$0068 $0E00 MOVLW 0
$006A $5816 SUBWFB _vLine+1, 0, 0
$006C $6E04 MOVWF STACK_3+1, 0
$006E $0E05 MOVLW 5
$0070 $6E02 MOVWF STACK_2, 0
$0072 $C003 F000 MOVFF STACK_3, STACK_0
$0076 $C004 F001 MOVFF STACK_3+1, STACK_0+1
$007A $5002 MOVF STACK_2, 0, 0
$007C $ L_main_10:
$007C $0102 MOVLB 2
$007E $E005 BZ L_main_11
$0080 $3201 RRCF STACK_0+1, 1, 0
$0082 $3200 RRCF STACK_0, 1, 0
$0084 $9E01 BCF STACK_0+1, 7, 0
$0086 $0FFF ADDLW 255
$0088 $D7F9 BRA L_main_10
$008A $ L_main_11:
$008A $0102 MOVLB 2
$008C $C000 F200 MOVFF STACK_0, _idxrow
quando invece una cosa come sotto la fa in 11 cicli
idxrow= (vLine-116);
asm {
rrncf _idxrow,1
rrncf _idxrow,1
rrncf _idxrow,1
rrncf _idxrow,1
rrncf _idxrow,1
MOVLW 15
ANDWF _idxrow, 1, 1
}
Quello da super ottimizzare è la parte dei puntatore per accedere alla mappa caratteri e memoria video
volatile const unsigned short *cset;
volatile unsigned short *vrow;
PORTD = cset[*vrow++]; <<=== QUESTA
l'istruzione viene esequita in circa 1.31us.... a cui poi devo aggiungere lo shift... sarà possibile ottimizzare ?
Posso condindividere sorgente se interessa.