Forum: Compiler & IDEs USB AVR Buffer Alignment


von Marten (Gast)


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

von Joe D. (kosmonaut_pirx)


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

von Marten (Gast)


Lesenswert?

Danke für deine Antwort!

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

von Joe D. (kosmonaut_pirx)


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

von Marten (Gast)


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?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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

von Marten (Gast)


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.

von Joe D. (kosmonaut_pirx)


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 :)

von Marten (Gast)


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!

von kosmonaut pirx (Gast)


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.

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.