Forum: Mikrocontroller und Digitale Elektronik AVR: avr-libc, eeprom Zugriffsgeschwindigkeit


von Gast (Gast)


Lesenswert?

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?

von Timmo H. (masterfx)


Lesenswert?

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

von Gast (Gast)


Lesenswert?

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? :-)

von Gast (Gast)


Lesenswert?

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?

von Gast (Gast)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.