Forum: Mikrocontroller und Digitale Elektronik GPIO Zugriff bei ARM9 nicht schnell genug


von Der T. (soundso)


Lesenswert?

Zum testen ob mein ARM9 (str912, programmiert mit Embedded Workbench 5) 
wirklich mit PLL auf 96 MHz läuft habe ich einfach eine Endlosschleife 
geschrieben, die nur einen GPIO-Pin toggeln läßt. Obwohl er beim Start 
laut Debugger durch die PLL-Initialisierung läuft im Startup.s), messe 
ich nun am Ausgang gerade mal o,8-1us zwischen den Pegelwechsel. Da der 
ARM doch mit einem CPU-Zyclus auf die GPIO schreiben können sollte und 
eine Schleife, eine Ausgabe und eine Invertierung doch auch in Assembler 
nicht mehr als drei Befehle sein sollte, kann ich das irgendwie nicht 
nachvollziehen! Müßte das nicht irgendwo die dreifache Geschwindigkeit 
sein? Hatte zwischendrin auch immer mal Probleme das er beim 
Programmstart in der PLL_Lock Schleife hing, und nach ein paar resets 
wars wieder ok, keine Ahnung ob da ein Zusammenhang besteht... Im 
Endeffekt will ich mit meiner Anwendung ein Signal abtasten, und da ist 
es natürlich entscheident zu wissen wie schnell ich die Werte abfragen 
kann. Hoffe es kann mit diesen Phänomenen jemand was anfangen. Danke 
euch!

von Andreas K. (a-k)


Lesenswert?

Der Thomas wrote:

> Da der ARM doch mit einem CPU-Zyclus auf die GPIO
> schreiben können sollte

Warum sollte er das können? Beim STR9 hängen die Ports an einem der eher 
langsamen Peripheriebusse. Wobei man an den diversen Busbridges auch ein 
bischen rumkonfigurieren kann.

Wenn du schneller Pin-I/O benötigst, bist du mit neueren LPC2000 besser 
dran. Da hängt die Fast-I/O am schnellen Bus.

von Der T. (soundso)


Lesenswert?

Ich habe irgendwas im Hitex Guide gelesen, das durch die zusätzlichen DR 
ja keine zusätzliche maskierung mehr nötig ist beim Schreiben in die 
Register, das hab ich wohl irgendwie durcheinander geworfen. Kannst du 
mir ein paar Tipps geben, wie ich das Optimum raushole? Wäre mir sehr, 
sehr hilfreich. Und wie gesagt, im Endeffekt muss ich schnell lesen, 
weniger schreiben...

von Andreas K. (a-k)


Lesenswert?

Erstens ist, wie du schon erwähnst, üblicherweise kein read-modify-write 
nötig, da in der Adresse eine Maske mitgegeben werden kann.

Wenn du darüber hinaus maximale Leistung rauskitzeln willst, kann es 
nötig sein, die entsprechende Doku reinzuziehen. Da gibt's so einiges, 
nicht nur von ST sondern insbesondere auch von ARM, aber dieses Thema 
ist nicht wirklich trivial.

Das fängt damit an, dass die Peripheriebusse ab Reset mit halben Takt 
(HCLK) arbeiten. Was nicht sein muss. Aber was dein Startup-Code da 
anstellt musst du selber rauskriegen.

Und geht dann weiter mit dem Bus Split. Wobei ich nicht weiss ob der bei 
GPIO relevant ist, aber wenn, dann ist dieser Parameter der zuständigen 
AHB Bridge die nächste Stellschraube weil ein Split zwar effiziente 
Busausnutzung ermöglicht, aber mindestens Lesezugriffe leicht ausbremsen 
kann.

Was schnelle Schreibzugriffe angeht, ist dann Lektüre der Dokumentation 
des ARM verwendeten Cores wichtig (ARM966E-S, kriegt man bei arm.com), 
denn darin ist die BIU nebst ihrer Pufferung beschrieben. Spielt aber 
bei reinen Lesezugriffen nicht so die grosse Rolle.

Einen Eindruck von Arbeitsweise und Zeitverhalten der AHB Bridge 
vermittelt die AMBA Spezifikation (auch arm.com, IHI0011A).

von Andreas K. (a-k)


Lesenswert?

Wenn es dir nur darum geht, rauszufinden wie schnell das Teil ist, dann 
ist schnelle Port-I/O der falsche Weg. Dann machst du ganz gemütliche 
Port-I/O mit einer wohldefinierte längeren Wartezeit dazwischen. Und 
schon spielen AHB&Co kaum noch eine Rolle.

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.