Piotrus_999 napisał: grko napisał:
IMO nieprawda
a czy Xmegi przypadkiem nie mapuja przypadkiem eepromu do data memory ?
Tak, w tym przypadku można włączyć mapowanie EEPROM do SRAM, co ma też tą zaletę, że można programować EEPROM stronami (co bywa nawet 32x szybsze niż programowanie komórka, po komórce).
Jakub17 napisał: Wiem, że w niektórych uC występuje interfejs XMEM, który obsługuje pamięci zewnętrzne. Moje pytanie dotyczy tylko tego czy jest możliwość odwoływania się do różnych rodzajów pamięci (zewnętrznych lub wewnętrznych) poprzez podanie odpowiedniej wartości wskaźnika czy jednak trzeba użyć jakiś specjalnych instrukcji asemblerowych. Wiem że dla pamięci FLASH i RAM są odpowiednie instrukcje asemblera, ale czy tak jest też w pamięci EEPROM i rownież w przypadku różnego rodzaju pamięci zewnętrznych?
Programując w C musisz kompilatorowi w jakiś sposób przekazać na co wskazuje wskaźnik. W AVR używasz do tego PROGMEM, lub _flash lub _memx. Kompilator taki wskaźnik będzie traktował jako wskaźnik do FLASH lub do FLASH i SRAM (dla _memx) i wygeneruje odpowiednie instrukcje asemblera. W przypadku EEPROM sprawa jest bardziej skomplikowana, gdyż AVRy różnią się sposobem dostępu do tej pamięci. W efekcie póki co nikt nie zaimplementował osobnej przestrzeni adresowej dla EEPROM i trzeba korzystać z funkcji udostępnionych w nagłówku eeprom.h. Generują one odpowiednie instrukcje umożliwiające dostęp do tej pamięci - EEPROM jest dostępny przez rejestry układów IO, a nie oddzielne instrukcje asemblera. Podobnie pamięci zewnętrzne - zazwyczaj są łączone poprzez jakiś interfejs, np. SPI lub I2C, więc dostęp do nich musisz załatwić we własnym zakresie. Wyjątkiem jest pamięć podłączona przez XMEM - wtedy wystarczy tylko ew. zmienić skrypt linkera, lub odpowiednio skonfigurować Atmel Studio. Dostęp do tej pamięci z poziomu asemblera wygląda identycznie jak do SRAM.
Jakub17 napisał: Funkcja "pierwsza funkcja" jest z atrybutem naked ponieważ nie będzie już nigdzie wywoływana w main() ani nie pobiera argumentów, więc prolog i epilog jest nie potrzebny.
To nie wystarczy. ABI kompilatora czyni pewne założenia co do zawartości rejestrów. Jeśli powyższa funkcja je zmieni, co jest prawie pewne, to dalszy kod ma spore szanse się posypać. naked ma sens stosować tylko dla funkcji, które kończą program, w efekcie co dalej jest bez znaczenia, ew. dla funkcji które nie zmieniają rejestrów traktowanych jako zachowywane przez funkcję. Ew. dla funkcji napisanych w asemblerze, dla których to programista np. zadbał o przywrócenie kontekstu.