> (1<<m_x_toggle_bit)
Sowas ist langsam, weil der AVR keinen Befehl für mehrfaches Schieben
hat. Der Compiler muss also eine Schleife erzeugen, in der
m_x_toggle_bit mal um 1 geschoben wird. Speichere in m_x_toggle_bit
nicht die Bitnummer, sondern gleich die fertige Maske:
1 | m_x_toggle_bit = (1<<MV1aufM);
|
2 |
|
3 | *m_x_toggle_port &= ~m_x_toggle_bit;
|
4 |
|
5 | *m_x_toggle_port |= m_x_toggle_bit;
|
Trotzdem erzeugt das natürlich deutlich mehr Code, z.B. muss ja auch
erstmal der Inhalt der Variablen aus dem Speicher geholt werden. Und bei
der ISR kommt noch hinzu, dass bei der Variablen-Variante zusätzliche
Pushs und Pops erzeugt werden müssen.
1 | ISR ( TIMER1_OVF_vect ) {
|
2 | *m_x_toggle_port &= ~m_x_toggle_bit;
|
3 | }
|
->
1 | 5e: 1f 92 push r1
|
2 | 60: 0f 92 push r0
|
3 | 62: 0f b6 in r0, 0x3f ; 63
|
4 | 64: 0f 92 push r0
|
5 | 66: 11 24 eor r1, r1
|
6 | 68: 8f 93 push r24
|
7 | 6a: 9f 93 push r25
|
8 | 6c: ef 93 push r30
|
9 | 6e: ff 93 push r31
|
10 | 70: e0 91 60 00 lds r30, 0x0060
|
11 | 74: f0 91 61 00 lds r31, 0x0061
|
12 | 78: 90 81 ld r25, Z
|
13 | 7a: 80 91 62 00 lds r24, 0x0062
|
14 | 7e: 80 95 com r24
|
15 | 80: 89 23 and r24, r25
|
16 | 82: 80 83 st Z, r24
|
17 | 84: ff 91 pop r31
|
18 | 86: ef 91 pop r30
|
19 | 88: 9f 91 pop r25
|
20 | 8a: 8f 91 pop r24
|
21 | 8c: 0f 90 pop r0
|
22 | 8e: 0f be out 0x3f, r0 ; 63
|
23 | 90: 0f 90 pop r0
|
24 | 92: 1f 90 pop r1
|
25 | 94: 18 95 reti
|
1 | ISR ( TIMER1_OVF_vect ) {
|
2 | PORTB &= ~(1<<MV1aufM);
|
3 | }
|
->
1 | 5e: 1f 92 push r1
|
2 | 60: 0f 92 push r0
|
3 | 62: 0f b6 in r0, 0x3f ; 63
|
4 | 64: 0f 92 push r0
|
5 | 66: 11 24 eor r1, r1
|
6 | 68: c5 98 cbi 0x18, 5 ; 24
|
7 | 6a: 0f 90 pop r0
|
8 | 6c: 0f be out 0x3f, r0 ; 63
|
9 | 6e: 0f 90 pop r0
|
10 | 70: 1f 90 pop r1
|
11 | 72: 18 95 reti
|
Die 2. Variante ließe sich sogar noch deutlich reduzieren:
1 | ISR ( TIMER1_OVF_vect, ISR_NAKED ) {
|
2 | PORTB &= ~ (1<<MV1aufM);
|
3 | reti();
|
4 | }
|
->
1 | 5e: c5 98 cbi 0x18, 5 ; 24
|
2 | 60: 18 95 reti
|
> möchte aber trotzdem per Übergabe des Ports und Pins schalten.
Wenn du erklärst warum, könnte dir vielleicht besser geholfen werden.