Startup w SDCC
Masz problem? Zapytaj na forum elektroda.pl
From: "Piotr Wyderski" <wyderskiREMOVE_at_nospam_ii.uni.wroc.pl>
Subject: Startup w SDCC
Date: Sat, 11 Jun 2005 20:52:29 +0200
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
From: "Piotr Wyderski" <wyderskiREMOVE_at_nospam_ii.uni.wroc.pl>
Subject: Re: Startup w SDCC
Date: Sat, 11 Jun 2005 21:11:24 +0200
Piotr Wyderski wrote:
[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