Ich muss 4096 Messwerte zu je 16Bit von einem AT91SAM7S zum PC schicken. Ich habe mir dabei mal die VirtualCOM Demo von http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/index_at91.html#at91_usb1 angesehen und angepasst. Die Anmeldung an den PC klappt auch wunderbar, aber manchmal kommt die Ordnung der Messwerte durcheinander oder es werden gar Werte verschluckt. Mehrere Terminalprogramme zeigen dasselbe Verhalten, also dürfte es nicht auf der PC- Seite fehlen. Ich habe das Mikrocontrollerprogramm auf ein Minimum reduziert und angehängt. Kann mir bitte jemand einen Tipp geben?
Mein gcc Anpassung beruht noch auf einem recht alten Code von Atmel. Kann durchaus sein, dass da noch ein paar Unzulänglichkeiten drin sind. Inzwischen stellt Atmel eine neue Codesammlung bereit (AT91SAM7S software package), in der auch ein CDC Beispiel enthalten ist, das augenscheinliche auf dem AT91 USB-Framework beruht. Die Sammlung enthält neben den Einstellungen/Anpassungen für die IAR tools auch schon Anpassungen für ARM GNU toolchain. Vielleicht hilft's: http://www.atmel.com/dyn/products/tools_card.asp?tool_id=4227 Martin Thomas
Danke für den Hinweis! Ich habe mir nur das AT91 USB Framework - Core 1.02 + CDC 1.0 angesehen und das ist nix für GCC Ich habe das Projekt (usb-device-cdc-serial-project-1.1-at91sam7s-ek) jetzt mal in Yagarto (neueste Version) importiert, werde aber die folgenden Fehler einfach nicht los... boards/at91sam7s-ek/board_cstartup.S:101: Error: internal_relocation (type: OFFSET_IMM) not fixed up boards/at91sam7s-ek/board_cstartup.S:102: Error: internal_relocation (type: OFFSET_IMM) not fixed up ldr lr, =AT91C_BASE_AIC 101 ldr r0, [r14, #AIC_IVR] 102 str lr, [r14, #AIC_IVR] boards/at91sam7s-ek/board_cstartup.S:114: Error: internal_relocation (type: OFFSET_IMM) not fixed up ldr lr, =AT91C_BASE_AIC 114 str lr, [r14, #AIC_EOICR]
Ich habe jetzt das usb-device-cdc-serial-project-1.1-at91sam7s-ek erfolgreich zum laufen gebracht, habe aber noch ein Problem: Ich bekomme keine Routinen ins RAM um sie von dort schneller auszuführen: #define _ramfunc __attribute_ ((long_call, section (".fastrun"))) __ramfunc void Testroutine(void) { //Tue was } produziert beim Kompilieren folgenden Fehler: c:/programme/yagarto/bin/../lib/gcc/arm-elf/4.2.2/../../../../arm-elf/bi n/ld.exe: section .fastrun [00102498 -> 001024ef] overlaps section .relocate [00102498 -> 00102547] collect2: ld returned 1 exit status Wie kann ich die Routine in einen anderen bereich mappen? RAM ist noch genügend frei.
".fastrun" ist keine vordefinierte Section und muss entsprechend verarbeitet werden. Im Linker-Scipt in der Art:
1 | .data : AT (_etext) |
2 | { |
3 | _data = . ; |
4 | KEEP(*(.vectmapped)) |
5 | . = ALIGN(4); |
6 | *(.fastrun .fastrun.*) /* <--- */ |
7 | . = ALIGN(4); |
8 | SORT(CONSTRUCTORS) |
9 | . = ALIGN(4); |
10 | *(.data) |
11 | *(.data.*) |
12 | *(.gnu.linkonce.d.*) |
13 | . = ALIGN(4); |
14 | } >DATA |
Kopieren des Codes vom ROM LMA to RAM VMA erfolgt dann mit der Kopie von initialisierten Variablen. Alternativ kann man auch dies versuchen, spart Modifikation des Linker-Scripts, könnte aber u.U. Probleme mit alignments geben:
1 | #define _ramfunc __attribute_ ((long_call, section (".data")))
|
Hoffe, es hilft Martin Thomas
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.