8051: Odczyt/zapis segmentów flasha i xdata

Jul 30, 2004 8 Replies

Piszę właśnie mały programik w C na 8051 i potrzebuję wysłać przez port szeregowy 64-bajtowy kawałek pamięci flash i kawałek ramu xdata... Jedyny sposób jaki wymyśliłem to zadeklarować dwie tablice:



xdata unsigned char xdata_start[0x200] _at_ 0; code unsigned char flash_start[0x200] _at_ 0;



Czy ktoś zna jakiś lepszy sposób na dostęp do pamięci niż powyżej? Ten mój sposób generuje ostrzeżenia linkera o nakładających się obszarach pamięci...



Jakieś lepsze pomysły?


A probowales:

xdata unsigned char *xdata_start=0; code unsigned char *flash_data=0;

Odwolujesz sie jak do normalnej tablicy

j.

Hm... nie próbowałem szczerze mówiąc, bo mi się to kojarzy z deklaracją wskaźnika umieszczonego w xdata lub code a nie wskaźnika do unsigned char umieszonego w xdata czy code. Ale spróbuję... :-)

Dzieki.

NIe sadze zeby kompilator potraktowal powyzsze deklaracje w ten sposob. Mozna przyjac ze sa roznowazne deklaracji tablicy o dlugosci 0 elementow (wiec kompilator nie rezerwuje na nie pamieci). Zeby zadeklarowac zmienna w segmencie code musial bys pewnie pokombinowac z const i zmienna globalna. A zeby w xdata.. One i tak pewnie tam siedza. Na stosie (o ile deklarujesz w obrebie funkcji. Acha, przy takim zapisie kompilator moze protestowac ze nie zgadzaja mu sie typy. Raczej nie powinno to przeszkadzac, ale na wszelki przypadek mozesz przekastowac 0 na unsigned char.

pzdr. j.

PS: to jest iar ?

W keilu można zadeklarowac wskaźnik do obszaru XDATA ale przechowywany w obszarze DATA.

char xdata *data numtab; /* ptr in data to xdata char */

ale deklaracja tablicy o okreslonym adresie tez jest prawidlowa a linker daje jedynie ostrzezenie dla twojej wiadomosci, ze nakladaja sie dwa segmenty.

Pzdr megaraptor

Zgodze sie z kolega i zalecam obejrzenie co z tego zrobil kompilator :-)

J.

Nie jestem pewny jak je potraktował bo nie wysiliłem się na sprawdzenie, ale z całą pewnościa kod nie działał tak jak w przypadków tablic umieszczonych pod adresem zero.

??? Kompilator rezerwuje pamięć zarówno na sam pointer (gdzieś przecież trzeba trzymać adres do zmiennej na którą wskazuje) jak i rezerwuje w przypadku gdy deklarujesz jednoznakową tablicę - w tym drugim przypadku zajętość pamięci jest 1 bajt.

Chwileczkę... Kompiluję program w modelu pamięci "small", czyli domyślnie wszystkie zmienne siedzą w idata, jeśli nie zadeklaruję inaczej... Tak to chyba wyczytałem dla 8051.

Straszne kombinacje... Ja szukam rozwiązania jakoś bardziej eleganckiego.

Co to jest iar? Mój procek to produkt firmy Silicon Laboratories, oznaczenie C8051F330 (25MIPS@25MHz, 8k FLASH, 10-bit ADC) natomiast kompilator, asembler i linker pochodzą z pakietu Keil...

To działa! Dzięki... Brakło mi chyba tego przestawienia xdata...

Dawałem "xdata unsigned char * xdata_start = 0" i nie działało. Najprawdopodobniej kompilator rozumiał to jako wskaźnik w xdata wskazujący na unsigned char w domyślnym idata (memory model "small").

Tak, niby "prawidłowa" ale nie jest to eleganckie rozwiązanie...

Po pierwsze - nie mam tam żadnych buforów i tablic, właściwie potrzebowałem wskaźnik, więc danie tam tablicy to hack. Rozmiar podałem 0x200 bo jak podałem 64 to się mi indeks tablicy coś kiepścił i zawijał na wartości 255 - pewnie kompilator uznał że skoro tablica jest mała, to do jej indeksowania użyje zmiennej jednobajtowej, a ja potrzebowałem przeczesać całe 8k flasha.

Po drugie - "Good programmers build code with no warnings!" ;-)

Dziękuję za pomoc, problem wydaje się być rozwiązany metodą kolegi Megaraptora :-) Jeszcze to potestuję ale wygląda już ok.

Jak się okazuje, prawidłowa składnia tego czego szukałem to:

unsigned char xdata * xdata_start = 0; unsigned char code * code_start = 0;

I to mi działa jak na razie dokładnie tak samo jak gdy dałem:

xdata unsigned char xdata_start[0x200] _at_ 0; code unsigned char flash_start[0x200] _at_ 0;

Dzięki wszystkim za pomoc - problem solved, odczyt działa :-)) Zabieram się za kasowanie i zapis flasha - teraz będzie zabawa ;-)

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required