nowyARM napisał: AVR-GCC ma taka właściwość, że umieszcza stałe zaraz za obszarem wektorów przerwań.
To nie jest żadna właściwość avr-gcc, lecz kwestia użytego skryptu linkera. Poza tym w zależności co się używa (progmem czy __flash), takie stałe mogą być na początku lub na końcu programu.
nowyARM napisał: Kolejna właściwość, to ta, ze stała zadeklarowana jako pierwsza znajdzie się zaraz za wektorami przerwań. Na tym nie można juz tak na 100% polegać, bo może jakaś biblioteka używa stałych i nie ma gwarancji, że jakiś include nie spowoduje, że nasz stała zostanie umieszczona gdzieś dalej.
Na tym zupełnienie można polegać. Nie chodzi o jakieś biblioteki, tylko o prostą właściwość linkera - umieszcza stałe po kolei (przynajmniej w obecnej wersji, ale to nie jest objęte standardem i ktoś dla fantazji może to zmienić), w zależności od kolejności linkowania plików. A ta kolejność może się zmieniać, więc i sposób rozmieszczenia stałych się zmieni.
nowyARM napisał: Umieść CRC w EEPROM. Nad adresami w EEPROM łatwo zapanować używając struktury. EEPROM wgrywasz razem z FLASH używając plików ELF.
Po co? Kol.
@INTEII używa poprawnego rozwiązania - srec_cat i liczenia CRC przez program wywoływany z makefile. To rozwiązanie umożliwia pełną automatyzację. Użycie EEPROM to zbędna komplikacja, poza tym sens CRC jest taki, aby był on związany z plikiem z ktrórego jest liczony. Dzięki temu po wgraniu hexa mamy od razu wgrane powiązane z nim CRC, co jest rozwiązaniem idiotoodpornym. Mieszanie do tego EEPROM wymaga zaangażowania dwóch różnych plików, zwiększa też ryzyko, że zmienimy FLASH, bez odpowiedniej zmiany EEPROM i przede wszystkim utrudnia życie jeśli w EEPROM trzymane są inne dane (na etapie programowania, EEPROM byłby kasowany aby wprowadzić nowe CRC).
Jedyne co można rozważyć, to w pewnych okolicznościach umieszczenie CRC na końcu pamięci FLASH MCU. Dzięki temu nie trzeba definiować dodatkowych sekcji, wystarczy wskaźnik w programie, a w hexie po prostu automatycznie dodany CRC na koniec FLASH.
Dodano po 2 [minuty]: nowyARM napisał: Zadeklaruj jakiś ciąg znaków a za nim CRC, np "#CRC=$". Używałem takiego rozwiązania do odszukiwania nazwy, wersji programu i właśnie CRC. Program szukał ciągu znaków w obszarze od wektorów przerwań do np 0x1000.
W przypadku CRC powstaje problem jak je tam umieścić i pominąć przy obliczaniu CRC? Zrobiłem proste CRC ADD na koniec negacja. Program sprawdzając CRC odejmował CRC odczytane z FLASH.
Używasz niewłaściwych narzędzi, a potem dzielnie rozwiązujesz normalnie nieistniejące problemy...
Dodano po 52 [sekundy]: nowyARM napisał: Co do wpisania CRC do FLASH, to nie wiedzę innej opcji jak wczytanie do edytora hex (np Hexplorer), zmodyfikowanie i zapisanie.
Proponuję lepiej poznać dostępne narzędzia. Do manipulacji na hexach (i nie tylko) w toolchainie są odpowiednie narzędzia - srecord.