Witam,
próbuję napisać w SDCC oprogramowanie sterujące MP3 playerem na AT89C51SND1C i okazuje się, że generowany przez SDCC kod startowy jest:
- błędny;
- 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