Dziwne zachowanie kompilatora w AVRGCC.

May 04, 2004 90 Replies

mozna zrobic tak jak zrobiono: prog_char: char __attribute__((progmem)) PGM_P : prog_char const*

Kompilator sie zorientuje ... ale jak zmusic printf i inne funkcje zeby sie po adresie orientowaly ? :-) Niby mozna tak jak kolega tu proponowal - wskazniki 3 bajtowe, pierwszy wskazuje obszar ... tylko ze wtedy zegnaj wydajnosc :-(

Co nie zabrania istnienia jednolitej adresacji. Np najstarszy bit adresu wybiera czy dana czytamy z ram czy z rom.

Tylko jak to zrobic jesli niektorzy chca 64KB ram, 256KB ROM i oszczedne 16-bitowe wskazniki.

Ech, to gdzie dostac ARMa w przyzwoitej cenie, detalicznej ilosci i obudowie nie BGA ?

J.

51 bedzie sprawiala takich klopotow jeszcze wiecej :-)

Z maluchow to chyba motorolki hc11 i hc05 mialy jednolita adresacje.

J.

...i po pierwszym przypisaniu do zwyklego wskaznika zgubi te informacje i znow niczego biedaczek nie bedzie wiedzial. :-)

Bez "dynamicznego typowania", czyli kodowania typu obszaru pamieci we wskazniku wyglada to na problem nierozstrzygalny podczas statycznej analizy przeplwu danych. :-)

No to jest wlasnie rodzaj takiego dynamicznego typowania.

Za pomoca bankowania. :-)

Pozdrawiam Piotr Wyderski

Najlepiej przejsc od razu na ARMa. Procesory z tym jadrem wytwarza conajmniej kilkudziesieciu roznych producentow. Znajdziesz je m.in. u Philipsa, Atmela, OKI, TI, Intela. Kompilator gcc oczywiscie jest i bardzo ladnie sobie radzi. Przewaga nad AVR'ami jest wspolna przestrzen danych/programu i praktycznie brak ograniczen w adresowaniu (32 bity). Oczywiscie jest to szybki RISC.

Zmuszać to chyba nie trzeba ponieważ w avr-libc są przecież funkcje z postfiksem _P. Problem jest w tym że w przypadku dużych AVR-ów wskaźki wskazujące na dane znajdujące się w pamięci programu powinny być 17 (a w przyszłości chyba i 18) bitowe a nie 16 bitowe.

[.....]

W naszym przypadku to zadziałałoby dla adresów >= 0x10000, ale jak rozpoznać czy adres np. 0x1000 dotyczy RAM czy ROM. :-) Właśnie po to są te wszyskie _P funkcje.

Poza tym w architekturze harwardzkiej przestrzeń adresowa z definicji jest podzielona na dwa obszary i stosowane są różne instrukcje do zapisu/odczytu danych z tych obszarów. Jest podzielona przynajmniej logicznie - fizycznie może być różnie - szyna adresowa/danych może być wspólna a tylko szyny sterujące rozdzielone (np. MCS-51) albo, ze względu na wydajność (a AFAIK właśnie o to chodziło twórcom tej architektury), wszystkie szyny zdublowane dla każdego z obszarów jak chyba jest w zdecydowanej większości DSP (np. w starym ale jarym ADSP-218x Analoga). I tak jest również w AVR, tylko że tam wszystko dotyczące pamięci programu jest ukryte wewnątrz kości - tak przynajmniej wynika z lektury dejtaszitów (nigdy nie używałem tych kości w praktyce).

BTW. Wcale nie należy się tak bardzo przyzwyczajać do schematu że pamięć programu to jest jakiś ROM. Np. we wspomnianych Analogach, ze względu na wydajność, pamięcią programu jest RAM - podczas startu kod jest ładowany do RAM z jakiegoś ROM lub przez IDMA z "procesora nadrzędnego".

[.....]

W Memec-u? Ewentualnie, prawie po sąsiedzku (w MSC), możesz kupić H8. :-)

Regards, /J.D.

Adamie, ale moze konktretniej - gdzie w UE kilka sztuk, po ile, i czemu w BGA ? :-(

J.

Pewnego dnia Jan Dubiec przemówił ludzkim głosem:

Skoro i tak wskaźnik zrobi się dłuższy niż 2 bajty to można by wykorzystać najstarszy bit z 3 bajtu do rozróżniania obszarów.

Tia... tylko w AVR bankowanie zaczyna sie od 64 KB. I dodatkowo nie dziala tak jak powinno... ;-(

To wlasnie musialoby byc zaszyte w procku - inny zakres adresow ma ROM, inny RAM. To ze oprocz tego bylyby rozdzielone i mialy osobne magistrale to osobna kwestia - ale adresacja jednolita.

IMHO - te rozne instrukcje to juz nie z definicji.

Fizycznie w mikrokontrolerach to zawsze jest podzielona - inaczej sie robi RAM a inaczej EE/E/P/ROM/Flash.

A no chyba ze tak.

J.

No ale to byłoby rozwiązanie sprzętowe. I to dosyć "głębokie". Poza tym nie jestem przekonany czy w takim przypadku rozdzielenie szyn pamięci danych i programu miałoby sens - ów "dekoder adresów" mógłby być wąskim gardłem. Trzebaby to przemyśleć.

Chodzi mi o to że mogą dzielić szynę adresową/danych. BTW. IMO to jest zaprzeczenie celu w jakim wymyślono architekturę harwardzką.

Regards, /J.D.

Piotr Wyderski wrote: ...

... No to Cię zaskoczę, bo to jest C. No może takie jakieś jeszcze młode i nieopierzone, ale C pełną gębą 8-)

formatting link
Jest duże prawdopodobieństwo, że GCC pójdzie właśnie tą drogą.

Pozdrawiam,

Ale ta metoda zmuszala by kompilator by kazde odwolanie do pamieci poprzez wskaznik kompilowal jako sekwencje rozkazow ze sprawdzeniem wskaznika i wybraniem odpowiedniej instrukcji w zaleznosci od tego warunku. Kazde odwolanie - to znacznie wydluzyloby kod.

Krzysiek Rudnik

Pewnego dnia Krzysztof Rudnik przemówił ludzkim głosem:

A teraz gdy masz dwa zestawy funkcji, osobny do każdej przestrzeni adresowej to myślisz, że kod jest krótki ? Według mnie w keilu rozwiązali to naprawdę dobrze. Jeśli z góry wiesz do jakiej pamięci się odwołujesz to jawnie deklarujesz typ pamięci przy wskaźniku. A jeśli masz funkcje, które muszą obsłużyć dowolny typ pamięci to używasz "kombinowanej" wersji wskaźnika.

A mozesz podac jakis modelik ARM-a ktory bylby dostepny (nie w Elfie) choc ulamkowo tak czesto jak '51 czy AVR-y ?? To w naszym kochanym kraju chyba najwiekszy problem ;-(

Nie bylo mowy, ze ma miec Flash w srodku. A bez tego w TQFP znalezc ARMy nie problem. Zapytaj np. w JM Elektronik - moga sprowadzic rozne atmelowe procki. Ja sie ostatnio w firmie bawie AT91R40008 i jest to calkiem zacny procek. Ze sprowadzeniem kilku szt. nie mielismy problemu.

Pewnego dnia Adam Dybkowski przemówił ludzkim głosem:

A możesz zdradzić cenę ?

Polecam np. AT91R40807 albo od razu nieco wiekszy i szybszy AT91R40008. Zapytaj sie o nie w JM Elektronik / Seguro. Albo u innego dystrybutora Atmela.

Ehem... a jest cos z flashem na grzbiecie i jakas forma ISP ? Cos typowego do nauki ??

Jakis czas temu pytalem sie o te ARMy w Seguro i dostalem cene AFAIR kilkanascie USD/szt + VAT. Po przeliczeniu wychodzilo okolo 100 zl, co jest IMHO super cena w porownaniu do ATmegi128 (za 40-50 zl) - ARM jest

4x szybszy i ma 256KB RAMu w srodku. Jedyna wada to brak Flasha, ale latwo ja naprawic dodatkowa kostka (kilkanascie zl).

BTW: ISP nie trzeba, bo kazdy ARM ma interfejs JTAG.

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required