Takze pokracovanie c.2<br><br><div class="gmail_quote">2013/6/20 Jan Smrz <span dir="ltr"><<a href="mailto:jan.smrz@email.cz" target="_blank">jan.smrz@email.cz</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div text="#000000" bgcolor="#FFFFFF">
<div>On 06/20/2013 08:53 AM, Andrej Jancura
wrote:<br>
</div><div class="im">
<blockquote type="cite">2013/6/19 Jan Smrz <span dir="ltr"><<a href="mailto:jan.smrz@email.cz" target="_blank">jan.smrz@email.cz</a>></span><br>
<div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
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<br>
mem_read((uint32_t)pdata1,sizeof(format_version),&format_version);<br>
mem_read((uint32_t)pdata1 + 2,sizeof(length),(uint8_t*)&length);<br>
<br>
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é.<br>
<br>
</blockquote>
<div><br>
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.<br>
<br>
</div>
</div>
</blockquote>
<br></div>
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. <br>
<br>
Zde je listing pro dva pripady. S PIC assemblerem jsem se jeste moc
neszil, tak z prvniho pripadu moc moudry nejsem.<br>
<br>
<br>
<tt> mem_read((uint32_t)poidata,
mem_read(0x4000LU,</tt><tt><br>
</tt><tt> sizeof(format_version),
sizeof(format_version),</tt><tt><br>
</tt><tt> &format_version);
&format_version);</tt><tt><br>
</tt><tt><br>
</tt><tt> movlw low(16384) movlw
low(04000h)<br>
movwf (??_pdt_init+0+0)&0ffh movwf
((c:?_mem_read)),c<br>
movlw high(16384) movlw
high(04000h)<br>
movwf (??_pdt_init+0+0+1)&0ffh movwf
((c:?_mem_read+1)),c<br>
movlw low highword(16384) movlw low
highword(04000h)<br>
movwf (??_pdt_init+0+0+2)&0ffh movwf
((c:?_mem_read+2)),c<br>
movlb 0 ; () banked movlw high
highword(04000h)<br>
movf (??_pdt_init+0+0)&0ffh,w movwf
((c:?_mem_read+3)),c<br>
movwf ((c:?_mem_read)),c movlb 0 ;
() banked<br>
movlb 0 ; () banked movwf
(??_pdt_init+0+0)&0ffh<br>
movf (??_pdt_init+0+1)&0ffh,w <br>
movwf 1+((c:?_mem_read)),c <br>
movf (??_pdt_init+0+2)&0ffh,w <br>
movwf 2+((c:?_mem_read)),c <br>
clrf 3+((c:?_mem_read)),c <br>
movlb 0 ; () banked <br>
movwf (??_pdt_init+3+0)&0ffh <br>
movlw low(01h) movlw
low(01h)<br>
movwf (0+((c:?_mem_read)+04h)),c movwf
(0+((c:?_mem_read)+04h)),c<br>
movlb 0 ; () banked movlb 0 ;
() banked<br>
movf (??_pdt_init+3+0)&0ffh,w movf
(??_pdt_init+0+0)&0ffh,w<br>
movlb 0 ; () banked movlb 0 ;
() banked<br>
movlw high(pdt_init@format_version) movlw
high(pdt_init@format_version)<br>
movwf (1+((c:?_mem_read)+05h)),c movwf
(1+((c:?_mem_read)+05h)),c<br>
movlb 0 ; () banked movlb 0 ;
() banked<br>
movlw low(pdt_init@format_version) movlw
low(pdt_init@format_version)<br>
movwf (0+((c:?_mem_read)+05h)),c movwf
(0+((c:?_mem_read)+05h)),c<br>
call _mem_read ;wreg free call
_mem_read ;wreg free <br>
</tt><div class="im"><tt><br>
</tt><tt><br></tt></div></div></blockquote><div><br>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. <br>
</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div text="#000000" bgcolor="#FFFFFF"><div class="im"><tt>
</tt><br>
<blockquote type="cite">
<div class="gmail_quote"><br>
<div>Aku verziu pouzivate LITE, STD alebo PRO? Pretoze podla
verzie tam je povolena inteligencia a optimalizacie.<br>
<br>
</div>
</div>
</blockquote></div>
Verzi Lite<br>
<br></div></blockquote><div><br>Tak potom niektore moje poznamky su pre Vas asi bezvyznamne.<br> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div text="#000000" bgcolor="#FFFFFF">
<br>
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?
<br><span class="HOEnZb"><font color="#888888">
<br></font></span></div></blockquote><div><br>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.<br>
<br>A.<br> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div text="#000000" bgcolor="#FFFFFF"><span class="HOEnZb"><font color="#888888">
<br>
J.S.<br>
</font></span></div>
<br>_______________________________________________<br>
HW-list mailing list - sponsored by <a href="http://www.HW.cz" target="_blank">www.HW.cz</a><br>
<a href="mailto:Hw-list@list.hw.cz">Hw-list@list.hw.cz</a><br>
<a href="http://list.hw.cz/mailman/listinfo/hw-list" target="_blank">http://list.hw.cz/mailman/listinfo/hw-list</a><br>
<br></blockquote></div><br>