ginar --> możesz zrobić jak chcesz (jeśli chodzi o pominięcie iluś tam początkowych bajtów), w tym przypadku także spokojnie, tak jak pisałem wyżej i to zadziała pod warunkiem, że na wszelki wypadek po kompilacji sprawdzisz sobie w pliku *.map w jakim porządku umieścił ci linker te struktury. I wcale nie trzeba się obawiać tego że ci "COŚ" tam namiesza bo jak się robi coś z głową to nic ci się nie stanie.
Generalnie to co opisałem to wynik działania oczywiście ostatniej wersji AVRGCC z 2010r i jasna sprawa, że inne (poprzednie wersje (linkery)) mogą się nieco inaczej zachować - teoretycznie. Jednak z czystej praktyki i sprawdzania pliku *.map mogę powiedzieć, że w 99,9999% przypadków zobaczysz w pliku MAP i fizycznym EEPROM'ie poukładane te 2 struktury w takiej kolejności dokładnie jak je umieściłeś w kodzie - jesli znajdują się tylko ich definicje w pliku *.c. Jeżeli zaś użyjesz w jakimś pliku nagłówkowym *.h samych deklaracji tych struktur ze słówkiem extern na początku to wg moich obserwacji zdecyduje kolejność własnie umieszczenia w tym pliku nagłówkowym a nie w pliku *.c. Jak pisałem możesz sobie zrobic proste próbu kompilacji:
Code: #include <avr/io.h>
#include <avr/eeprom.h>
#define EEMEM __attribute__((section(".eeprom")))
typedef struct {
uint32_t dummy1;
uint32_t dummy2;
uint32_t dummy3;
} TDUMMY;
typedef struct {
char nazwa[20];
uint16_t db_rec_nr;
uint8_t adres;
uint8_t tryb_pracy;
int tmp_off;
int tmp_dzien;
int tmp_noc;
int tmp_now;
uint16_t time_dzien;
uint16_t time_noc;
uint8_t ds_adr[8];
uint8_t ds_present;
} TSEKCJA;
typedef struct {
TSEKCJA idx[4];
} TMEM;
// tutaj kolejność będzie odwzorowana w EEPROM (jeśli nie ma nagłówka z deklaracjami)
TDUMMY eem_dummy EEMEM;
TMEM eem_sekcja EEMEM;
int main(void) {
while(1);
}
w pliku *.map będzie to wyglądało tak:
Quote: .eeprom 0x00810000 0xc0
*(.eeprom*)
.eeprom 0x00810000 0xc0 ./main.o
0x0081000c eem_sekcja
0x00810000 eem_dummy
0x008100c0 __eeprom_end = .
albo tak, jak niżej jeśli w źródłowym wyżej pliku zamienisz kolejność definicji:
Quote: .eeprom 0x00810000 0xc0
*(.eeprom*)
.eeprom 0x00810000 0xc0 ./main.o
0x00810000 eem_sekcja
0x008100b4 eem_dummy
0x008100c0 __eeprom_end = .
widać jak na dłoni, że zmienia się kolejność w EEPROM zgodnie z tym co pisałem.
Poza tym ja tam nigdy nie spotykam się ze zjawiskami nadprzyrodzonymi, że mi kompilator "SAM COŚ TAM ZROBI" , że SAM MI WSTAWI JAKIŚ NAGŁÓWEK, który z kolei "namiesza" w zmiennych EEPROM. Co to za pisanie programu, że używałbyś jakichś tam nagłówków, które nie wiesz co robią.
Nie zmienia to faktu, że jest jeszcze inny sposób na to i pewniejszy niż opisany powyżej biorąc pod uwagę, że może skompilujesz to różnie datowanymi kompilatorami. Ale też sposób bez konieczności deklarowania początku sekcji .eeprom w pliku makefile. Polega on na tym, że to w swojej własnej strukturze z parametrami tworzysz jako pierwszy - taki pusty parametr np tablicę
dummy[50] i już masz przesunięcie o 50 bajtów od początku pamięci EEPROM jeśli tylko tą jedną wielką strukturę trzymasz a w niej wszystkie zmienne. Zresztą ten sposób jest zdecydowanie
NAJLEPSZY !!!
A trzeci to oczywiście podanie jawnie początku sekcji .eeprom, chociaż nie trzeba tego robić w makefile jeśli działasz pod AVrStudio lub Eclipse ale należy tylko wejść w opcje linkera i dodać po prostu konkretnie taki parametr jak poniżej jeśli chcesz uzyskać np przesunięcie od początku o np 5 bajtów:
Code: -Wl,--section-start=.eeprom=0x810005
wtedy w pliku *.map zobaczysz:
Quote: .eeprom 0x00810005 0xc0
*(.eeprom*)
.eeprom 0x00810005 0xc0 ./main.o
0x00810005 eem_sekcja
0x008100b9 eem_dummy
0x008100c5 __eeprom_end = .