Mikrocontroller und Digitale Elektronik
›
Thread
AVR: avr-libc, eeprom Zugriffsgeschwindigkeit
G
Gast
Gast
24.11.2009 10:46
#1494058
Hat sich jemand mal angesehen, wieviel länger der Lesezugriff auf ein
Byte im EEPROM im Vergleich zum Zugriff aufs RAM dauert?
Ich habe im Datenblatt gefunden, dass auf jeden Fall 4 Zyklen Pause ist,
aber was "kosten" die Routinen aus der AVR Bibliothek?
Einfach mal ein Blick in die Quellen werfen: 1 /* uint8_t eeprom_read_byte (uint8_t EEMEM *addr);
2 */
3
4 #define ret_lo r24
5 #define ret_hi r25
6
7 ENTRY eeprom_read_byte
8
9 #if __AVR_XMEGA__ /* -------------------------------------------- */
10
11 rcall eeprom_mapen
12 ld ret_lo, Z
13 clr ret_hi
14 ret
15
16 ENTRY eeprom_mapen
17
18 ; Load base address of NVM.
19 ldi ZL, lo8(NVM_BASE)
20 ldi ZH, hi8(NVM_BASE)
21
22 ; Wait until NVM is not busy.
23 1: ldd r19, Z + NVM_STATUS - NVM_BASE
24 sbrc r19, NVM_NVMBUSY_bp
25 rjmp 1b
26
27 ; Enable EEPROM mapping into data space.
28 ldd r19, Z + NVM_CTRLB - NVM_BASE
29 ori r19, NVM_EEMAPEN_bm
30 std Z + NVM_CTRLB - NVM_BASE, r19
31
32 ; Load Z with correct EEPROM address to read from data space.
33 movw ZL, addr_lo
34 subi ZL, lo8(-MAPPED_EEPROM_START)
35 sbci ZH, hi8(-MAPPED_EEPROM_START)
36
37 ret
38
39 #else /* -------------------------------------------- */
40
41 1: sbic _SFR_IO_ADDR (EECR), EEWE
42 rjmp 1b
43 # ifdef EEARH
44 # if E2END > 0xFF
45 out _SFR_IO_ADDR (EEARH), addr_hi
46 # else
47 ; This is for chips like ATmega48: the EEAR8 bit must be cleaned.
48 out _SFR_IO_ADDR (EEARH), __zero_reg__
49 # endif
50 # endif
51 out _SFR_IO_ADDR (EEARL), addr_lo
52 sbi _SFR_IO_ADDR (EECR), EERE
53 clr ret_hi
54 in ret_lo, _SFR_IO_ADDR (EEDR)
55 ret
56
57 #endif /* -------------------------------------------- */
58
59 ENDFUNC
G
Gast
Gast
24.11.2009 11:19
#1494119
http://www.nongnu.org/avr-libc/user-manual/group__avr__eeprom.html
Nicht viel Info:
Beitrag "Geschwindigkeit von EEPROM Operationen"
Vllt. hat ja jemand Lust mal die Takte zu zählen, die
eeprom_read_byte(const uint8_t *__p) braucht? :-)
G
Gast
Gast
24.11.2009 11:26
#1494127
Ach ja, das ist ja schon alles ASM. Ich habe keinen XMEGA aber 4k
EEPROM, also EEARH. Damit sieht es wohl so aus:
1 #define ret_lo r24
2 #define ret_hi r25
3
4 ENTRY eeprom_read_byte
5 1: sbic _SFR_IO_ADDR (EECR), EEWE
6 rjmp 1b
7
8 # if E2END > 0xFF
9 out _SFR_IO_ADDR (EEARH), addr_hi
10 # else
11 ; This is for chips like ATmega48: the EEAR8 bit must be cleaned.
12 out _SFR_IO_ADDR (EEARH), __zero_reg__
13 # endif
14
15 out _SFR_IO_ADDR (EEARL), addr_lo
16 sbi _SFR_IO_ADDR (EECR), EERE
17 clr ret_hi
18 in ret_lo, _SFR_IO_ADDR (EEDR)
19 ret
20
21 ENDFUNC
also vermutlich:
sbic
rjmp
out
out
sbi
clr
in
ret
Was macht das?
G
Gast
Gast
24.11.2009 11:33
#1494138
sbic 1..3
rjmp 2
out 1
out 1
sbi 2
clr 1
in 1
ret 4
--------
13..15 (+ 4 pause?)
Also bei 16 MHz 0,875 µs
↑ Nach oben
← Zurück zu Mikrocontroller und Digitale Elektronik
Antwort schreiben