avr-libc-dev
[Top][All Lists]
Advanced

[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"
    );
  }
}





reply via email to

[Prev in Thread] Current Thread [Next in Thread]