 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
spy Član


Pridružen-a: Sre 06 Sep 2006 20:43 Prispevkov: 403 Aktiv.: 1.76 Kraj: Tržič
|
Objavljeno: Čet Sep 25, 2008 8:58 am Naslov sporočila: |
|
|
Prevajalnik ne more zaznati kdaj sklad povozi uporabne podatke v ramu. Zaznaš pa lahko ti med delovanjem programa, ko se kar naenkrat program obesi. Napaka je precej očitna. Meni se je to zgodilo že nekajkrat, pa sem takoj vedel, kam program "taco moli". Stara serija AVRjev, recimo 901200 je imela 3 nivojski HW sklad - tam šele izgubljaš živce
Prvi nivo sklada enostavno prebereš tam, kjer si definiral začetek sklada.
Direktno dostopni registri pri AVRju so vsi, niso pa vsi direktno vpisljivi. Verjetno si to mislil. To ima črno piko tudi pri meni. Vendar se v Cju zaradi tega ne sekiraš več. |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.94 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Čet Sep 25, 2008 2:51 pm Naslov sporočila: |
|
|
Citiram: |
Direktno dostopni registri pri AVRju so vsi, niso pa vsi direktno vpisljivi. Verjetno si to mislil. To ima črno piko tudi pri meni... |
Da, to sem mislil.
Načrtovalci mikorokontrolerjev se bi morali združiti. S kombinacijo PIC-a ter AVR-ja bi nastal dober dober mikrokontroler....
Sicer hvala za odgovore. _________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.94 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Ned Okt 19, 2008 5:35 pm Naslov sporočila: |
|
|
Še eno vprašanje glede sklada. (zadevo bom sicer testiral v praksi , ko pridem do delavnice)
Kaj se zgodi, če registra ki smo ga potisnili v sklad v podrutini (rcall) iz sklada ne potegnemo preden rutino zapustimo (ret). Prevajalnik sicer ne javi napake - simulator pa se "čudno" obnaša - skoči na reset vektor. Se procesor dejansko resetira?
PS
Zadeva sicer ni smiselna - ampak taka programska napaka lahko naredi kar nekaj sivih las, ker prevajalnik ne javi napake. _________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
Glitch Član

Pridružen-a: Pet 07 Apr 2006 11:40 Prispevkov: 1477 Aktiv.: 6.32
|
Objavljeno: Ned Okt 19, 2008 6:10 pm Naslov sporočila: |
|
|
Zakaj bi prevajalnik javil napako? Kaj pa, če želiš namerno manipulirati s stackom?
Nekaj branja na to temo: http://www.cs.uakron.edu/~margush/306/ppt/06stackNcall.ppt _________________ Answers: $1, Short: $5, Correct: $25, dumb looks are still free. |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.94 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Ned Okt 19, 2008 6:24 pm Naslov sporočila: |
|
|
Mogoče sem se narodno izrazil - lahko bi javil opozorilo. Sicer pa sem zadevo poskusil v praksi. Zgoraj napisano privede do reseta mikrokontrolerja-kot to stori simulator. (testiral na tiny13) _________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
aly Član



Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 39.71 Kraj: Kranj - struževo
|
Objavljeno: Pon Okt 20, 2008 9:18 am Naslov sporočila: |
|
|
Program skoči na tisto lokacijo, ki si jo vpisal v v stack s spremenljivko.
Tako bi lahko naredil programsko "look-up" tabelo.
Začetek tabele + željen offset daš v spremenljivko, narediš PUSH in nato RET. Program bo skočil na vrednost, ki je zapisana na stacku. _________________ I'm going to stand outside, so if anyone asks, I'm outstanding  |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.94 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Pon Okt 20, 2008 3:25 pm Naslov sporočila: |
|
|
Aljaž, ne vem, če sva se razumela.
Glej primer takega programa:
.
Koda: |
include "tn13def.inc"
.org 0
rjmp Glavni
.org 0x13
Glavni:
ldi r16,100
sts $60,r16
ldi r16,low(ramend)
out spl,r16
ldi r16,1
push r16
ldi r16,2
push r16
ldi r17,3
rcall test
push r17
pop r16
ldi r17,4
push r17
pop r16
lds r2,$9d
nop
nop
test:
ldi r20,10
push r20 ;r20 v sklad
rcall test1
ret
test1:
nop
ret |
Iz glavne rutine kličem rutino test. V rutini 'test' "potisnem" r20 v sklad.
Nato kličem še eno rutino 'test2'. ret normalno vrača v rutino test. Če tam r20 ne "poberem" potem ret rutine test vrača kazalček na reset.
 _________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
spy Član


Pridružen-a: Sre 06 Sep 2006 20:43 Prispevkov: 403 Aktiv.: 1.76 Kraj: Tržič
|
Objavljeno: Pon Okt 20, 2008 4:03 pm Naslov sporočila: |
|
|
Seveda Silvo. Pobrkljal si stack. RCALL ukaz na stack vrže trenutni PC, RET pa iz stacka vzame naslov in ga da v PC (btw, RETI ti poleg še I-bit briše).
Upravljanje s stackom se dopušča zaradi veliko pozitivnih stvari, kot ti jih je recimo omenil Aly. Zato prevajalnik ne zajamra. Vedeti pa moraš kaj delaš. Vsakemu PUSHu mora slediti POP, preden kdo drug kaj počne s stackom. V nasprotnem so skoki nepredvideni (vendar čisto normalni s stališča uC-ja). Poglej, kaj čaka na stacku tik preden pride RET. |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.94 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Pon Okt 20, 2008 4:09 pm Naslov sporočila: |
|
|
Kako zadeva deluje čisto razumem. Tak "odprt" sklad se da seveda dobro izkoristiti, seveda pa moraš vedeti kaj delaš. _________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.94 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Pon Okt 20, 2008 4:48 pm Naslov sporočila: |
|
|
Tale AVR assembler mi je čedalje bolj všeč. Poskusil sem malo "šariti" po skladu, tako da ret iz rutine 'test' vrača PC-5.
Koda: |
.org 0
rjmp Glavni
.org 0x13
Glavni:
ldi r16,100
sts $60,r16
ldi r16,low(ramend)
out spl,r16
ldi r16,1
push r16
ldi r16,2
push r16
ldi r17,3
rcall test
push r17
pop r16
ldi r17,4
push r17
pop r16
lds r2,$9d
nop
nop
test:
in r16,spl
ldi r17,2
add r16,r17
clr zh
mov zl,r16
ld r17,z
subi r17,5
st z,r17
rcall test1
ret |
_________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
spy Član


Pridružen-a: Sre 06 Sep 2006 20:43 Prispevkov: 403 Aktiv.: 1.76 Kraj: Tržič
|
Objavljeno: Pon Okt 20, 2008 6:35 pm Naslov sporočila: |
|
|
A pri PIC-ih ne moreš takole šariti po stack-u? |
|
Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.57
|
Objavljeno: Pon Okt 20, 2008 6:51 pm Naslov sporočila: |
|
|
Pri manjsih (ki imajo locen HW stack, do katerega dostopas samo preko cisto specificnih ukazov call/return in retfie) ne, pri vecjih, ki imajo ali dostop do stacka (18F) ali pa stack implementiran v RAMu (24 in dsPIC) pa seveda lahko. _________________ Ka ti bo pa torba ce si kupu kolo ? |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.94 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Ned Jan 04, 2009 11:21 pm Naslov sporočila: |
|
|
Spet ena assemblerska. Pri Tiny13 bi želel uporabit timer0. Zastavica TOV0 (overflow) se postavi. Kako jo izbrisati, če se ne uporablja prekinitev? _________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.94 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Ned Jan 04, 2009 11:24 pm Naslov sporočila: |
|
|
Silvo je napisal/a: |
Spet ena assemblerska. Pri Tiny13 bi želel uporabit timer0. Zastavica TOV0 (overflow) se postavi. Kako jo izbrisati, če se ne uporablja prekinitev? |
Našel. Sicer malo nelogično - obriše se, ko jo prepišeš z 1 a dela  _________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
damjanmi Član

Pridružen-a: Ned 15 Jan 2006 19:19 Prispevkov: 45 Aktiv.: 0.19
|
Objavljeno: Ned Jan 04, 2009 11:27 pm Naslov sporočila: |
|
|
Uporabis lahko sbi (set bit in I/O register).
Ups....malo prepozen odgovor  |
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 492 dni
Powered by phpBB © 2001, 2005 phpBB Group
|