mikrocontroller.net

Forum: Compiler & IDEs USB AVR Buffer Alignment


Autor: Marten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin gerade dabei die USB Firmware von 
http://www.obdev.at/products/avrusb/index.html
zum laufen zu bringen.
Soweit funktioniert es auch ganz gut. Allerdings wenn ich jetzt versuche 
weiteren SourceCode zum laufen zu bringen, erkennt der Host das Gerät 
nicht mehr.
In der Dokumentation steht:

You should link the usbdrv.o module first because it has special 
alignment
requirements for the receive buffer (the buffer must not cross a 256 
byte
page boundary, it must not even touch it at the end). If you can't link 
it
first, you must use other measures to ensure alignment.

Wie kann ich erreichen das der Treiber zuerst gelinkt wird?

Ich benutze als Controller den ATMega8 und als Entwicklungsumgebung 
WinAvr.

Marten

Autor: Joe Die (kosmonaut_pirx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
das problem ist nicht, dass zuerst gelinkt werden muss, sondern dass der 
receive-buffer keine page-boundary berührt.

nach dem von dir zitierten text steht doch die lösung schon dort:
"You can choose a memory section for
the receive buffer with the configuration option "USB_BUFFER_SECTION". 
This
option defaults to ".bss". If you use your own section, you can place it 
at
an arbitrary location with a linker option similar to
"-Wl,--section-start=.mybuffer=0x800060"."

Autor: Marten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für deine Antwort!

Ich nutze MFile um mir ein Makefile zu erzeugen. Wo genau muss ich da 
diese Linkeroption einfügen?

Autor: Joe Die (kosmonaut_pirx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kein plan, verwende MFile nicht.

hab' eben mal reingeschaut. die LDFLAGS werden da so lustig 
zusammengesetzt.
vorschlag meinerseits:

EXTMEMOPTS = -Wl,--section-start=.mybuffer=0x800060

die section kannst ja nennen wie du willst, und bei der adresse musst du 
halt aufpassen, einer page boundary nicht zu nahe zu kommen. aber das 
steht ja in dem usbdrv.h schön erklärt.

vll hilfts
bye kosmo

Autor: Marten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also habs mal mit extmemopts probierts .. compiliert wirds.

allerdings hab ich nicht so richtig die ahnung wie ich die richtige 
adresse bekomme.

avr-nm -n main.cof

zeigt mir das usbRxBuf bei 00000294 liegt .. wie kann ich mir da jetzt 
eine korrekte adresse basteln?

nur mal zum Verständnis: damit will man erreichen das der Buffer nicht 
in 2 Pages liegt wegen geschwindigkeits problem?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kannst du nicht einfach das USB-Teil als erstes in der Liste der
C-Dateien angeben?  Dann wird es auch als erstes gelinkt.

Autor: Marten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das hab ich auch schon probiert. funktioniert leider nicht .. in der 
doku des usbtreibers steht dazu:

Note: gcc does not always assign variable addresses in the order as the 
modules are linked or the variables are declared.

Autor: Joe Die (kosmonaut_pirx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vll ist das der way-to-go. schön ist was anderes, imho :)

also nochmal zu dem, was in der usbdrv.h steht:
"You should link the usbdrv.o module first because it has special 
alignment
requirements for the receive buffer (the buffer must not cross a 256 
byte
page boundary, it must not even touch it at the end). "
[...]
"Use "avr-nm -ng" on the binary and
search for "usbRxBuf" to find tbe base address of the 22 bytes rx 
buffer."

das hast du offensichtlich gemacht. und 22 byte in einer 256er page, da 
ist viel platz links und rechts. such' dir irgendwas aus, meinethalben 
bei 0x80 oder 0x180 oder 0x280 usw. so um die mitte rum. die gewünschte 
section
darauf setzen (-Wl,--section-start=.mybuffer=0x80 für das beispiel)
btw, wenn mit '00000294' hexa gemeint ist, also 0x00000294, sollte es 
schon passen, denke ich.

wozu das gemacht wird? keine ahnung, ich lese nur das, was da steht. 
ob's funktioniert, musst du beurteilen (ach ja, das lesen sollte 
eigentlich auch dein job sein :)

Autor: Marten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also danke Joe .... ich habs hinbekommen :)
myBuf@0x0000080 scheint zu funktionieren .. nun kann ich auch eignen 
code hinzufügen ohne das es denn buffer verschiebt!

Autor: kosmonaut pirx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schön schön :)

die frage nach dem warum beantwortet glaube ich die datei usbdrv.S
im prinzip wird ein char für einen index in den usbRxBuf benutzt, und 
zugleich für das niedere byte der bufferadresse. dann macht es sich 
schlecht, wenn beim holen der daten zwischendurch das obere byte der 
adresse wechselt, dann funktioniert der index nicht mehr.

jdf. soweit ich das verstanden habe. aber anyway, hauptsache es funzt.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.