avr-gcc assembler och c tillsammans (ganska lång)

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Rymdninja
Inlägg: 330
Blev medlem: 15 december 2003, 13:41:25
Ort: Göteborg

avr-gcc assembler och c tillsammans (ganska lång)

Inlägg av Rymdninja »

Hejsan.

Försöker få ihop ett program bestående av en .c fil och en .S (assembler fil) med avr-gcc (mega8515 device)

Min .S fil ser ut så här

Kod: Markera allt

.global charA

.section .data
	
charA:
	.byte 0b00100
	.byte 0b01010
	.byte 0b10001
	.byte 0b10001
	.byte 0b01110
	.byte 0b10001
	.byte 0b10001

och jag vill komma år charA från min c fil så jag gör såhär:

Kod: Markera allt


extern char charA;

int main()
{
//massa blaj
c = eeprom_read_byte(charA);

}

Vidare när jag kompilerar så skapar jag 2 .hex filer. En av själva koden och en av assembler filen. Koden läggar jag så klart i flash och den andra i eepromet.
Men det här funkar inte. Det är charA som inte får rätt värde. Det funkar om jag inspekterar eepromminnet och får fram addressen "manuellt" sas. och hårdkodar in den i c koden, men inte annars.

Så...frågan är alltså. Vad ska man göra för att det ska fungera som jag vill? Antar att det har något med länkningen att göra, men jag vet inte vad...

(skickar med makefilen också :) )

Kod: Markera allt

	avr-gcc -O -mmcu=atmega8515 -c blah.c -o blah.o
	avr-gcc -O -mmcu=atmega8515 -c characters.S -o characters.o 
	avr-gcc -mmcu=atmega8515 -o blah.hex blah.o characters.o
	avr-objcopy -j .text -O ihex blah.hex out.hex
	avr-objcopy -j .data -O ihex blah.hex characters.hex
Hoppas att någon kan hjälpa mig lite här...

Peace
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

En del kompilers ger variabelnamnen en underscore under compileringen till assembler. Testa därför att namnge "CharA" som "_CharA".

Det kanske fungerar, kanske inte men det kan vara värd att testa.
Användarvisningsbild
axelsonic
EF Sponsor
Inlägg: 709
Blev medlem: 8 juni 2003, 20:56:03
Ort: Stockholm

Inlägg av axelsonic »

Om du blandar assembler med C/C++-kod måste du inte skriva "inline asm { //kod här } //ingen mer asm.-kod"

Eller har jag missförstått alles nu ?
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

"inline" betyder i C-världen att koden som följer inte ska utföras som ett kall men "bakas in" när den används (ung. som ett makro) och används ofta i tidskritiska sammanhang där man vill undvika upprepande "call & return"overhead.

Man kan i en hel del kompilers skriva:

Kod: Markera allt

asm
  {
  ; Här lägger man in assemblerinstruktionerna
  }
men den exakta syntax beror på kompilern.

Likaså med att använda samma namn i assembler och C, om det är möjligt kan man kolla ASM-filen som görs av kompilern och se hur namnen "manglas" från C till ASM, ofta är det bara en '_' som läggs till före.
Användarvisningsbild
Melker
Inlägg: 410
Blev medlem: 26 maj 2003, 22:17:34
Ort: Umeå

Inlägg av Melker »

inline asm är om man ska skriva in asm mitt i C-koden, det är väl inte fallet här?

Rymdninja, länkaren vet inget om att CharA ska ligga i eeprom:et, utan räknar med att den kommer ligga i RAM:et, bland andra variabler, skulle jag tro iaf.

Kan du inte bara fylla i värdena du vill skriva till eeprom via en hexeditor (börja på adress 0) och sedan bara peka dit med en eeprom-pekare (om det finns något sånnt, kolla libc-dokumentationen), för det där du skrivit i asm är väl bara en tabell med värden?
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

När väl linkeren vet om vilka värden som det syftas till kommer den att veta var den ska peka utan problem, vara sig att värdet ligger i EEPROM, RAM eller programminne!

Problemet är att linkeren inte kan koppla ihop namnen från C till namnen i ASM.

Det kan alltså löna sig att kolla upp hur namnen översätts med första steg i kompileringen, som sagt förut brukar en del kompilers att sätta en underscore framför namnen under kompileringen till ASM (OBJ). Därför måste namnet i ASM-bite ändras likadan och sedan kommer det att köra.

Vad som förvånar mig är att du tydligen inte får en fel med att den externa variabel inte kan lokaliseras, den borde komma under något steg av processen, sannolikt linkerens.

Eller är det så att du struntar i det fel?
Rymdninja
Inlägg: 330
Blev medlem: 15 december 2003, 13:41:25
Ort: Göteborg

Inlägg av Rymdninja »

När jag kollar symboltabellen i characters.o så heter symbolerna charA, iaf om jag tolkar det hela rätt, så det verkar inte vara något konstigt med namnet. Namnet i c-filen ändras inte heller....

Melker> Jag tror att direktivet .section .data gör att länkaren vet att det ska hamna i eeprom.

Visst skulle jag kunna hårdkoda addresserna, men det är en ganska trögprocess, speciellt under utvecklingsfasen så jag skulle verkligen heller lösa det här problemet....

tack för alla svar :)

EDIT: jag kansk är helt fel ute när jag säger att .section .data gör att det hamnar i eeprom. enligt avr-as.info så är .data och .text sectionerna samma......hmmm....mystiken tätnar ;)
Senast redigerad av Rymdninja 8 juni 2005, 16:51:42, redigerad totalt 1 gång.
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Testa i alla fall att ändra till
.global _charA
i din .S-fil.

jag förstår i övrigt inte varför du inte inkluderar den snudd assembler i C-projektet direkt men jag känner inte AVR-GCC heller.
Rymdninja
Inlägg: 330
Blev medlem: 15 december 2003, 13:41:25
Ort: Göteborg

Inlägg av Rymdninja »

Det var bara en liten del av .S filen jag klippte in, det är en teckentabell till ledmatriser, och jag är lite för lat för att göra om den. Speciellt eftersom inte gcc tycker om 0b010110 formatet på konstanter... :/

Hur som helst ingen tur med namnet heller.
Verkar som om jag måste ha ett annat direktiv för att sätta data i eeprom. Jag har hittat det för c men inte för asm...


peace
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Har du inget programmeringsspråk till din PC? Det är snabbt gjort att greja ett program som söker ut alla 0bxxxx och gör om dom till 0x...

Men varför?

Du kan ju inkludera det som en include-fil antar jag, mata in lite
asm {
och
} i .S-filen och sedan är det klart.
Rymdninja
Inlägg: 330
Blev medlem: 15 december 2003, 13:41:25
Ort: Göteborg

Inlägg av Rymdninja »

jo visst kan man göra så, men då är det lätter att ha det som det är. Första tecknet på address 0 osv....inget mera fuss...jag tar den enkla vägen ut nu....

jaja
tack för all hjälp iaf
Skriv svar