AT91SAM7S256 USB / VirtualCOM

OP #750856
Lesenswert?

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?
Angehängte Dateien:
Moderator Persönliche Seite #750924
Lesenswert?

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
OP #750949
Lesenswert?

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]
OP #762737
Lesenswert?

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.
Gast #763021
Lesenswert?

".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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren