Jag vill krångla till anrop mellan ASM och C18

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
PeterSfa
Inlägg: 22
Blev medlem: 26 augusti 2009, 10:33:55
Skype: peterfagerbrant
Ort: Norsborg
Kontakt:

Jag vill krångla till anrop mellan ASM och C18

Inlägg av PeterSfa »

Jag försöker ett tillkrånglat sätt att samarbeta mellan asm och C.

Jag vet att jag dels kan samköra asm och C18 kod i samma projekt och dra nytta av funktioner mm skrivna i C repsektive asm.
Jag kan också skriva inline assambler.

Dock ville jag försöka göra följande.

Skriva ett kodblock i ASM där jag sätter innehåll i vissa ram poster och sedan anropar "modul" liggande med start minnesadress 0x6000.

Programmet till minnesadress 0x6000 skriver jag i C18.
den modulen skall läsa de minnesadresser asm modulen skrivit till, för att ta reda på vad den skall utföra.

Alltså ett verkligt tillkrånglat sätt att göra det på ;)
Nu är det ju så att jag försöker lära mig. Har försökt gå igenom dokumentationen och reda ut det.

Är det rätt uppfattat att jag genom att använda:
#pragma code main=0x6000
får min C18 modul att ligga från och med adress 0x6000. Eller är det bara länkscriptet som kan styra upp den på den minnesadressen?

Dessutom deklaration av pekare direkt på specifikt förutbestämt minnesområde:
Kan det fungera med:
const char ram *opMode = 0x200;

Dokumentation förutsätter det mer normala användande av pekare.. Så jag saknade en bit där.

Jag vet det är ett dumt sätt att lösa det på. Men jag skulle uppskatta kommentarer om jag är på rätt väg för att få det jag vill ha gjort utfört.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Jag vill krångla till anrop mellan ASM och C18

Inlägg av sodjan »

> Jag vet det är ett dumt sätt att lösa det på.

Gör det inte då. :-)
Vilket är din alternativa metod ?

Är adressen till C-koden kritisk ? D.v.s måste den ligga på en viss adress ?
Jag misstänker att man med lite symboler kan få det hela dynamiskt, d.v.s
att det inte spelar någon roll var C koden ligger. Är det C-koden som så att
säga "styr" det hela ? Eller är det bara subrutiner i C ?
Användarvisningsbild
Icecap
Inlägg: 26660
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Jag vill krångla till anrop mellan ASM och C18

Inlägg av Icecap »

Mycket ofta kan man komma åt samma variabler från båda C och ASM!

Om man t.ex. i C deklarerar:
unsigned char My_Byte;

kan ASM oftast "komma åt den" vid att man anger namnet "_My_Byte", alltså en underscore innan.
På detta vis är det bara att deklarera variablerna i C och sedan använda dom i ASM om man vill.
PeterSfa
Inlägg: 22
Blev medlem: 26 augusti 2009, 10:33:55
Skype: peterfagerbrant
Ort: Norsborg
Kontakt:

Re: Jag vill krångla till anrop mellan ASM och C18

Inlägg av PeterSfa »

sodjan skrev:> Jag vet det är ett dumt sätt att lösa det på.

Gör det inte då. :-)
Vilket är din alternativa metod ?

Är adressen till C-koden kritisk ? D.v.s måste den ligga på en viss adress ?
Jag misstänker att man med lite symboler kan få det hela dynamiskt, d.v.s
att det inte spelar någon roll var C koden ligger. Är det C-koden som så att
säga "styr" det hela ? Eller är det bara subrutiner i C ?
Enda orsak att jag försöker mig på de här dumheterna är att lära mig gränserna och behärska båda delarna, d.v.s asm och C.

Jag kör asm modulen som styrande. C modulen tänkte jag mig bestå av en "main" funktion på 0x600 som trillar tillbaks till asm modulen after varje anrop.

Jag har ett schenario där jag från asm sätter ett antal flaggor med start på minnesadress 0x200, anropar sedan C delens mainsnurra med hopp till adress 0x6000. Tanken är att C modulen skall läsa de minnesadresser jag satt flaggor i och baserat på de flaggorna utföra vissa åtgärder.

Jag har satt upp timeravbrott i asm delen och avbrott för tangenter etc.
C modulen har ingen egen loop och använder inte interupten i övrigt.
Dock testar jag av om vissa timers som körs i asm delen nått sitt mål.
I C modulen skickar jag t.ex motor start, eller stop etc till i det här fallet SPP porten..
Har timers inte nått sitt mål, så utförs ingen operation i C modulen utan trillar bara tillbaks till asm delen igen för att återigen testa när den pollats återigen av asm modulen.

Desutom sätter jag i C, delen flaggor i nämnda minnesområdet som asm modulen sedan kan använda i sina tester. D.v.s tillstånd för motor, av/på etc då info om det försvann efter jag skickat dem på SPP.

ASM modulen har alltså main slingan och hoppar till C delen en gång per varv. C delen återvänder direkt tillbaks till ASM mainslinga efter den utfört sitt uppdrag. (Det är altså bara subrutinerna i C)

Det jag försöker få grepp om på det här sättet. Är dels att sätta pekare på fasta minnesadresser, dels att få till det med programkörningshopp till fasta adresser.

Jag fick iden till de här dumheterna när jag gick igenom global direktiven för att få C att anropa asm funktioner. Jag började fundera på, hur hoppa över hela det steget.

Alternativet är naturligtvis att köra enligt boken och deklarerar funktionerna som vettigt folk ock låta länkaren peta ihop allt rätt ;)

Det här är lite enligt temat att "man har 100% kontroll på exakt vad som skall ske i processorn"
PeterSfa
Inlägg: 22
Blev medlem: 26 augusti 2009, 10:33:55
Skype: peterfagerbrant
Ort: Norsborg
Kontakt:

Re: Jag vill krångla till anrop mellan ASM och C18

Inlägg av PeterSfa »

Icecap skrev:Mycket ofta kan man komma åt samma variabler från båda C och ASM!

Om man t.ex. i C deklarerar:
unsigned char My_Byte;

kan ASM oftast "komma åt den" vid att man anger namnet "_My_Byte", alltså en underscore innan.
På detta vis är det bara att deklarera variablerna i C och sedan använda dom i ASM om man vill.
Jo det var efter jag läste om det som jag fick iden till att försöka göra det utan att länkaren känner till saken.
Det är knappast m.a.o ett optimalt projekt utan ett sätt för mig att se var gränsen går till vad som är möjligt.

Det arbetssättet förutsätter ju att du någonstan länkar ihop allt.
D.v.s att du antingen har med asm koden i projektet eller har den inlänkad som objektfil. Annars kan inte länkaren sätta anropsadresserna.


Edit:

Desutom ligger som nästa delmål i min egen påhittade kursplan att titta på bootloaders.

Jag hade då tänkt försöka få asm delen separat programmeringsbar och C delens kod separat.

Man kan säga att det blir två firmware i en processor som skall samarbeta(beroende av varandra). Allt detta igång startat av bootloadern.
Senast redigerad av PeterSfa 14 september 2009, 13:39:15, redigerad totalt 1 gång.
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Re: Jag vill krångla till anrop mellan ASM och C18

Inlägg av vfr »

Det är betydligt krångligare att göra på det sättet. Det är mycket enklare att låta huvudrutinen ligga i C och sedan anropa asm. Dessutom mycket mer i linje med den övergripande strukturen. Assembler används till små snabba funktioner som anropas från ett huvudprogram skrivet i C.

Nu har jag faktiskt också ett projekt med "omvänt" upplägg. Dock inte till PIC, så det är inte till någon hjälp här.
PeterSfa
Inlägg: 22
Blev medlem: 26 augusti 2009, 10:33:55
Skype: peterfagerbrant
Ort: Norsborg
Kontakt:

Re: Jag vill krångla till anrop mellan ASM och C18

Inlägg av PeterSfa »

vfr skrev:Det är betydligt krångligare att göra på det sättet. Det är mycket enklare att låta huvudrutinen ligga i C och sedan anropa asm. Dessutom mycket mer i linje med den övergripande strukturen. Assembler används till små snabba funktioner som anropas från ett huvudprogram skrivet i C.

Nu har jag faktiskt också ett projekt med "omvänt" upplägg. Dock inte till PIC, så det är inte till någon hjälp här.
Jo krångligt var det, då jag ganska snabbt kom på att manualerna inte direkt berättade hur göra en sådan här sak.
Jag styrs ofta av sådana här impluser. Att ta reda på. Hur funkar det här?

Jag har t.ex inte ännu sett en enda notis i manualen om att använda pekare på det här sättet. Min tanke var att det borde fungera då pekaren i det här fallet pekar på en fysisk ram adress.
bos
Inlägg: 2314
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Re: Jag vill krångla till anrop mellan ASM och C18

Inlägg av bos »

Jag förstår ditt begär över att få veta mer, att tänja på gränserna på saker och ting, då jag själv är likadan. Allt ska provas ut och in i minsta detalj, då får man full förståelse för saker och ting.

Är inte helt 100% med på ditt tänkande men det jag fått ut av dina inlägg är att du har intresse av att hoppa fram och tillbaka i modulär kod skriven med olika källor. Det är en nyttig övning, så där är jag med. Det jag inte är med på varför du prompt måste ha kod på en viss minnesadress och liknande, men det kanske är uppenbart om man förstår hela din tankegång (vilket jag alltså inte gör).

Kan du utveckla på bare bones-språk varför du absolut(!) måste ha absoluta adresser? Dvs varför du väljer att inte enbart fokusera på själva problemlösningen med modulär kod, utan att du också måste blanda in absolut adressering (vilket jag anser vara dålig, men det är ett religiöst ämne för min del så vi behöver inte starta flamewar för den sakens skull).
PeterSfa
Inlägg: 22
Blev medlem: 26 augusti 2009, 10:33:55
Skype: peterfagerbrant
Ort: Norsborg
Kontakt:

Re: Jag vill krångla till anrop mellan ASM och C18

Inlägg av PeterSfa »

bos skrev:Kan du utveckla på bare bones-språk varför du absolut(!) måste ha absoluta adresser? Dvs varför du väljer att inte enbart fokusera på själva problemlösningen med modulär kod, utan att du också måste blanda in absolut adressering (vilket jag anser vara dålig, men det är ett religiöst ämne för min del så vi behöver inte starta flamewar för den sakens skull).
Planen blev på det sättet då jag antog mig behöva fasta adresser för att i ett senare skede kunna skilja på firmware1 resp firmware2 inom samma CPU.

Jag vill alltså från bootloadern senare kunna upload'a enbart uppdatering på firmware1 som är skriven i ASM, helt oberoende av firmware2 som är skriven i C. Givet så länge deras handskakningsprotokoll fortfarande är kompatibelt.

Detsamma gällde då också firmware2 gjord i C som skall kunna uppdateras separat.

Så i sluttampen tänkte jag mig en organisation så här.

1. BootLoader
2. Firmware1 (ASM)
3. Firmware2 (C18)
Användarvisningsbild
Icecap
Inlägg: 26660
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Jag vill krångla till anrop mellan ASM och C18

Inlägg av Icecap »

Varför tusan citerar du hela tiden??

Det räcker alldeles fint att ange vilket nick ett svar är till, t.ex.såhär:
PeterSfa: bla bla bla

Folk här är smarta nog att fatta detta och citering i onödan är illa sett här.
PeterSfa
Inlägg: 22
Blev medlem: 26 augusti 2009, 10:33:55
Skype: peterfagerbrant
Ort: Norsborg
Kontakt:

Re: Jag vill krångla till anrop mellan ASM och C18

Inlägg av PeterSfa »

Icecap: OK. Olika regler på olika ställen. Jag justerar ;)
Användarvisningsbild
Odur
Inlägg: 267
Blev medlem: 11 september 2005, 14:36:49
Ort: Borås

Re: Jag vill krångla till anrop mellan ASM och C18

Inlägg av Odur »

Här är reglerna: http://www.elektronikforumet.com/forum/ ... 13&t=18141

Kort sagt: Citera aldrig närmast ovan inlägg, citering används när du vill svara på ett inlägg högre upp.
Användarvisningsbild
Icecap
Inlägg: 26660
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Jag vill krångla till anrop mellan ASM och C18

Inlägg av Icecap »

Och då bara om det inte är klart vilken del man svarar en viss person med.

Nåväl, för mig verkar det som om att du får partitionera minnet i 3 delar:
1: Bootloader
2: ASM-plats
3: C-plats

Du bör kanske även definiera en "gemensam" RAM-partition där ASM och C kan kommunicera med varandra.

Att uppdela minnet så är inte så svårt faktisk, det rör sig egentligen "bara" om att ställa in start och slutadressor ordentligt, båda i ROM och RAM, ett alternativ kan ju vara att bootloadern förfogar över RAM som kan användas till detta.

Att placera en variabel på en viss minnesadress i C är inte så himla svårt och att göra det i ASM är ju enklare än enkelt, på det vis kan man enkelt definiera de gemensamma variabler och hålla kvar deras struktur genom flera versioner mjukvara.
PeterSfa
Inlägg: 22
Blev medlem: 26 augusti 2009, 10:33:55
Skype: peterfagerbrant
Ort: Norsborg
Kontakt:

Re: Jag vill krångla till anrop mellan ASM och C18

Inlägg av PeterSfa »

Jo så långt hade jag klurat ut det också.

#pragma code main=0x6000
Verkar också fungera för att lägga koden från adress 6000 och uppåt-

ram char *opMode = (ram char*)0x200;
Blev min modifiering för att slippa varningen om skumma pekare. Dessutom ville jag ha den skrivbar med tiden, så jag tog bort const.

När jag kör i SIM fungerar allt som det skall, d.v.s att min opMode pekare pekar på minne som jag kan ta upp i watch. Dock funkar det inte i procesorn ännu. Minnet på adress 0x200 blir inte satt.
Kan vara i min asm del, att jag inte ropar på c modulen på rätt sätt. Undersöker för tillfället.

När jag kompilerar vill C18 också konstant försöka länka in c018i och p18F4550. Hade helst velat slippa det i C delen, då det redan är avklarat med ASM delen. Hittar dock ingen inställning för det i MPLAB. Har man valt device, så envisas den.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Jag vill krångla till anrop mellan ASM och C18

Inlägg av sodjan »

> Kan vara i min asm del, att jag inte ropar på c modulen på rätt sätt.

h'0200' är ju en ganska "hög" adress. Hanterar du PCLATH rätt ?
Skriv svar