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
Lesezeichen