Villkora kod beroende på vald uC i Atmel Studio 6?
Villkora kod beroende på vald uC i Atmel Studio 6?
Hej!
Vet ni om det i Atmel Studio 6 finns något sätt att i koden identifiera vilken uC som är vald för projektet?
Jag håller på skriver ett lib och behöver kunna villkora koden beroende på vilken uC som projektet ska använda.
Vet ni om det i Atmel Studio 6 finns något sätt att i koden identifiera vilken uC som är vald för projektet?
Jag håller på skriver ett lib och behöver kunna villkora koden beroende på vilken uC som projektet ska använda.
Re: Villkora kod beroende på vald uC i Atmel Studio 6?
avr-gcc definierar MCU-typen, t.ex om -mmcu=atmega1284p ges så definieras .
Du kan alltså göra typ
Kod: Markera allt
#define __AVR_ATmega1284P__ 1
Du kan alltså göra typ
Kod: Markera allt
#if defined(__AVR_ATmega1284P__)
// Kod för mega1284p
#elif defined(__AVR_ATmega328P__)
// Kod för mega328p
#else
#error "Your MCU isn't supported by this code"
#endif
Re: Villkora kod beroende på vald uC i Atmel Studio 6?
Funkar det för bibliotek? Bibliotek är ju kompilerade. Går det att sätta ihop ett bibliotek med kod kompilerad för olika processorer?
Re: Villkora kod beroende på vald uC i Atmel Studio 6?
Ja, jag tänkte också på det, ett "lib" betyder normalt objektkod.
Du kan så klart inte använda vanliga #define och #if defined...
D.v.s "Conditional compilation". Du behöver "Conditional linking".
Det finns normalt inget stöd i kompilatorerna för detta (fullt
naturligt, kompilatorns uppgift är enbart att skapa objektkod).
Det normala är att man kompilerar OBJ filer för de fall som
är aktuella och sedan antingen:
- Ge OBJ filerna olika namn och lägga dom i samma LIB.
- Ge OBJ filerna samma namn men ha olika LIB filer.
Fall två kan vara enklare, då räcker det med att ge länkaren
rätt filnamn till den LIB som är aktuell för den tänka målmiljön.
Du kan så klart inte använda vanliga #define och #if defined...
D.v.s "Conditional compilation". Du behöver "Conditional linking".
Det finns normalt inget stöd i kompilatorerna för detta (fullt
naturligt, kompilatorns uppgift är enbart att skapa objektkod).
Det normala är att man kompilerar OBJ filer för de fall som
är aktuella och sedan antingen:
- Ge OBJ filerna olika namn och lägga dom i samma LIB.
- Ge OBJ filerna samma namn men ha olika LIB filer.
Fall två kan vara enklare, då räcker det med att ge länkaren
rätt filnamn till den LIB som är aktuell för den tänka målmiljön.
Re: Villkora kod beroende på vald uC i Atmel Studio 6?
Jo det har ni ju rätt i, naturligtvis funkar inte #define på kompilerad kod som ju har i ett "lib", du får göra en version för varje arkitektur om du inte kan hitta en minsta gemensamma nämnare som funkar på alla tilltänkta modeller.
Re: Villkora kod beroende på vald uC i Atmel Studio 6?
Hm, får fundera lite på hur jag ska lösa detta... Tack för era synpunkter.
Re: Villkora kod beroende på vald uC i Atmel Studio 6?
Du skapar en global variabel i hvudprogrammet som du tilldelar till från villkorad kod i huvudprogrammet. Libbet kollar variabeln och exekverar olika kod.
Re: Villkora kod beroende på vald uC i Atmel Studio 6?
Nackdelen med det är att man måste länka in all kod för alla olika fall.
Man vill så klart bara länka in den modul som ska användas...
Man vill så klart bara länka in den modul som ska användas...
Re: Villkora kod beroende på vald uC i Atmel Studio 6?
Det beror på. Jag förutsatte att man bara vill ha en image.
Re: Villkora kod beroende på vald uC i Atmel Studio 6?
Knappast att rekomendera på plattformar som AVR/PIC och liknande.
Att ha "död" kod med som barlast är nog något som man försöker undvika.
Dessutom så kan ju inte koden enkelt flyttas från en processor till till en
annan, så som man kopierar en EXE från en dator till en annan.
Att ha "död" kod med som barlast är nog något som man försöker undvika.
Dessutom så kan ju inte koden enkelt flyttas från en processor till till en
annan, så som man kopierar en EXE från en dator till en annan.
Re: Villkora kod beroende på vald uC i Atmel Studio 6?
Jag får nog göra som Sodjan föreslår, olika libfiler för resp. uC.
Arduino IDE har en intressant variant dock, om jag förstår saker och ting rätt. Den skapar ett static lib core.a, varifrån en headerfil pins_arduino.h inkluderas. Kan det vara så att man då kan byta ut denna h-fil utan att byta ut lib-filen?
Arduino IDE har en intressant variant dock, om jag förstår saker och ting rätt. Den skapar ett static lib core.a, varifrån en headerfil pins_arduino.h inkluderas. Kan det vara så att man då kan byta ut denna h-fil utan att byta ut lib-filen?
Re: Villkora kod beroende på vald uC i Atmel Studio 6?
Nej, det funkar nog inte.
Det du möjligen kan göra är nån slags alias (med makron?) för funktionerna. Under förutsättning att länkaren bara tar med de funktioner som används (och inte alla som finns).
I libbarna har man alltså funktioner typ printf_a(), printf_b(), printf_c().
I koden du skriver använder du printf() (som inte finns). Och sen inkluderar du en .h-fil där du har makro som säger t.ex. att printf() ska vara printf_a(). Eftersom programmet bara använder printf_a() så länkas inte printf_b() och printf_c().
MEN, jag vet som sagt var inte om länkaren funkar så att den bara länkar de symboler som används, den länkar kanske hela libben ändå, och då funkar det ju inte.
Det du möjligen kan göra är nån slags alias (med makron?) för funktionerna. Under förutsättning att länkaren bara tar med de funktioner som används (och inte alla som finns).
I libbarna har man alltså funktioner typ printf_a(), printf_b(), printf_c().
I koden du skriver använder du printf() (som inte finns). Och sen inkluderar du en .h-fil där du har makro som säger t.ex. att printf() ska vara printf_a(). Eftersom programmet bara använder printf_a() så länkas inte printf_b() och printf_c().
MEN, jag vet som sagt var inte om länkaren funkar så att den bara länkar de symboler som används, den länkar kanske hela libben ändå, och då funkar det ju inte.
Re: Villkora kod beroende på vald uC i Atmel Studio 6?
Den (avr-ld) länkar in hela de objekt-filer (.o) som finns i lib-filen (.a) om man använder något från objekt-filen. Man bör alltså ha orelaterade delar i olika objekt-filer annars tas rubbet med. Detta gäller förstås inte om man använder LTO (Link Time Optimization), men det är relativt nytt och kanske inte helt robust än.
Re: Villkora kod beroende på vald uC i Atmel Studio 6?
Man kan ju då tänka sig att man har ett lib_a där printf_a() och alla andra _a-funktioner finns, ett lib_b där printf_b() och alla andra _b-funktioner finns. Skulle kanske funka?
Så i kod för uC a så används bara _a-funktioner och bara lib_a kommer att länkas.
Så i kod för uC a så används bara _a-funktioner och bara lib_a kommer att länkas.
Re: Villkora kod beroende på vald uC i Atmel Studio 6?
Du kan ha dem i samma lib, bara de ligger i varsin .o däri, då kommer bara den som refereras till att länkas med.