XC8 a data ver Flash
Andrej Jancura
aj.hwlist na gmail.com
Čtvrtek Červen 20 15:08:10 CEST 2013
Takze pokracovanie c.2
2013/6/20 Jan Smrz <jan.smrz na email.cz>
> On 06/20/2013 08:53 AM, Andrej Jancura wrote:
>
> 2013/6/19 Jan Smrz <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
>
>
>
Ten asm listing je sice pekny ale prakticky nepouzitelny. Teraz si
nepamatam ci v .lst alebo .asm je pri Vasej funkcii _mem_read taka velka
komentovana tabulka s popisom, kde sa ktory parameter uklada a ako sa
uklada. Takto mozeme urcit akurat tolko, ze Vasa adresa sa ulozi do 3
bytov, a skopiruje do banky 0, pricom si myslim, pokial je PointerDataTable
skutocne adresa tabulky, ze najvyssi bit v 4 byte je nula a teda ide
pouzivat asi ram... to by mohlo vysvetlovat tie Vase adresy 0. Ked
pouzijete pointer, tak ten najvyssi bit si kompilator osetri sam.
>
>
> Aku verziu pouzivate LITE, STD alebo PRO? Pretoze podla verzie tam je
> povolena inteligencia a optimalizacie.
>
> Verzi Lite
>
>
Tak potom niektore moje poznamky su pre Vas asi bezvyznamne.
>
> 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?
>
>
Neviem to isto, mozno tam je bootblock, nejaka hardwarova chyba cipu alebo
len pomocne asemblerovske rutiny... Neviem. Trebalo by lepsie pozriet
datasheet, errata pripadne .lst file.
A.
>
> J.S.
>
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>
>
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20130620/8ba24c45/attachment.htm>
Další informace o konferenci Hw-list