zbynex napisał(a):
Jak to teraz prawidłowo zmodyfikować aby było poprawnie bez warningów "Pointer types do not math".
Nie byłoby problemu, gdybyś korzystał ze
standardowych funkcji zapisu/odczytu do EEPROM:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Te funkcje akceptują właśnie wskaźniki typu void.
Poza tym zamiast używać liczbowych wskaźników proponowałbym deklarować dane w EEPROM za pomocą makra EEMEM:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
PS.
A gdybyś koniecznie chciał napisać własną funkcję, to wystarczy wewnątrz funkcji rzutować wskaźnik na dowolny wskaźnik do typu ośmiobitowego, np.:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Kolejność danych czy też ich rozmieszczenie nie są problemem, bo będą takie same jak w RAM, więc odwołanie
&Bufor1_ee.B będzie wskazywało na ten sam element struktury co odwołanie
&Bufor1_ram.B Tak samo działają funkcje standardowych bibliotek Atmela
eeprom_read_block() i
eeprom_read_block() służące właśnie do zapisu struktur i tablic - kopiują dane z RAM do EEPROM bajt bo bajcie w tej samej kolejności. Tak samo działa też np. funkcja standardowa
memcpy() do kopiowania bloków danych z RAM do RAM (która również operuje na wskaźnikach void*). Nie trzeba pisać osobnych funkcji dla każdego typu zmiennej. Mankamentem jest tylko to, że nie ma pełnej kontroli nad typami danych i trzeba uważać, by podać właściwy rozmiar danych do skopiowania.
EDIT (11.08.2016 10:15):
Dodam jeszcze jedną ważną uwagę. Zwykle w mikrokontrolerach o niewielkich zasobach struktury są pakowane (np. avr-gcc ma opcję
'-fpack-struct'), jednak jak słusznie zauważył kolega
Sparrow-hawk ogólnie (w przypadku niepakowanych struktur) może się zdarzyć, że struktura będzie zawierać tzw. "padding bytes" (nie będę się tutaj wdawał w szczegóły). W takim przypadku struktura będzie miała rozmiar inny, niż by to wynikało ze zsumowania rozmiarów wszystkich jej elementów. Dlatego istotne jest, aby rozmiar struktury wyznaczać za pomocą operatora rozmiaru
sizeof, a nie na podstawie własnych obliczeń.