[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[avr-libc-dev] eeprom_write_ functions optimisation
From: |
urriz |
Subject: |
[avr-libc-dev] eeprom_write_ functions optimisation |
Date: |
Wed, 25 Jun 2008 20:28:32 +0300 |
User-agent: |
Thunderbird 1.5.0.10 (Windows/20070221) |
suggested changes to eeprom_write_byte (in file eeprom.h) :
/** \ingroup avr_eeprom
Write a byte \a __value to EEPROM address \a __p.
*/
static __inline__ void eeprom_write_byte (uint8_t *__p, uint8_t __value)
{
do {} while (!eeprom_is_ready ());
#if E2END <= 0xFF
EEARL = (unsigned)__p;
#else
EEAR = (unsigned)__p;
#endif
/* read data and compare to __value */
EECR |= (1 << EERE);
if (EEDR != __value) {
#if defined(EEPM0) && defined(EEPM1)
/* Set programming mode */
if (__value == 0xff) EECR = (1 << EEPM0); /* erase */
else EECR = 0; /* erase and write. */
#elif defined(EEPM0) || defined(EEPM1)
# warning "Unknown EECR register, eeprom_write_byte() has become outdated."
#endif
EEDR = __value;
__asm__ __volatile__ (
"/* START EEPROM WRITE CRITICAL SECTION */\n\t"
"in r0, %[__sreg] \n\t"
"cli \n\t"
"sbi %[__eecr], %[__eemwe] \n\t"
"sbi %[__eecr], %[__eewe] \n\t"
"out %[__sreg], r0 \n\t"
"/* END EEPROM WRITE CRITICAL SECTION */"
:
: [__eecr] "i" (_SFR_IO_ADDR(EECR)),
[__sreg] "i" (_SFR_IO_ADDR(SREG)),
[__eemwe] "i" (EEMWE),
[__eewe] "i" (EEWE)
: "r0"
);
}
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [avr-libc-dev] eeprom_write_ functions optimisation,
urriz <=