AVR: avr-libc, eeprom Zugriffsgeschwindigkeit

#1494111
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
Gast #1494127
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren