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