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