XC8 a data ver Flash
Jan Smrz
jan.smrz na email.cz
Čtvrtek Červen 20 13:26:26 CEST 2013
On 06/20/2013 08:53 AM, Andrej Jancura wrote:
> 2013/6/19 Jan Smrz <jan.smrz na email.cz <mailto:jan.smrz na email.cz>>
>
>
> Ano, pdata1 je konstanta, jen mám podezření, že ji asi ne vždy přiřadí
> správnou hodnotu. V kódu mám dvoje čtení hned za sebou
> mem_read((uint32_t)pdata1,sizeof(format_version),&format_version);
> mem_read((uint32_t)pdata1 + 2,sizeof(length),(uint8_t*)&length);
>
> První čtení je špatné (opravdu čte data z adresy 0), druhé je již správné.
> Pokud pořadí čtení prohodím (první čtu length), je opět první špatné,
> druhé správné.
>
>
> Ja by som skusil pretypovanie na uint32_t v tom mem read vynechat. Skuste si
> pozriet zdrojaky kniznicnych funkcii strcpy a podobne. Tam to maju robene ako
> to potrebujete. Ono const unsigned char pdata1 a unsigned char pdata1 je ta
> ista adresa, rozdiel je len v tom, ze to prve je iba na citanie. Mam este take
> tusenie, ze pri tom const je nastaveny najvyssi bit, aby vedela pomocna rutina
> ci citat z ram alebo flash, ale to sa da tiez zistit z kodu.
>
Pokud by byla chyba v pretypovani, tak by ale nemelo fungovat ani jedno cteni,
ne jen to prvni? V obou pripadech pouzivam stejne (uint32_t)pdata1.
Zde je listing pro dva pripady. S PIC assemblerem jsem se jeste moc neszil, tak
z prvniho pripadu moc moudry nejsem.
mem_read((uint32_t)poidata, mem_read(0x4000LU,
sizeof(format_version), sizeof(format_version),
&format_version); &format_version);
movlw low(16384) movlw low(04000h)
movwf (??_pdt_init+0+0)&0ffh movwf ((c:?_mem_read)),c
movlw high(16384) movlw high(04000h)
movwf (??_pdt_init+0+0+1)&0ffh movwf ((c:?_mem_read+1)),c
movlw low highword(16384) movlw low highword(04000h)
movwf (??_pdt_init+0+0+2)&0ffh movwf ((c:?_mem_read+2)),c
movlb 0 ; () banked movlw high highword(04000h)
movf (??_pdt_init+0+0)&0ffh,w movwf ((c:?_mem_read+3)),c
movwf ((c:?_mem_read)),c movlb 0 ; () banked
movlb 0 ; () banked movwf (??_pdt_init+0+0)&0ffh
movf (??_pdt_init+0+1)&0ffh,w
movwf 1+((c:?_mem_read)),c
movf (??_pdt_init+0+2)&0ffh,w
movwf 2+((c:?_mem_read)),c
clrf 3+((c:?_mem_read)),c
movlb 0 ; () banked
movwf (??_pdt_init+3+0)&0ffh
movlw low(01h) movlw low(01h)
movwf (0+((c:?_mem_read)+04h)),c movwf (0+((c:?_mem_read)+04h)),c
movlb 0 ; () banked movlb 0 ; () banked
movf (??_pdt_init+3+0)&0ffh,w movf (??_pdt_init+0+0)&0ffh,w
movlb 0 ; () banked movlb 0 ; () banked
movlw high(pdt_init na format_version) movlw
high(pdt_init na format_version)
movwf (1+((c:?_mem_read)+05h)),c movwf (1+((c:?_mem_read)+05h)),c
movlb 0 ; () banked movlb 0 ; () banked
movlw low(pdt_init na format_version) movlw
low(pdt_init na format_version)
movwf (0+((c:?_mem_read)+05h)),c movwf (0+((c:?_mem_read)+05h)),c
call _mem_read ;wreg free call _mem_read ;wreg free
>
> Aku verziu pouzivate LITE, STD alebo PRO? Pretoze podla verzie tam je povolena
> inteligencia a optimalizacie.
>
Verzi Lite
btw. Vite nekdo odpoved na muj druhy dotaz, t.j. proc je v v defaultnim
nastaveni linkeru oblast pro ulozeni promennych definovana takto:
-AMEDIUMCONST=0D00h-0FFFFh,010D00h-017FFFh? Je nejaky duvod pro to, aby oblast
nebyla v jednom kuse, t.j. 0D00h-017FFFh?
J.S.
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20130620/dedc8c7e/attachment.htm>
Další informace o konferenci Hw-list