bankad PIC
bankad PIC
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
12F675
> 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å ?
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å ?
>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

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

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...
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...
> 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?*
> 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?*
> 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...
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...
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...
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...
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".
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".
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
;------------------
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
;------------------
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.
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.
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:
med bank switch blir det mer som
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 ?
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
Kod: Markera allt
min_interrupt:
byt till bank 1
sköt avbrottsarbetet
byt tillbaka till bank 0
returnera från interrupt
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 ?