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
Hä? was soll ds?
Claudio Hediger schrieb:
> -o ..\src\real\arm\asmpoly_thumb2.s
> -o STM32F105RB_SDCARD.elf
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?
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.
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 :)
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.
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
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.
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.
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 :) )
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.
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.
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.
|