8051: Odczyt/zapis segmentów flasha i xdata

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?

Reply to
Pszemol
Loading thread data ...

A probowales:

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

Odwolujesz sie jak do normalnej tablicy

j.

Reply to
Jacek R. Radzikowski

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.

Reply to
Pszemol

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 ?

Reply to
Jacek R. Radzikowski

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

Reply to
megaraptor

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

J.

Reply to
J.F.

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...

Reply to
Pszemol

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.

Reply to
Pszemol

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 ;-)

Reply to
Pszemol

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.