Villkora kod beroende på vald uC i Atmel Studio 6?

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
mattswe
Inlägg: 159
Blev medlem: 20 augusti 2012, 13:27:51

Villkora kod beroende på vald uC i Atmel Studio 6?

Inlägg av mattswe »

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.
snigelen
Inlägg: 815
Blev medlem: 8 maj 2009, 11:02:14
Ort: Lund

Re: Villkora kod beroende på vald uC i Atmel Studio 6?

Inlägg av snigelen »

avr-gcc definierar MCU-typen, t.ex om -mmcu=atmega1284p ges så definieras

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
ie
EF Sponsor
Inlägg: 1371
Blev medlem: 23 oktober 2006, 13:12:57
Ort: Tyresö

Re: Villkora kod beroende på vald uC i Atmel Studio 6?

Inlägg av ie »

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?
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Villkora kod beroende på vald uC i Atmel Studio 6?

Inlägg av sodjan »

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.
snigelen
Inlägg: 815
Blev medlem: 8 maj 2009, 11:02:14
Ort: Lund

Re: Villkora kod beroende på vald uC i Atmel Studio 6?

Inlägg av snigelen »

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.
mattswe
Inlägg: 159
Blev medlem: 20 augusti 2012, 13:27:51

Re: Villkora kod beroende på vald uC i Atmel Studio 6?

Inlägg av mattswe »

Hm, får fundera lite på hur jag ska lösa detta... Tack för era synpunkter.
gkar
Inlägg: 1584
Blev medlem: 31 oktober 2011, 15:28:29
Ort: Linköping

Re: Villkora kod beroende på vald uC i Atmel Studio 6?

Inlägg av gkar »

Du skapar en global variabel i hvudprogrammet som du tilldelar till från villkorad kod i huvudprogrammet. Libbet kollar variabeln och exekverar olika kod.
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Villkora kod beroende på vald uC i Atmel Studio 6?

Inlägg av sodjan »

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...
gkar
Inlägg: 1584
Blev medlem: 31 oktober 2011, 15:28:29
Ort: Linköping

Re: Villkora kod beroende på vald uC i Atmel Studio 6?

Inlägg av gkar »

Det beror på. Jag förutsatte att man bara vill ha en image.
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Villkora kod beroende på vald uC i Atmel Studio 6?

Inlägg av sodjan »

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.
mattswe
Inlägg: 159
Blev medlem: 20 augusti 2012, 13:27:51

Re: Villkora kod beroende på vald uC i Atmel Studio 6?

Inlägg av mattswe »

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?
Nerre
Inlägg: 27184
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Villkora kod beroende på vald uC i Atmel Studio 6?

Inlägg av Nerre »

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.
snigelen
Inlägg: 815
Blev medlem: 8 maj 2009, 11:02:14
Ort: Lund

Re: Villkora kod beroende på vald uC i Atmel Studio 6?

Inlägg av snigelen »

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.
Nerre
Inlägg: 27184
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Villkora kod beroende på vald uC i Atmel Studio 6?

Inlägg av Nerre »

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.
snigelen
Inlägg: 815
Blev medlem: 8 maj 2009, 11:02:14
Ort: Lund

Re: Villkora kod beroende på vald uC i Atmel Studio 6?

Inlägg av snigelen »

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.
Skriv svar