c: hi-tech 9,80, interrupt asm
Miroslav Draxal
evik na volny.cz
Pondělí Březen 31 12:30:49 CEST 2014
No a jak řešíte, aby vám překladač neoptimalizoval tu vaší funkci? Udělejme
nejjednodušší možnou funkci ve tvaru:
static void vectors (void) @ 4 {
#asm
goto 0x804 & 0x7FF
#endasm
}
potom, pokud jí někde v kódu nevoláte, tak ji překladač zoptimalizuje a
nepřeloží ji.
XC8 to skutečně schroupe správně 9.80 nikoli.
Tohle Vám skutečně chodilo pod 9.83?
Jak to dělat správně s bootloaderem po XC8 je tady
http://www.microchip.com/stellent/groups/SiteComm_sg/documents/DeviceDoc/en5
58478.pdf
From: Hw-list [mailto:hw-list-bounces na list.hw.cz] On Behalf Of Hynek Sladky
Sent: Monday, March 31, 2014 12:10 PM
To: HW-news
Subject: Re: c: hi-tech 9,80, interrupt asm
Prekladac 9.83 a ted XC8 1.12.
Projekty, ve kterych to pouzivam, mam prekladane s offsetem 0x800 - ladim to
bez bootloaderu, proto se musi z reset vektoru i interrupt vektoru skocit do
ladeneho kodu, kdyz tam bootloader pri ladeni neni. To je take nejspis
duvod, proc jsem s tim zatim nemel problem. Ale kdyz jsem hledal nejake
reseni, jak napsat aplikaci s podporou bootloaderu, tak jsem taky musel
projit mnoho slepych cest, ale prece jen je to uz docela davno.
Instrukce goto akceptuje 11-bitovou hodnotu, proto to maskovani - hlavne
kvuli tomu, abych si pri pripadne zmene vzpomnel, ze tam nejde napsat rovnou
adresa.
Napada me akorat napsat si zacatek Flash v assembleru, aplikaci posunout a
doplnit skoky z reset vektoru a low_interrupt vektoru.
Uplne nejlepsi by dle meho bylo napsat si obsluhu high_interruptu v cistem
assembleru a nechat na linkeru, aby to spravne slinkoval, ale to jsem v
tomto prekladaci jeste nedelal. Respektive nektere slozitejsi veci me
rpesvedcily, abych se do toho nepoustel a vysledkem byl vyse zminovany
postup.
Hynek Sladky
Dne 31.3.2014 10:12, Miroslav Draxal napsal(a):
Co používáte za překladač?
Nějak mi nedochází " goto 0x804 & 0x7FF"k čemu je to dobré?
to je přesně ta konstrukce, kterou bych očekával, jenže hi-tech to vyhodí
takhle.
:0 warning: segment "_vectors_text" (0-5) overlaps segment "reset_vec" (0-3)
l.obj: (1343) hexfile data at address 0x0 (0x56) overwritten with 0x80
(warning)
a po disis.. to vypadá takhle
1 0000 EF80 vectors GOTO 0x300
2 0002 F001 NOP
3 0004 0012 RETURN 0
4 0006 FFFF NOP
5 0008 FFFF NOP
6 000A FFFF NOP
7 000C FFFF NOP
8 000E FFFF NOP
9 0010 FFFF NOP
10 0012 FFFF NOP
11 0014 FFFF NOP
12 0016 FFFF NOP
13 0018 CFD8 interrupt_low MOVFF STATUS, 0x6B
14 001A F06B NOP
15 001C CFE8 MOVFF WREG, 0x6C
Prostě místo na adresu 0x08 to plácne na RESET vektor.
From: Hw-list [mailto:hw-list-bounces na list.hw.cz] On Behalf Of Hynek Sladky
Sent: Monday, March 31, 2014 7:24 AM
To: HW-news
Subject: Re: c: hi-tech 9,80, interrupt asm
Pro PIC16F182x pouzivam napr. tuto konstrukci:
static void vectors (void) @ 4 {
#asm
movlp 0x08
goto 0x804 & 0x7FF
#endasm
}
Ma to tak pouzite v aplikaci s bootloaderem pro premapovani interruptu.
Treba to pujde pouzit i pro PIC18...
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20140331/26784521/attachment.html>
Další informace o konferenci Hw-list