Po dołączeniu następującego kodu do źródła AVR C najwyraźniej możesz bezpośrednio zaprogramować bezpieczniki, bez potrzeby stosowania dodatkowej komendy lub pliku .hex:
#include <avr/io.h>
FUSES = {
.low = LFUSE_DEFAULT ,
.high = HFUSE_DEFAULT ,
.extended = EFUSE_DEFAULT ,
};
Czy istnieje podobna sztuczka do programowania wartości w EEPROM?
Sprawdziłem, /usr/lib/avr/include/avr/fuse.h
gdzie mogę znaleźć komentarze na temat makra, ale nie mogę znaleźć podobnego komentarza, /usr/lib/avr/include/avr/eeprom.h
a interpretacja rzeczy związanych z preprocesorem jest trochę poza moją ligą.
Byłoby naprawdę przydatne, gdybym mógł dołączyć domyślne wartości EEPROM do kodu źródłowego C. Czy ktoś wie, jak to osiągnąć?
edycja1:
Ta sztuczka FUSES jest wykonywana tylko w czasie ISP, a nie w czasie RUN. Dlatego w wynikowym kodzie zestawu w sterowniku nie programuje się żadnych bezpieczników. Zamiast tego programator automatycznie przechodzi przez dodatkowy cykl programowania BEZPIECZNIKÓW.
edycja2:
Używam avr-gcc i avrdude toolchain w systemie Linux.
Odpowiedzi:
Z avr-gcc
EEMEM
makro można wykorzystać do definicji zmiennej, zobaczlibc
dokumentację i przykład tutaj :deklaruje tablicę znaków do umieszczenia w sekcji o nazwie „.eeprom”, która po kompilacji informuje programistę, że dane te należy zaprogramować w pamięci EEPROM. W zależności od oprogramowania programisty może być konieczne jawne nadanie programistowi nazwy pliku „.eep” utworzonego podczas procesu kompilacji lub może on sam w sposób niejawny go znaleźć.
źródło
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 ihex $(src).elf $(src).eeprom.hex
avrdude -p$(avrType) -c$(programmerType) -P$(programmerDev) -b$(baud) -v -U eeprom:w:$(src).eeprom.hex
Tak, możesz ręcznie zapisać domyślne dane do EEPROM w kodzie źródłowym. Najpierw zapoznaj się z tym niesamowitym przewodnikiem po pamięci EEPROM z AVR: samouczek AVR EEPROM Deana. Powinienem również dodać, że lepszym pomysłem jest utworzenie pliku .eep zawierającego dane EEPROM przy użyciu makefile, który zostanie zaprogramowany na urządzeniu wraz z kodem źródłowym. Jeśli jednak nie znasz różnych operacji na plikach makefile i linkerach, nadal możesz to zrobić z poziomu pliku kodu źródłowego - stanie się to tak szybko, jak tylko obwód zostanie włączony, blokując początkowe działanie programu.
Na początku programu (przed jakąkolwiek pętlą główną) możesz zrobić coś takiego:
Funkcja „update” najpierw sprawdza, czy ta wartość już tam jest, aby zaoszczędzić na niepotrzebnych zapisach, zachowując żywotność pamięci EEPROM. Jednak zrobienie tego dla bardzo wielu lokalizacji może zająć sporo czasu. Lepiej sprawdzić jedną lokalizację. Jeśli jest to pożądana wartość, resztę aktualizacji można całkowicie pominąć. Na przykład:
Jeśli chcesz zaktualizować duże ilości danych, spróbuj użyć innych funkcji, takich jak
eeprom_update_block(...)
. I zdecydowanie przeczytaj ten samouczek; jest dobrze napisane.Można umieścić wszystkie instrukcje aktualizacji pamięci EEPROM w pojedynczej instrukcji warunkowej preprocesora. Jest to bardzo proste do zrobienia:
Ten fragment kodu nie zostanie nawet skompilowany, chyba że wykonasz następujące czynności:
Możesz zostawić to jako komentarz, a następnie odkomentować, jeśli chcesz zmienić domyślne wartości EEPROM. Aby uzyskać więcej informacji na temat preprocesora C, zapoznaj się z tym podręcznikiem online . Myślę, że najbardziej interesują cię sekcje dotyczące makr i instrukcji warunkowych.
źródło
Ch. 7 Setting Initial Values
.EEMEM
zmiennych kompilator dba o to, która zmienna znajduje się w EEPROM. W ten sposób operujesz tylko na (stałych, generowanych przez kompilator) wskaźnikach zmiennych podczas uzyskiwania dostępu do danych. Z drugiej strony, jeśli wyraźnie określisz adres, pod którym znajduje się każda zmienna, będziesz musiał sam zająć się tymi adresami, w tym upewnić się, że żadne zmienne przypadkowo nie zajmują tego samego adresu, zastępując się nawzajem; lub ponowne obliczenie wszystkich adresów na wypadek zmiany wielkości pamięci zmiennej w przyszłości itp.