Forum: Mikrocontroller und Digitale Elektronik AT91SAM7S256 USB / VirtualCOM


von Luky S. (luky)


Angehängte Dateien:

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?

von Martin T. (mthomas) (Moderator) Benutzerseite


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

von Luky S. (luky)


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]

von Luky S. (luky)


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.

von Martin Thomas (Gast)


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

von Luky S. (luky)


Lesenswert?

Super!
Danke!
Jetzt läufts wunderbar!
Du solltest ein Buch über ARM-Programmierung schreiben...

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.