Sida 1 av 4
bankad PIC
Postat: 26 oktober 2007, 06:56:05
av persika
Tycker PIC'kretsarna är bra, men gillar inte att file-register är indelat i bankar. Varför är det så, är det nån fördel med det ?
12F675
Postat: 26 oktober 2007, 08:25:17
av Icecap
Det sparar programminne-bits och därmed behövs mindre kisel vilket ger billigare kretsar.
Postat: 26 oktober 2007, 09:54:33
av ucadv
rent allmänt brukar bankerna användas för att
1. göra ISAn kortare
2. göra interrupten snabbare
jag har svårt att se hur banker skulle spara minne och kiselarea
edit: "minner"

Postat: 26 oktober 2007, 10:46:32
av sodjan
> jag har svårt att se hur banker skulle spara minner och kiselarea
Kortera instruktioner -> mindre kisel/instruktion.
Sedan är en stor del av svaret naturligtsvis "histora".
Om man enbart frågar sig varför det är som det är *idag*
så får man sannolikt fel svar...
> 1. göra ISAn kortare
Vad är "ISA" ?
> 2. göra interrupten snabbare
Hur då ?
Postat: 26 oktober 2007, 11:11:51
av ucadv
>Kortera instruktioner -> mindre kisel/instruktion.
switchbank instruktioner -> fler instruktioner -> tillbaka på ruta ett
>Vad är "ISA" ?
http://en.wikipedia.org/wiki/Instructio ... chitecture
>Hur då ?
http://en.wikipedia.org/wiki/8051#Impor ... plications

Postat: 26 oktober 2007, 13:27:35
av sodjan
Att göra *arkitekturen* kortare !? Det förstår jag inte riktigt...
Hur då ? Färre instruktioner ? Färre sidor i manualen ?
Och länken om 8051 snackarar om olika registerbanker som
switchas vid interrupt, vilket har väldigt lite med PIC att göra.
Faktum kvarstår, att arkitekturen i dagens PIC ser ut som den gör
har *primärt* historiska orsakar. Inte att den skulle vara direkt
bättre än något annat på något sätt, dock är den tillräckligt bra
för att göra jobbet...
Postat: 26 oktober 2007, 13:46:15
av ucadv
> Att göra *arkitekturen* kortare !? Det förstår jag inte riktigt...
> Hur då ? Färre instruktioner ? Färre sidor i manualen ?
kom igen nu sodjan, spela inte dum!
>Och länken om 8051 snackarar om olika registerbanker som
>switchas vid interrupt, vilket har väldigt lite med PIC att göra.
läs gärna mitt första inlägg en gång till.
>Faktum kvarstår, att arkitekturen i dagens PIC ser ut som den gör
>har *primärt* historiska orsakar. Inte att den skulle vara direkt
>bättre än något annat på något sätt, dock är den tillräckligt bra
>för att göra jobbet...
*vad i hela världen snackar du om?*
Postat: 26 oktober 2007, 13:54:26
av sodjan
> läs gärna mitt första inlägg en gång till.
OK :
> rent allmänt brukar bankerna användas för att
> 1. göra ISAn kortare
> 2. göra interrupten snabbare
1. Jag ser inte hur instruktionsarkitekturen blir "kortare".
(De enskilda instruktionerna kanske...)
2. Jag ser inte hur interrupt blir snabbare genom bankerna i en PIC.
(Det du länkade till snackade om en helt annan arkitektur.)
> *vad i hela världen snackar du om?*
PIC, och varför de ser ut som de gör. D.v.s det som persika frågade om.
Jag börjar misstänka att du talar om något helt annat !?
Det skulle kunna förklara missförstånden...
Postat: 26 oktober 2007, 14:34:35
av ucadv
sodjan, det är fredag em och jag kanske är lite trött... men det är mycket irriterande att du klagar på min tolkning av ett ord (ok, en förkortning) du inte hade hört talas om för bara två timmar sedan.
när man säger ISA, så syftar man 98 gånger av 100 på instruktionsformatet. I det här samnhanget behövs väl inget geni för att lista ut att det är längden (antal bitar) på instruktionerna som blir kortare?
någon annan får förklara hur switchade bankar/register ger snabbare interrupt rutiner.
för nu går jag hem...
Postat: 26 oktober 2007, 14:52:44
av sodjan
Whatever...
Bara persika är nöjd...
Trevlig helg !!
Postat: 26 oktober 2007, 17:21:17
av Marta
Javisst blir OP'n kortare när man har bankswitchade register, men hur i glödheta interrupt response skulle bli snabbare har jag svårt att hänga med på.
Som jag ser det blir den långsammare av att behöva sätta bankselect bits i statusregistret i början av interrupthanteraren. Just för att undvika detta så allokerar jag om möjligt minnet för snabba interrupts i obankat RAM så att det bara är att köra på.
Du tänker kanske på riktigt avanserade saker där man gör tskswitch genomatt ställa om ett basregister och sedan är alla register "nya" så man slipper spara undan en massa saker. Någon sådan funktionalitet finns ju inte i PIC.
En av de stora fördelarna med PIC18 tycker jag är just att man slipper bankselect för alla SFR's. Dessa är valbara genom en enda override-bit som väljer denna bank. Där finns även lite RAM för just snabba interrupts t.ex.
Där är också en liten switchbar area som väl är det närmaste man kommer det Du nämner. Det kan vara bra om man vill skriva reentrant kod utan att behöva skyffla så mycket. Nog avändbart i kompilatorer, men har hittills aldrig haft nytta av det i PIC. Har använt stackframes någon gång i x86 (V20), men det är inte ofta man har nytta av sådant vid "teknisk programmering".
Postat: 27 oktober 2007, 08:09:11
av persika
Oj, oj... här har varit en livlig disskussion...
Kanske det finns/funnits nån tillverkningsteknisk anledning till att bankarna kommit till.
Men jag tycker det verkar vara mest trassligt med bankar från programmerarens sida sett.
Jag har försökt komma underfund med hur det funkar med bankarna, men inte fått det funka på det sätt jag tänkt.
Har gjort några exempel, som adderar två variabler
som ligger på "samma ställe", men i olika bankar.
Får inte rätt resultat, båda variablerna ändrar sig samtidigt.
Det blir inte rätt i MPSIM, har inte kört det i en riktig pic'krets.
Ett exempel med att addera variablerna direkt, ett annat med pekare och som switchar mellan bankarna för att välja variabel.
12F675
;------------------
; Exempel, addera två tal på olika sätt
TAL equ 020h
TAL2 equ 0A0h
;------------------
; Exempel 1
; lägg värden i TAL och TAL2
banksel TAL
movlw 011h
movwf TAL ; TAL := 011h
banksel TAL2
movlw 022h
movwf TAL2 ; TAL2 := 022h
; addera de två talen
banksel TAL
movf TAL, w
banksel TAL2
addwf TAL2, w
; efter detta exempel får w = 044h
;------------------
; Exempel 2
; ställ in pekare
movlw TAL
movwf FSR ; pekar på TAL
; lägg värden i TAL i båda bankarna
bcf status, RP0 ; bank 0
movlw 011h
movwf INDF ; (TAL,bank0) := 011h
bsf status, RP0 ; bank 1
movlw 022h
movwf INDF ; (TAL,bank1) := 022h
; addera de två talen
bcf status, RP0 ; bank 0
movf INDF, w
bsf status, RP0 ; bank 1
addwf INDF, w
; efter detta exempel får w = 044h
;------------------
Postat: 27 oktober 2007, 15:29:20
av ucadv
marta>>
använ t.ex. bank 0 till normalt arbete och bank 1 till interrupt så slipper du pusha och popa register i din interrupt rutin
en del processorer som tex ARM7 byter "bank" automatisk när en interrupt kommer (okej, kanske inte riktigt samma sak, men ni förstår poängen?)
Postat: 27 oktober 2007, 16:53:43
av BoF
Ja nu var det PIC som gällde och den kan bara anropa avbrott till bank 0. I själva interupt kan koden självklart banka om och anropa rutiner i andra banker, men det är väl inte så klok då man vill att interupt koden skall vara så effektiv som möjlig.
Dom olika bankerna är en teknik som håller nere antal bitar som programräknar måste innehålla.
Att indela minnet i olika segment (banker) gör att PC (program counter) kan göras mindre tex. som för en PIC16 familj bara 13bitar.
Så med andra ord är det som Icecap säjer, det kostar på att kunna adressera minne utan att ta till olika tekniska lösningar.
Postat: 27 oktober 2007, 17:38:41
av ucadv
jesus...
det kanske inte alltid fungerar på en PIC, men att använda banker för att snabba upp interruptrutiner är standard inom industrin. jag fick en smärre chock när jag läste era kommentarer!
en normal interruptrutin i ett riktigt program (det vill säga en som är större än 32 byte) kan se ut så här:
Kod: Markera allt
min_interrupt:
spara register 1 till 16 på stacken
sköt avbrottsarbetet (innehållet i registrarna kan ändras här)
läs tillbaka register 1 till 16 från stacken
returnera från interrupt
med bank switch blir det mer som
Kod: Markera allt
min_interrupt:
byt till bank 1
sköt avbrottsarbetet
byt tillbaka till bank 0
returnera från interrupt
så vilken är snabbast?
BoF>>
hur kan PCn blir mindre? PCn adresserar program minnet (flashet), jag fick för mig att det vara data minnet (ram) som var delade i banker. om inte annat blir programmet *längre* när man lägger in en massa instruktioner för att byta bank ?