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