Startup w SDCC

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

Reply to
Piotr Wyderski
Loading thread data ...
[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

Reply to
Piotr Wyderski

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.