Sida 1 av 1
avr-gcc assembler och c tillsammans (ganska lång)
Postat: 7 juni 2005, 19:56:02
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
Postat: 7 juni 2005, 21:19:32
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.
Postat: 8 juni 2005, 09:35:39
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 ?
Postat: 8 juni 2005, 09:59:21
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.
Postat: 8 juni 2005, 10:43:44
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?
Postat: 8 juni 2005, 11:35:06
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?
Postat: 8 juni 2005, 16:40:21
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

Postat: 8 juni 2005, 16:50:57
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.
Postat: 8 juni 2005, 17:07:27
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
Postat: 8 juni 2005, 20:21:04
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.
Postat: 8 juni 2005, 22:34:57
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