Forum: Mikrocontroller und Digitale Elektronik doppelte deklaration einer funktion


von C. H. (hedie)


Lesenswert?

Guten Abend

Ich bin derzeit daran, die Helix MP3 Lib auf meinem STM32 zum laufen zu 
kriegen.

Dazu habe ich mir folgenden Sourcecode geholt:
http://www.stm32circle.com/projects/project.php?id=82

Dort ist der Assembler spezifische Teil bereits an den Thumb2 Code des 
Cortex-M3 angepasst worden.

Doch nun motzt mein Compiler bzw. meine Umgebung dass etwas doppelt 
definiert worden sei. (Umgebung attolic True Studio 3.0)

Hier die Zeilen in der Datei asmpoly_thumb2.s:
1
/*; void PolyphaseMono(short *pcm, int *vbuf, const int *coefBase)*/
2
3
.global xmp3_PolyphaseMono
4
.thumb_func 
5
    xmp3_PolyphaseMono: <------ Hier motzt er. 
6
    
7
8
    stmfd    sp!, {r4-r11, r14}
9
    
10
    /*; clear out stack space for 4 local variables (4 bytes each)*/
11
    sub        sp, sp, #8
12
    str        PCM, [sp, #4]            /*; sp[1] = pcm pointer*/

Ändere ich die markierte Zeile z.B. in xmp3_PolyphaseMono1 hat er kein 
problem. Oder wenn ich die obige .global Zeile entferne klappts auch.

Aber diese sollte ich ja nicht entfernen.

Hier mein Compiler aufruf:
1
arm-atollic-eabi-gcc -c -mthumb -mcpu=cortex-m3 -DHSE_VALUE=8000000 -g -Wa,--warn -x assembler-with-cpp -o ..\src\real\arm\asmpoly_thumb2.s  
2
-lm -o STM32F105RB_SDCARD.elf -mthumb -mcpu=cortex-m3 -T..\stm32_flash.ld -static -Wl,-cref,-u,Reset_Handler -Wl,-Map=STM32F105RB_SDCARD.map -Wl,--gc-sections -Wl,--defsym=malloc_getpagesize_P=0x1000

hat jemand eine idee woran das liegen könnte?

Ich bin leider mehr der c experte...

danke schonmal

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Hä? was soll ds?

Claudio Hediger schrieb:

> -o ..\src\real\arm\asmpoly_thumb2.s
> -o STM32F105RB_SDCARD.elf

von C. H. (hedie)


Lesenswert?

Johann L. schrieb:
>> -o ..\src\real\arm\asmpoly_thumb2.s
>> -o STM32F105RB_SDCARD.elf

Upps da ist mir wohl ein CopyPaste fehler passiert...

Es sieht so aus:

1
 
2
arm-atollic-eabi-gcc (..noch mehr includes..) src\real\arm\asmpoly_thumb2.o src\real\arm\asmmisc.o  
3
-lm -o STM32F105RB_SDCARD.elf -mthumb -mcpu=cortex-m3 -T..\stm32_flash.ld 
4
-static -Wl,-cref,-u,Reset_Handler -Wl,-Map=STM32F105RB_SDCARD.map -Wl,--gc-sections 
5
Wl,--defsym=malloc_getpagesize_P=0x1000

Kann es sein, dass ich etwas nicht richtig in den Optionen eingestellt 
habe?

von Andreas B. (andreas_b77)


Lesenswert?

Ich tippe mal auf einen Fehler in der STM32F105RB_SDCARD.map, falls das 
Symbol nicht tatsächlich doppelt definiert ist.

Edit: Schmarrn, ich meinte das Linkerscript, nicht die Map-Datei.

von C. H. (hedie)


Lesenswert?

Andreas B. schrieb:
> Ich tippe mal auf einen Fehler in der STM32F105RB_SDCARD.map, falls das
> Symbol nicht tatsächlich doppelt definiert ist.

Vielen Dank Andreas für deinen Hinweis.

Leider ist es für mich das erste mal, bei dem ich mich in den Compiler 
vertiefe.

Deshalb wäre ich froh, wenn du mir etwas genauer erklärst wie ich weiter 
vorgehen soll.

Danke :)

von Andreas B. (andreas_b77)


Lesenswert?

Tja, entweder ist das Symbol tatsächlich doppelt vorhanden (mal eine 
Textsuche über den Source-Code machen) oder die Objektdatei mit dem 
Symbol wird doppelt reingelinkt. Deshalb als Möglichkeit eben auch das 
Linker-Script stm32_flash.ld.

Aber ohne irgendwelche Sourcen und Skripte sehen zu können bleibt nur 
das Raten.

Ach Moment, den Link habe ich übersehen… Ich schau mal schnell.

Nö, kann man nur mit Login runterladen. Den Aufwand mache ich mir jetzt 
nicht.

von C. H. (hedie)


Angehängte Dateien:

Lesenswert?

Andreas B. schrieb:
> Aber ohne irgendwelche Sourcen und Skripte sehen zu können bleibt nur
> das Raten.

Ich stelle gerne die gesamten Sourcen zur Verfügung...


Noch einen Hinweis...

Es gibt in der Datei polyphase.c folgende funktion:
1
void PolyphaseMono(short *pcm, int *vbuf, const int *coefBase)
2
{  
3
  int i;
4
  const int *coef;
5
  int *vb1;
6
  int vLo, vHi, c1, c2;
7
  Word64 sum1L, sum2L, rndVal;
8
9
  rndVal = (Word64)( 1 << (DEF_NFRACBITS - 1 + (32 - CSHIFT)) );
10
11
  /* special case, output sample 0 */
12
  coef = coefBase;
13
  vb1 = vbuf;
14
  sum1L = rndVal;
15
16
  MC0M(0)
17
  MC0M(1)
18
  MC0M(2)
19
  MC0M(3)
20
(..... mehr code...)


Wenn ich mit der Maus über den Funktionsnamen gehe, sagt mir Attolic, 
dass es sich hierbei um ein Macroexpansion von xmp3_PolyphaseMono 
handelt...


Anbei noch die Sourcen

Andreas B. schrieb:
> Ich schau mal schnell.
>
> Nö, kann man nur mit Login runterladen. Den Aufwand mache ich mir jetzt
> nicht.

Freut mich dass du mir hilfst :) (nicht ironisch gemeint!)
Anbei deshalb die Sourcen

von C. H. (hedie)


Angehängte Dateien:

Lesenswert?

es gab bei diesen Sourcen ursprünglich noch die Angehängten Asm files.

Diese habe ich jedoch entfernt, da diese keinen Thumb2 Code enthielten 
und somit eh nicht übersetzt werden konnten.

von Andreas B. (andreas_b77)


Lesenswert?

Claudio Hediger schrieb:
> Wenn ich mit der Maus über den Funktionsnamen gehe, sagt mir Attolic,
> dass es sich hierbei um ein Macroexpansion von xmp3_PolyphaseMono
> handelt...

So scheint es auch zu sein. Es gibt offensichtlich eine C 
Implementierung und eine handoptimierte in Assembler. Es dürfen 
natürlich nicht beide reingelinkt werden.

Bleibt die Frage, wie es übersetzt wird? Und woher kommt das 
Linker-Script? Das ist alles nicht im Programmarchiv zu finden.

von C. H. (hedie)


Angehängte Dateien:

Lesenswert?

Andreas B. schrieb:
> Bleibt die Frage, wie es übersetzt wird? Und woher kommt das
> Linker-Script? Das ist alles nicht im Programmarchiv zu finden.

Ich habe ein das ld file gefunden...

Anbei das verwendete LD File


Dieses habe ich nicht mitkopiert, da es sich im Ordner des AttolicTrue 
Studios befindet

Also, die angehängte LD-Datei ist jene welche ich verwendet habe.

Im MP3-Full.zip befindet sich der Ordner vom Beispiel Projket (obiger 
link) 1:1

Dort gibt es ebenfalls ein linker script... Was hier der unterschied ist 
weiss ich nicht (noch nicht :) )

von Andreas B. (andreas_b77)


Lesenswert?

Ich bleibe mal bei der Vermutung, dass sowohl die polyphase.c als auch 
die Assembler-Implementierung der selben Funktion gelinkt werden. Du 
musst darauf achten, dass polyphase.c nicht mitübersetzt wird, mehr kann 
ich auch nicht finden.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Claudio Hediger schrieb:

> Doch nun motzt mein Compiler bzw. meine Umgebung dass etwas doppelt
> definiert worden sei. (Umgebung attolic True Studio 3.0)
>
> Hier die Zeilen in der Datei asmpoly_thumb2.s:
>
> /*; void PolyphaseMono(short *pcm, int *vbuf, const int *coefBase)*/
>
> .global xmp3_PolyphaseMono
> .thumb_func
>     xmp3_PolyphaseMono: <------ Hier motzt er.

Und wie sieht die komplette Fehlermeldung aus, d.h. die Ausgabe zusammen 
mit mit -v?

Technisch meckert nicht der Compiler, weil es es Assembler-Code ist :-)

Es meckert also der Assembler oder der Linker.

Ist es der Linker, hast du das Ding in mehreren Modulen.

Ist es der Assembler, hast du das Label mehrfach in einem Modul, der 
Fehler ist i.d.R. Falsche Anwendung von .macro und/oder Inline-Assembler 
im Zusammenhang mit Label-Generierung.

von C. H. (hedie)


Lesenswert?

Andreas B. schrieb:
> Ich bleibe mal bei der Vermutung, dass sowohl die polyphase.c als auch
> die Assembler-Implementierung der selben Funktion gelinkt werden. Du
> musst darauf achten, dass polyphase.c nicht mitübersetzt wird, mehr kann
> ich auch nicht finden.

Da hattest du recht...

Ich habe die Funktion in polyphase.c auskommentiert und schwups konnte 
ich es übersetzen...

Danke euch allen für eure Hilfe!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.