C++ Codeblock soll eine bestimmte Zeit brauchen

Moderator Persönliche Seite #4362717
Lesenswert?

blaudimau schrieb:
> weiß jemand von euch wie man in Atmel Studio 7 festlegen kann, wie lange
> (Zeit oder Cycles) ein Codeblock dauern soll, so dass der Compiler die
> fehlende Zeit mit NOPs auffüllt?

Ich wüsste nicht, dass irgendein Compiler dies könnte oder tun würde.

Man  kann es so lösen:

    - Zu Beginn des Codeblocks einen Timer starten
    - Am Ende des Codeblocks den Timer pollen, bis Sollwert erreicht
Gast #4362726
Lesenswert?

Es geht leider genau darum nach Möglichkeit keine Timer zu verschwenden 
:/
Wenn das kein Compiler kann, dann wohl saurer Apfel und Laufzeit messen 
und NOPs manuell einfügen...
Falls niemand sonst eine Idee hat ;)
Gast #4362728
Lesenswert?

blaudimau schrieb:
> Es geht leider genau darum nach Möglichkeit keine Timer zu verschwenden
> :/
> Wenn das kein Compiler kann, dann wohl saurer Apfel und Laufzeit messen
> und NOPs manuell einfügen...
> Falls niemand sonst eine Idee hat ;)

Und eine Schleife bauen, in welcher sich ein NOP befindet? Die 
benötigten Schleifendurchläufe vorher ausrechnen...
Gast #4362737
Lesenswert?

Abgesehen davon, was heißt "Timer verschwenden"? Meist hat man doch 
sowieso einen Timer laufen. Der kann das nebenher mit machen. Er muß 
doch nicht nur eine Aufgabe bekommen bzw. man muß nicht für jede Aufgabe 
einen separaten Timer nutzen.
Gast #4362739
Lesenswert?

blaudimau schrieb:
> Es geht leider genau darum nach Möglichkeit keine Timer zu verschwenden
> :/
> Wenn das kein Compiler kann, dann wohl saurer Apfel und Laufzeit messen
> und NOPs manuell einfügen...
> Falls niemand sonst eine Idee hat ;)

Wenn eh ein Timer läuft, kannst du dir ja den Wert errechnen und dann 
warten bis der Timer den Wert erreicht hat.
Gast #4362911
Lesenswert?

Und was ist wenn der Prozessor bei jedem Durchlauf unterschiedlich lange 
braucht aufgrund vom Zustand der Pipeline, Cache, Bus-Auslastung usw.? 
Dann funktioniert Takte zählen und NOP's einfügen nicht...
Gast #4362969
Lesenswert?

Mark B. schrieb:
> Gegenfrage: Warum sollte man das wollen? Bzw. welches Problem willst Du
> eigentlich lösen?


Es geht um eine Bibliothek die Pakete über eine Busleitung verschick. 
Die Bibliothek soll demnach so wenig Hardware Ressourcen "verschwenden" 
wie möglich, damit die für das Drumherum noch zur Verfügung stehen.
Da das Senden und Empfangen über einen Interrupt läuft, macht es bei den 
kurzen Zeiten keinen Sinn, den Interrupt wieder zu verlassen (4 Cycles 
hin, 4 wieder zurück...), deshalb ist auch ein Timer relativ nutzlos, 
weil der max. 5 Cycles zählt bevor er wieder auslösen muss.

Programmierer schrieb:
> Und was ist wenn der Prozessor bei jedem Durchlauf unterschiedlich lange
> braucht

Mir wäre nicht bekannt, dass ein 8-Bit AVR im Hintergrund andere Sachen 
treibt, die sich außerhalb von dem Bewegen, was in der Instruction Set 
Summary aufgelistet ist. Wenn doch lass ich mich natürlich gerne eines 
besseren belehren ;)
Gast #4363000
Lesenswert?

blaudimau schrieb:

1)
> Die Bibliothek soll demnach so wenig Hardware Ressourcen "verschwenden"
> wie möglich, damit die für das Drumherum noch zur Verfügung stehen.

2)
> Da das Senden und Empfangen über einen Interrupt läuft, macht es bei den
> kurzen Zeiten keinen Sinn, den Interrupt wieder zu verlassen (4 Cycles
> hin, 4 wieder zurück...), deshalb ist auch ein Timer relativ nutzlos,
> weil der max. 5 Cycles zählt bevor er wieder auslösen muss.

Vllt. jetzt zu kurz gedacht, aber wenn dein Programm die ganze Zeit 
Pakete verschickt/empfängt 2), dann klingt für mich das so, als ob es 
kein 1) geben kann, weil der µC nur mit Pakete bearbeiten zu 100% 
ausgelastet ist.

Vllt. passt auch etwas am Design nicht. Zu viele zu kleine Pakete => der 
µC hängt ständig in den beiden Interrups ... (nur als Gedanke ...)

blaudimau schrieb:
> Es geht leider genau darum nach Möglichkeit keine Timer zu verschwenden
> :/
> Wenn das kein Compiler kann, dann wohl saurer Apfel und Laufzeit messen
> und NOPs manuell einfügen...
> Falls niemand sonst eine Idee hat ;)

NOP würde ich möglichst vermeiden. Damit verschwendest Du Rechenzeit. 
Natürlich gibt es auch Fälle, wo sowas Sinn macht bzw. man es so machen 
muss oder einfach nur der Einfachheit macht.

Programmierst Du eigentlich deine AVRs mit C++ oder geht es eigentlich 
um ARMs???
Gast #4363158
Lesenswert?

Ja ich programmiere AVRs mit C++. Und ja ich rede von einem 8-Bit AVR.

Es geht mir nur darum wie ich es hinbekomme, dass ein Codeblock eine 
bestimmte Zeit dauert. Lösungen mit Timern, etc. helfen mir dabei leider 
nicht.

Die verschwendete Rechenzeit ist kein Problem.

Ich denke dann werde ich die NOPs nach Bedarf setzen.

Vielen Dank, euch allen ;)
Gast #4363171
Lesenswert?

Wenn Du schon C++ nimmst kannst Du das auch passend kapseln und erben.
Oder besser schau Dir mal Semaphoren an und wie man die implementiert.
NOPS sind immer der schlechteste Weg, was machste wenn der AVR 
höher/niedriger getaktet wird ?
Timer sind wie schon erwähnt immer bei µC das passende, wo liegt das 
Problem in der ISR eine weitere Variable mitzuzählen ?
#4363172
Lesenswert?

Außer bei Super-simplen Funktionen ist Dein Vorhaben zum Scheitern 
verurteilt.
Der Grund hierfür ist der, dass oberhalb des Super-simpel-Levels die 
Laufzeit einer Funktion nicht vorhersehbar ist.
Spätestens bei der dritten Verzweigung (in "c" ein Einfaches if) gibt 
eine kaum zu beherrschende Anzahl an verschiedenen möglichen 
"Laufzeiten".
Natürlich kann ein an den Worst-Case angepasster Timer hier helfen. Dann 
aber beißt sich die berühmt berüchtigte Katze in den eigenen Schwanz.
#4363401
Lesenswert?

blaudimau schrieb:
> Mir wäre nicht bekannt, dass ein 8-Bit AVR im Hintergrund andere Sachen
> treibt, die sich außerhalb von dem Bewegen, was in der Instruction Set
> Summary aufgelistet ist. Wenn doch lass ich mich natürlich gerne eines
> besseren belehren ;)

Auch der hat Branch-Befehle, mit denen zur Laufzeit zwischen völlig 
unterschiedlichen Codepfaden umgeschaltet werden kann.

Die verbrauchte Zeit auszählen und dann von Hand die entsprechende 
Anzahl NOPs setzen ist Murks. Wenn du mal eine andere Compiler-Version 
oder andere Compiler-Einstellungen nutzt, passt das nicht mehr.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren