Hallo Friztle 123,

der Zugriff auf den Flash-Speicher ist normal, da Konstanten immer im Flash abgelegt werden. Entweder kann man auf die Konstanten über eine Tabelle aus RETLW-Anweisungen oder über TBLRD-Befehle zugreifen. Jeder Zugriff auf den Flash-Speicher ist langsamer als ein RAM-Zugriff.

Hier der vom HT-Compiler erzeugte Code:


Code:
1:                 #include <pic.h>
2:                 
3:                 const unsigned char string_rom[5] = "test";	// String im ROM
4:                 unsigned char byte;                          // RAM-Adresse ist 0x20
5:                 
6:                 void test_fkt (const unsigned char *string)
7:                 {
8:                 	byte = *string;  
0007F1    0183     CLRF 0x3
0007F2    0822     MOVF 0x22, W
0007F3    00A4     MOVWF 0x24
0007F4    0821     MOVF 0x21, W
0007F5    2011     CALL 0x11      // Zugriff auf den String
0007F6    00A0     MOVWF 0x20
9:                 }	
0007F7    0008     RETURN
10:                
11:                void	main(void)
12:                {
13:                	test_fkt (string_rom);
0007F8    3027     MOVLW 0x27     // Parameterübergabe
0007F9    1283     BCF 0x3, 0x5
0007FA    1303     BCF 0x3, 0x6
0007FB    00A1     MOVWF 0x21     
0007FC    3000     MOVLW 0
0007FD    00A2     MOVWF 0x22
0007FE    27F1     CALL 0x7f1	  // Funktionsaufruf
14:                	for (;;); 
0007FF    2FFF     GOTO 0x7ff

// String-Tabelle 

 Line  Address  Opcode     Label                   Disassembly              
    18   0011  1283   string_table   BCF STATUS, 0x5 // String-Tabelle, Einsprung erfolgt hier                 
    19   0012  00A3                  MOVWF 0x23                             
    20   0013  1BA4   string_indir   BTFSC 0x24, 0x7                        
    21   0014  281E                  GOTO 0x1e                              
    22   0015  1B24                  BTFSC 0x24, 0x6                        
    23   0016  2826                  GOTO 0x26                              
    24   0017  0824                  MOVF 0x24, W                           
    25   0018  008A                  MOVWF PCLATH                           
    26   0019  0823                  MOVF 0x23, W                           
    27   001A  0AA3                  INCF 0x23, F                           
    28   001B  1903                  BTFSC STATUS, 0x2                      
    29   001C  0AA4                  INCF 0x24, F                           
    30   001D  0082                  MOVWF PCL                              
    31   001E  1383                  BCF STATUS, 0x7                        
    32   001F  1824                  BTFSC 0x24, 0                          
    33   0020  1783                  BSF STATUS, 0x7                        
    34   0021  0823   ?_test_fkt     MOVF 0x23, W                           
    35   0022  0AA3                  INCF 0x23, F                           
    36   0023  0084   code_ptr       MOVWF FSR                              
    37   0024  0800                  MOVF INDF, W                           
    38   0025  0008                  RETURN                                 
    39   0026  0782                  ADDWF PCL, F                           
    40   0027  3474                  RETLW 0x74      // Ab hier steht der String                            
    41   0028  3465                  RETLW 0x65                             
    42   0029  3473                  RETLW 0x73                             
    43   002A  3474                  RETLW 0x74                             
    44   002B  3400                  RETLW 0
Wenn Du mehr Beispiele für die Codeerzeugung benötigst, solltest Du meinem obigen Link folgen und selbst mit der Lite-Version experimentieren .

Bernd