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