Startup w SDCC

Jun 11, 2005 1 Replies

Witam,



próbuję napisać w SDCC oprogramowanie sterujące MP3 playerem na AT89C51SND1C i okazuje się, że generowany przez SDCC kod startowy jest:


  1. błędny;
  2. przerośnięty.

Ad 1. Programem testowym był migacz diodowy. Jeśli używam jego wersji napisanej w asemblerze, to wszystko działa poprawnie. Jeśli jednak napiszę go w C (albo nawet jako wstawkę asemblerową w main(), wziętą żywcem z poprzedniego migacza), to program się zawiesza i dioda nie miga. Doszedłem do tego, że problem tkwi po stronie kompilatora -- jeśli przeedytuję ręcznie plik pośredni main.asm, po prostu przeskakując cały startup "fabryczny", to program w C zaczyna działać zgodnie z przewidywaniami.



Ad 2. Kompilator generuje jakieś niewyobrażalne bzdury, m.in. alokuje sobie miejsce na adresy rejestrów SFR:



_A:: .ds 1 _ACC:: .ds 1 _B:: .ds 1 _PSW:: .ds 1 _SP:: .ds 1 _DPL:: .ds 1 _DPH:: .ds 1 _PCON:: .ds 1 _AUXR:: .ds 1 _AUXR1:: .ds 1 _NVERS:: .ds 1 _CKCON:: .ds 1 [...]



a następnie wpisuje do nich ich własne adresy:



.area GSINIT (CODE) ;pll.c:23: } ; genAssign mov _A,#0xE0 ;pll.c:24: } ; genAssign mov _ACC,#0xE0 ;pll.c:25: } ; genAssign mov _B,#0xF0 ;pll.c:26: } ; genAssign mov _PSW,#0xD0 ;pll.c:27: } ; genAssign mov _SP,#0x81 ;pll.c:28: } ; genAssign mov _DPL,#0x82 ;pll.c:29: } ; genAssign mov _DPH,#0x83 [...]



Ponieważ SDCC używam sporadycznie, to mam pytanie: jak pozbyć się powyższego dziwnego zachowania kompilatora oraz w jaki sposób powinien być napisany własny startup



-- nawet jeśli napiszę go tak:



.module startup .globl _main



.area CSEG (CODE)



startup:



; Tak, wiem, że nie ma stosu itp.



ljmp _main



to przy linkowaniu dostaję warning, że tylko jeden bajt pamięci danych jest dostępny jako pamięć stosu, mimo dość oczywistego faktu, że powyższy kod nie używa ani jednego bitu jakiegokolwiek RAMu. :-)))



Pozdrawiam Piotr Wyderski


[ciach] wszystko się wyjaśniło -- jakiś geniusz w Atmelu błędnie napisał makra w pliku nagłówkowym dostępnym oficjalnie na ich stronie i zamiast definicji rejestrów SFR były generowane zmienne statyczne i ogromny kod ich inicjalizacji. Po poprawieniu wszystko wygląda tak, jak tego oczekiwałem. :-) Wysyłam bug report do Atmela.

Pozdrawiam Piotr Wyderski

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required