Forum: Mikrocontroller und Digitale Elektronik ARM7TDMI-S (LPC2468) - GCC: wie werden 64-Bit Operationen umgesetzt


von Dirk Steffens (Gast)


Lesenswert?

Hallo Forum!

Ich habe bereits die Suchfunktion bemüht, aber leider nichts 
verwertbares gefunden. Meine Frage betrifft die Umsetzung von 
64-Bit-Operationen durch den GCC-arm-elf auf der ARM7TDMI-S Plattform. 
Ich bin durch die Verwendung von Zeitstempeln (Mikrosekunden seit epoch) 
gezwungen, alle 100us eine 64-Bit Operation in einer ISR durchzuführen. 
Wie teuer wird das?

Beispiel:
1
uint64_t timestamp;
2
3
void isr() __INT__;
4
5
//alle 100us
6
void isr(){
7
   T1IR=0x1;          // Clear the Timer interrupt
8
   SWITCH_IRQ_TO_SYS;
9
   timestamp+=100;
10
   SWITCH_SYS_TO_IRQ;
11
   VICVectAddr =0xff; // Update the VIC
12
}

Ich habe den GCC-arm-elf noch nie von Hand bemüht, sonst könnte ich ja 
einfach mal den resultierenden Assembler-Code betrachten.

Ich freue mich über jeden Hinweis. Wie sieht es aus mit der Performance?
geht das gut?

Gruß,
Dirk Steffens

von Andreas K. (a-k)


Lesenswert?

Ist völlig harmlos. Sind 2 Befehle wo vorher einer reichte.

Frag dich lieber, ob es für diese Zwerg-ISR nötig ist, in den 
SYS-Kontext umzuschalten. Das könnte teurer sein als die Timestamp, und 
ist hier garantiert überflüssig.

Was du freilich nicht vergessen solltest: "volatile", und die Tatsache, 
dass Zugriffe auf die beiden Worte der Timestamp nicht atomar sind.

von Dirk Steffens (Gast)


Lesenswert?

Vielen vielen Dank für die schnelle Antwort!
>Ist völlig harmlos. Sind 2 Befehle wo vorher einer reichte.
Ah, okay, ich vermute das ist dann einmal add und einmal adc. Wie schön!

>Frag dich lieber, ob es für diese Zwerg-ISR nötig ist, in den
>SYS-Kontext umzuschalten. Das könnte teurer sein als die Timestamp, und
>ist hier garantiert überflüssig.
Ich habe noch 3 andere ISRs, unter anderem Ethernet und noch zwei Timer. 
Und Timing ist verdammt wichtig auf diesem System.

>Was du freilich nicht vergessen solltest: "volatile", und die Tatsache,
>dass Zugriffe auf die beiden Worte der Timestamp nicht atomar sind.
Ich werde wahrscheinlich die Zugriffe auf den Zeitstempel an einer 
einzigen Stelle durchführen, etwa so:
1
volatile uint64_t timestamp;
2
3
void isr() __INT__;
4
5
void isr(){
6
   T1IR=0x1;          // Clear the Timer interrupt
7
   SWITCH_IRQ_TO_SYS;
8
   timestamp+=100;
9
10
   //der einzige Zugriff auf den (momentan konsistenten) Zeitstempel
11
   TagEventsWithTimestamps();
12
13
   SWITCH_SYS_TO_IRQ;
14
   VICVectAddr =0xff; // Update the VIC
15
}
Ich glaube, volatile hilft mir so eventuell auch nicht viel weiter, wenn 
ich außerhalb der ISR auf den Wert zugreifen möchte.

Ich habe im "ARM architechtural Reference Manual" 
http://www.arm.com/miscPDFs/14128.pdf folgendes gelesen:
1
A3.13 Semaphore instructions
2
The ARM instruction set has two semaphore instructions:
3
• Swap (SWP)
4
• Swap Byte (SWPB).
5
These instructions are provided for process synchronization. Both instructions generate an atomic load and
6
store operation, allowing a memory semaphore to be loaded and altered without interruption.
7
SWP and SWPB have a single addressing mode, whose address is the contents of a register. Separate registers
8
are used to specify the value to store and the destination of the load. If the same register is specified for both
9
of these, SWP exchanges the value in the register and the value in memory.
10
The semaphore instructions do not provide a compare and conditional write facility. If wanted, this must be done explicitly.

Gibt es für Semaphoren  irgendeine Bibliothek die ich verwenden könnte? 
oder irgend einen netten inline-asm - Schnipsel?

Die Beispiele aus dem Manual verstehe ich nicht so richtig...
Ich kenne sowas mit einer test-and-set - Instruktion.

Gruß,
Dirk Steffens

von Dirk Steffens (Gast)


Lesenswert?

unter http://gcc.gnu.org/ml/libstdc++/2002-10/msg00043.html ist eine 
nette Diskussion über diese Instruktionen. Das Lesen des gesammten 
Threads lohnt sich :) So richtig weitergebracht hat es mich leider 
nicht.

In meinem include - Verzeichnis habe ich leider keine "semaphore.h" 
gefunden. Es gibt allerdings "atomicity.h", "atomic_word.h" und 
"pthread.h". Die Mutexe aus pthread habe ich schon mal unter Linux 
verwendet. Vielleicht klappt's ja damit. Falls jemand eine Anregung hat 
-> immer her damit :D

sodenn,
Gute Nacht!
Dirk Steffens

von Dirk Steffens (Gast)


Lesenswert?

Beitrag "ARM7: Critical Section bzw. Mutex programmieren?" betrifft mich wohl 
eher. Wenn ich davon ausgehe, daß das Lesen des von "timestamp" 
innerhalb einer anderen ISR stattfindet, könnte ich vorrübergehend deren 
ISR ausschalten. Das könnte mich etwas weiterbringen. Die Umschalten mit 
SWITCH_IRQ_TO_SYS etc. macht da allerdings Probleme, wenn gerade etwas 
"nested" ausgeführt wird. Die Routine könnte gerade im kritischen 
Abschnitt sein -> sprich: die eine Hälfte gelesen haben, dann von der 
höher priorisierten Timer-Funktion unterbrochen worden sein, und danach 
die andere Hälfte lesen-> PENG.

Was mache ich nur?
Ich glaube, ich bleibe bei der Möglichkeit, alle Zugriffe auf den 
Zeitstempel innerhalb der ISR zu belassen. Meine Liste mit Ereignissen 
wird dann beim nächsten Aufruf der Timer-ISR mit gültigen Zeitstempeln 
versehen.

Gruß,
Dirk Steffens

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.