Witam Kolegów,
W swoim projekcie opartym na ATmega644 stosuję wear leveling i zapis struktury 42 bajtów danych do pamięci EEPROM korzystając z wbudowanych funkcji eeprom_write_block i eeprom_update_block. Według dokumentacji zapis bajtu/strony (8 bajtów) danych do pamięci EEPROM zajmuje minimum 3.3ms (Table 6-2.). Zmierzyłem (z użyciem Timera1) czasy zapisu i otrzymałem następujące wartości:
1. użycie eeprom_write_block i zapis 42 bajtów danych (całej struktury): 16.4 ms,
2. użycie eeprom_update_block i zapis 42 bajtów danych (całej struktury), przy czym nie został zmieniony jakikolwiek bajt tejże struktury: 2 ms,
3. użycie eeprom_update_block i zapis 42 bajtów danych (całej struktury), przy czym zmieniono wartość pierwszych 20 bajtów danych tejże struktury: 4.2 ms.
Skąd takie, krótsze czasy zapisu? Rozumiem, że 42 bajty danych to w sumie 6 stron pamięci EEPROM (5*8 + 2), w związku z czym wartości dla poszczególnych przypadków powinny wynosić:
1. 6 stron *3.3 ms = 19.8 ms,
2. brak zmiany - czas potrzebny wyłącznie na odczyt i porównanie,
3. 3 strony (2*8 + 4) *3.3 ms = 9.9 ms.
Popełniam jakiś błąd myślowy? Rozumiem, że wystąpienie w tym czasie przerwań (i ich obsługa) może wydłużyć jeszcze te czasy lub nawet uniemożliwić poprawny zapis do EEPROM'a zgodnie z zapisem w dokumentacji (str.22, EEPE: EEPROM Programming Enable):
Z góry dziękuję za podpowiedzi... robiw
W swoim projekcie opartym na ATmega644 stosuję wear leveling i zapis struktury 42 bajtów danych do pamięci EEPROM korzystając z wbudowanych funkcji eeprom_write_block i eeprom_update_block. Według dokumentacji zapis bajtu/strony (8 bajtów) danych do pamięci EEPROM zajmuje minimum 3.3ms (Table 6-2.). Zmierzyłem (z użyciem Timera1) czasy zapisu i otrzymałem następujące wartości:
1. użycie eeprom_write_block i zapis 42 bajtów danych (całej struktury): 16.4 ms,
2. użycie eeprom_update_block i zapis 42 bajtów danych (całej struktury), przy czym nie został zmieniony jakikolwiek bajt tejże struktury: 2 ms,
3. użycie eeprom_update_block i zapis 42 bajtów danych (całej struktury), przy czym zmieniono wartość pierwszych 20 bajtów danych tejże struktury: 4.2 ms.
Skąd takie, krótsze czasy zapisu? Rozumiem, że 42 bajty danych to w sumie 6 stron pamięci EEPROM (5*8 + 2), w związku z czym wartości dla poszczególnych przypadków powinny wynosić:
1. 6 stron *3.3 ms = 19.8 ms,
2. brak zmiany - czas potrzebny wyłącznie na odczyt i porównanie,
3. 3 strony (2*8 + 4) *3.3 ms = 9.9 ms.
Popełniam jakiś błąd myślowy? Rozumiem, że wystąpienie w tym czasie przerwań (i ich obsługa) może wydłużyć jeszcze te czasy lub nawet uniemożliwić poprawny zapis do EEPROM'a zgodnie z zapisem w dokumentacji (str.22, EEPE: EEPROM Programming Enable):
Quote:Caution: An interrupt between step 5 and step 6 will make the write cycle fail, since the EEPROM Master Write Enable will time-out. If an interrupt routine accessing the EEPROM is interrupting another EEPROM access, the EEAR or EEDR Register will be modified, causing the interrupted EEPROM access to fail. It is recommended to have the Global Interrupt Flag cleared during all the steps to avoid these problems.
Z góry dziękuję za podpowiedzi... robiw