AVR C Runtime Library - Bugs: bug #38192, eeprom_update_byte does not use...
You are not allowed to post comments on this tracker with your current authentication level.
bug #38192: eeprom_update_byte does not use bitwise AND
Submitter: | None | ||
Submitted: | Tue 29 Jan 2013 11:23:56 AM UTC | ||
Category: | Library | Severity: | 3 - Normal |
Priority: | 5 - Normal | Item Group: | libc code |
Status: | None | Assigned to: | None |
Percent Complete: | 0% | Originator Email: | -email is unavailable- |
Open/Closed: | Open | Release: | Any |
Fixed Release: | None |
No files currently attached
Depends on the following items: None found
Items that depend on this one: None found
Carbon-Copy List
No changes have been made to this item
Powered by Savane 3.13-d3ae.
Corresponding source code
As described in AVR103, there is no need of erase cycle if new value match bitwise AND between the old value and the new value.
Patch below uses this functionality, eeprom endurance is higher and update time is reduced too.
% diff -u eeupd_byte.S.orig eeupd_byte.S
--- eeupd_byte.S.orig 2013-01-29 10:54:43.000000000 +0100
+++ eeupd_byte.S 2013-01-29 12:02:25.000000000 +0100
@@ -88,8 +88,14 @@
breq 2f
# if defined (EEPM0) && defined (EEPM1)
- ; Set programming mode: erase and write.
+ ; Set programming mode: write only
out SFR_IO_ADDR (EECR), __zero_reg_
+ sbi _SFR_IO_ADDR (EECR),EEPM1
+ ;test bitwise AND
+ and _tmp_reg_, r18
+ cpse _tmp_reg_, r18
+ ; final value different, set programing mode: erase and write
+ cbi _SFR_IO_ADDR (EECR),EEPM1
# elif defined (EEPM0) || defined (EEPM1)
# error /* Unknown EECR register. */
# endif