C kod till assembler MPLAB IDE

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Rick81
Inlägg: 755
Blev medlem: 30 december 2005, 13:07:09

C kod till assembler MPLAB IDE

Inlägg av Rick81 »

Jag har några delar i tidskritiska funktioner i C-kod som jag skulle vilja kompilera till assembler i MPLAB IDE för att garantera att de alltid tar lika lång tid oberoende på C-kompilator och optimering.

Det vore även bra att kunna skriva en funktion i C-kod och sedan optimera assemblern manuellt.

Går detta att göra i MPLAB version 8.76 och i så fall hur gör man? Jag vill ha kvar variabelnamnen från C-koden så att variablerna kan initieras av C-koden för att sedan användas i assemblern.

Det jag är ute efter är ungefär:

Kod: Markera allt

void Function(char value)
{
	value = value + 15;
	
	// Assemblerkod som kompilerats en gång av kompilatorn och sedan kopierats in:
	asm(".for")
	asm("MOVW value")	// for loop som använder value...
	asm("...")
	asm("...")
	asm("...")
	asm("DEC VALUE")
	asm("B for")	// hoppa till forloopen
}
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: C kod till assembler MPLAB IDE

Inlägg av sodjan »

För de som skulle vilja kommentera så skulle den sannolikt underlätta
en del som du även anger vilka verktyg du använder, om det inte
är hemligt eller så. "MPLAB" säger ingenting om C-verktygen...

Om du vill ha en assemblerrutin med kontroll över så ska du nog
inte skriva den i C över huvudtaget. Möjligtsvis kan du använda utfilen
från kompilatorn som en mall från första början, men efter det är det
enklare och stabilare att underhålla ASM rutinen separat.

I ditt exempel har inline-ASM vilket är ett annat sätt att lösa det, men
sannolikt inte speciellt plattformsoberoende mellan olika kompilatorer.

> Går detta att göra i MPLAB version 8.76 och i så fall hur gör man?

C-kompilatorn skapar *alltid* en ASM fil. Sen om den sparas eller inte
beror på någon inställning ("switch") till kompilatorn. Det får du kolla
upp i rellevant dokumentation. Det har mer med kompilatorn att
göra en MPLAB som sådant, det är bara ett "skal" till verktygen.
Dock så har sannolikt MPLAB någon konfig dialog där man kan ange
parametrar till de olika "tool-suites", t.ex den C-kompilator du använder.

> Jag vill ha kvar variabelnamnen från C-koden så att variablerna kan
> initieras av C-koden för att sedan användas i assemblern.

Du får kolla upp i dokumentationen för din C-kompilator hur "call-standard"
ser ut. Det kan även variera mellan kompilatorer så det är inte säkert
att du kan hitta en modell som fungerar rakt av mot olika C-kompilatorer.
Användarvisningsbild
Icecap
Inlägg: 26651
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: C kod till assembler MPLAB IDE

Inlägg av Icecap »

Vad jag har lärt av C och assembler i kombination är att variabler som deklareras i C (t.ex. "value") kommer att få en underscore lagt till i början i assembler, alltså i assembler kommer samma variabel att heta "_value".

value += 15; i C blir alltså:

asm(" movw _value");
asm(" addlw 15");
asm(" movf _value");

(om jag inte missminner PIC asm-mnemonics)

I övrigt är "value += 15;" identisk med "value = value + 15;"
Rick81
Inlägg: 755
Blev medlem: 30 december 2005, 13:07:09

Re: C kod till assembler MPLAB IDE

Inlägg av Rick81 »

Jag använder följande kompilatorer:
HI-TECH PICC-18 Toolsuite
HI-TECH Universal Toolsuite

Jag vill alltså inte skriva koden i assembler utan bara "låsa" en kompileringen så jag vet att den alltid blir likadan. Det är alltså mindre delar i C funktioner där detta ska göras.

Om variabelnamnen får _value av kompilatorn så måste jag väl döpa om assemblervariablen till value för annats kommer jag ju inte längre kunna använda value i C? Kan assemblern (dvs asm()) hämta lokala variablen från C?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: C kod till assembler MPLAB IDE

Inlägg av sodjan »

> Jag vill alltså inte skriva koden i assembler...

Om det ändå är det bästa alternativet då? Hur gör du då?

> ...utan bara "låsa" en kompileringen så jag vet att den alltid blir likadan.

Om du menar mellan olika kompilatorer (t.ex tillverkare) så vet i tusan. De kan ju ha
lite olika designval i sina kompilatorer. För en viss specifik kompilator så kan man
kanske stänga av optimeringen, men det kan ändå bli annorlunda efter t.ex en
uppgradering av kompilatorn. Hela "grejen" med att köra i C är att man överlåter
till kompilatorn att fixa detaljerna, så att säga. Duger inte det (och det gör det
ibland inte) så är det bara att snickra ihop det man behöver i assembler.

> Det är alltså mindre delar i C funktioner där detta ska göras.

Hur man än gör så får du sannolikt i alla fall lägga den aktuella koden
i separat källkodsfil så att du kan sätta optimering m.m för den.

> Om variabelnamnen får _value av kompilatorn...
> Kan assemblern (dvs asm()) hämta lokala variablen från C?

Jag antar att du har läst "3.10 Mixing C and Assembly Code" !?
Eller kanske inte, det låter inte så... :-)
Skriv svar