SAM3x8e unverhältnismäßig langsam

Gast #3967167
Lesenswert?
• ▲
▼
Hallo zusammen.

Habe gerade ein etwas mit meinem Arduino Due gespielt. (SAM3x8e 
Controller, getaktet auf 84MHz). Programmiert wird der Controller in C.

Ich wollte ein PWM-Signal (2MHz) auf eine gewisse Anzahl an Pulsen 
begrenzen. Also nach jeder PWM-Periode einen Interrupt generieren, eine 
Variable hochzählen und ab einer gewissen Anzahl das PWM-Modul 
deaktivieren.

Der Ansatz funktioniert für Frequenzen von wenigen KHz super. Bei 2Mhz 
überspringt er mir jedoch immer einen Puls. Also bei gewünschten 8 
Pulsen, wird erst nach 9 deaktiviert usw. (Und ja, man könnte ja auch 
einfach immer auf einen Zählschritt weniger abfragen, is jedoch 
unbrauchbar wenn man nur einen Puls will!!!)

Ich habe das Problem jetzt bereits anderweitig gelöst (über einen 
weiteren Timer), also benötige ich keine Lösung mehr für mein Problem. 
Jedoch stellt sich bei mir schon die Frage ob dass normal ist. Verlange 
ich vielleicht zu viel von dem Controller, oder liegt ein Anwenderfehler 
meinerseits vor...

Ich meine 2MHz, bei einer Taktfrequenz von 84MHz. Also 1/42'tel der 
Prozessortaktfrequenz...Klar pro Befehl braucht der Controller mehrere 
Schritte (fetch, decode, execude, writeback). Aber ein 
ARM-Microcontroller macht doch sicher schon Pipelining. Und selbst wenn 
nicht, könnte ich theoretisch bei 2MHz - PWM - Periode bis zu 10 Befehle 
zwischen den Perioden abarbeiten.

Hat jemand eine Idee woran es liegen könnte? Muss man bei 
ARM-Controllern noch irgend eine Optimierung einstellen? Oder hat jemand 
schon das selbe Problem gehabt?


Mit freundlichen Grüßen

Stefan


PS: Ja der Controller ist wirklich mit 84MHz getaktet, ich habe schon 
die Eingänge toggeln lassen und auf dem Oszi angeschaut
Gast #3967188
Lesenswert?
• ▲
▼
Stimmt das mit dem Interrupt hab ich zeitlich nicht bedacht. Ja DMA ist 
bereits getestet worden, hat auch super funktioniert.

Aber dann müsste doch das Pollen des Interruptflags ohne Ausführen des 
Interrupt um einiges schneller sein oder...
Ist es leider auch nicht :/
Gast #3967200
Lesenswert?
• ▲
▼
Danke, das probier ich morgen gleich mal aus. Muss ich mich nur in die 
CMSIS-Lib einlesen. Benutze den ganzen Startup-Code von dort. Bin mir 
allerdings gar nicht sicher ob die nicht eh den Code schon im SRAM 
ablegt
Persönliche Seite #3967206
Lesenswert?
• ▲
▼
Solltest dich vielleicht mit der Direkten Programmierung der Register 
auseinandersetzen.
Die CMSIS-Bib ist ja schön und gut, aber ziemlich überladen.

Ich denke aber der Cortex ist nicht die Richtig Plattform für dich.
Du mußt einen schnelleren nehmen oder eine andere Plattform so ala CPLD 
z.b. oder FPGA.

Oder vielleicht ein alter Atmel SAM7 mit viel Takt.
Der hat intern die Schattenregister für den Fastinterrupt und Stacking 
hat der auch nicht.
Gast #3967218
Lesenswert?
• ▲
▼
Ja ich programmiere schon registerbasiert. Allerdings ist es doch recht 
bequem den startup-code und das linkerscript etc schon fertig zu haben. 
UND die ganzen registeraddressen :D. Ja ein FPGA liegt schon neben mir. 
Da stehe ich jedoch mit meinen programmierkenntnissen noch in den 
kinderschuhen :/

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.