pekare till funktioner i en PIC16f

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

pekare till funktioner i en PIC16f

Inlägg av dangraf »

halloj!

Jag sitter o funderar på ett litet primitivt RTOS som jag tänkte skriva till en pic16F (den skall fungera på olika modeller).

Men som vanligt har jag stött på patrull och undrar om någon vet hur jag ska gå vidare.

jag hade viljat har en vektor med pekare till funktioner.

int *ptrvec =
{ &function1,
&function2...... osv
}

och därefter välja vilken funktion jag vill köra för tillfället.

Problemet är:
Vilket kommando skall jag använda för att anropa min funkiton?
CALL och GOTO verkar enbart vilja ha konstanter som parameter vilket gör min vektor värdelös.
Kan man på något sätt ställa PCn till en given adress i en PIC?
och hur gör jag för att hoppa tillbaka där jag precis var (en return)?

Best regards/ dangraf
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Vilket kommando skall jag använda för att anropa min funkiton?

Du menar hur det skall implementeras i assembler ?
Eller vad menar du med "kommando" ?

Är det av någon speciell anledning som ditt exempel är i C ?
Har du tänkt att hela RTOS'et skulle vara skrivet i C ?

> CALL och GOTO verkar enbart vilja ha konstanter som parameter...

Jepp.
De nyare PIC18 processorerna har en "extenden mode" med
indexerade GOTO och CALL som just är tänkta att användas av
C kompilatorer och liknande.

> Kan man på något sätt ställa PCn till en given adress i en PIC?

Japp, du kan ställa PCL/PCH till vad du vill, och nästa intsruktion
hämtas från den adressen. Inget konstigt, används vid "table lookup".
Kräver att man hanterar PCLATH rätt på processorer med > 2 K word minne.

> och hur gör jag för att hoppa tillbaka där jag precis var (en return)?

Intruktionen RETURN förutsätter att return-adressen ligger på stacken.
Men eftersom du inte själv kan skriva till stacken, så blir det
lite svårt eftersom du inte kommer från en CALL.
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Det KAN gå men det är knepigt...

Man kan få returadressen på plats vid att placera ett "välriktat" kall där man vill att rutinen ska återkomma till:

Kod: Markera allt

...
CALL SetNewAddress
; Här återkommer funktionen sedan, do your RTOS-thing
...
SetNewAddress:
; Greja hoppet vid att sätta PCLATH, PCH och PCL rätt UTAN att CALL'a
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Inlägg av dangraf »

Hmm. du är inte så dum som du ser ut icecap (enligt bilden alltså) ;-) det var jävligt smart. måste tänka lite på det där..
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

>> dangraf

Det är väl en av de anledningar till att man väljer att skriva RTOS-kärnor i delvis asm och eventuellt delvis C. Det finns helt enkelt oftast inget vettigt sätt att hoppa direkt på i C. Om däremot slussar över din hopadress till asm och sen gör ditt vanliga call så är saken biff!
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Det beror väll lite på hur mycket overhead man vill ha också.
D.v.s hur stor del av cyklerna skall vara RTOS-administration rellativt "nyttigt" job-

Hur är det tänkt att RTOS'et skall interface'a mot applikationskoden ?
Är det app-koden som släpper tillbaka kontrollen till RTOS'et, eller
är det RTOS'et som själv tar kontrollen regelbundet ? Vilka
resurser (interrupt, timers mm) kommer att vara allokerade av RTOS'et ?

Säkert ett intressant projekt, men lite tveksamt om det är realistiskt på PIC16.
På PIC18 med mer resurser och minne, är det lite annorlunda. T.ex möjlighten
i "extended mode" att ha ett "window" med en bas address mot RAM
minnet gör context-switching lite enklare. Bara att byta bas-address. På PIC18
kan man även manipulera stacken.

Personligen tycker jag assembler är tillräckligt mycket "RT" för att även ha behov av ett "OS"... :-)
Det blir för mycket Basic-STAMP över det hela.
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

dangraf: tackar ;-)

Jag började i 80-talet med Z80 assembler och fick så småning om tag på en TRS80 som jag disassemblerade PROMmen på så bra att när jag assemblerade den igen fick jag exakt samma kod!

Dom som gjorde mjukvaran gjorde MÅNGA "roliga" saker, jag rensade i dom och la till en drös med SRAM + batteri så "disk"-kommandon kunne spara och ladda från SRAM'en, autoexekvera program (BASIC-program såklart...), all kommandon fanns tillgängliga för BASIC'en....

Jag lärde en HEL DEL programmeringstrix då och jag _vet_ att jag gör solid mjukvara, testat genom MÅNGA år.

Men allvar: ett RTOS till PIC? Är det inte lite som att skjuta gråsparvar med kanoner?
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Inlägg av dangraf »

Det kanske är lite väl att kalla det jag tänkte göra för ett RTOS.

Jag är medveten om att vissa saker får man skriva i assembler, det var därför jag skev "kommandon" eftersom det är ett öppet uttryck för både assembel och C-kod.

I stora drag tänkte jag att kärnan skulle fungera ung såhär.

Man skapar sina tasks med deadline och om de är aktiva eller inte(waiting blocket osv) och sortarar in dem i en lista.

Därefter tänkte jag låta varje task köra tills den flyttat fram sin deadline och når return. Då så sorteras min lilla task med ny deadline in i listan och låster efterföljande task köras.
Deadlinen bestämmer när tasken skall köras (deadline == ticks).

Jag funderar även på att ha en idle task som kollar när nästa task skall köras och lägger processorn i sleep tills dess och på så vis spar ström.

Det är tänkt att alla mina tasks ska kunna avbrytas av interrupt från processorn (och därefter fortsätta när interrupt rutinen är avslutad)

Anledningen till allt detta jidder är pga att jag just nu programmerar i en spagettigryta med säkert 4-5 olika personers kod. Denna gryta behöver kammas så man får lite rätsida på det hela.

Jag vill bara kolla om det är möjligt. blir det för mycket kod eller för krångligt, så skiter jag i det. Men jag tror att det hade kunnat underlätta om det går.
SALVO är föresten ett RTOS för pic16 familjen, så visst går det om man krystar riktigt hårt! ;-)
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Då förstår jag bättre vilken röra du ska reda ut :-(

Lycka till!
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Det tar antagligen mycket mer tid att försöka få ihop det "RTOS" som du beskriver, än att skriva om de 4-5 personernas kod från grunden...
Är det verkligen 4-5 personer som har varit inblandade i samma PIC16 appikation ? Eller menar du över tiden (alltså inte samtidigt) ?

Hur mycket kod handlar det om ? Språk ?

Jag känner till SALVO, men används det i någon större skala ??
Megge
Inlägg: 33
Blev medlem: 2 oktober 2005, 19:36:27
Ort: Linköping

Inlägg av Megge »

Det där är inga problem att göra i C om du använder funktionspekare.
Här kan du läsa om hur du använder sådana
Senast redigerad av Megge 7 december 2005, 21:26:07, redigerad totalt 1 gång.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Jaha, och vad har den sidan med PIC programmering att göra ???
Megge
Inlägg: 33
Blev medlem: 2 oktober 2005, 19:36:27
Ort: Linköping

Inlägg av Megge »

Inget speciellt, men den beskriver hur man anropar funktioner från funktionspekare, vilket var vad författaren undrade i första inlägget.
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Då kanske du ska läsa frågan igen...

Han frågade HUR han skulle utföra CALL med rätt returadress när han har en pointer till en funktion, pointern är alltså redan klar, kruxet är att man inte kan PUSH/POP i stacken på en PIC.
Skriv svar