Hallo,
auch wenn der letzte Beitrag zu diesem Thread schon 4 Monate alt ist,
grabe ich ihn hier nochmals aus.
Auch ich verwende schon seit Jahren (besser Jahrzehnten) die Peter'sche
sbit.h include Datei, um gezielt auf IO Ports zuzugreifen. Also speziell
mit:
1 | struct BitsOfByte
|
2 | {
|
3 | uint8_t b0:1;
|
4 | uint8_t b1:1;
|
5 | uint8_t b2:1;
|
6 | uint8_t b3:1;
|
7 | uint8_t b4:1;
|
8 | uint8_t b5:1;
|
9 | uint8_t b6:1;
|
10 | uint8_t b7:1;
|
11 | } __attribute__((__packed__));
|
12 | #define SBIT(port,pin) ((*(volatile struct BitsOfByte*)&port).b##pin)
|
Ich habe dann aber mal in den daraus resultierenden assembler code
geschaut, der doch sehr kryptisch und lang ist, und dann auch noch mit
movw instructions arbeitet, als zwei Bytes. Hier ein Beispiel:
--> Hier der C Code:
##############################################
1 | #define MY_PORT SBIT (PORTC, 6)
|
2 | uint8_t i;
|
3 | i=1;
|
4 | MY_PORT = i;
|
##############################################
--> Hier der resultierende Assembler Code:
##############################################
1 | i=1;
|
2 | 242c: 81 e0 ldi r24, 0x01 ; 1
|
3 | 242e: 8a 83 std Y+2, r24 ; 0x02
|
4 | MY_PORT = i;
|
5 | 2430: 85 e3 ldi r24, 0x35 ; 53
|
6 | 2432: 90 e0 ldi r25, 0x00 ; 0
|
7 | 2434: 2a 81 ldd r18, Y+2 ; 0x02
|
8 | 2436: 21 70 andi r18, 0x01 ; 1
|
9 | 2438: 21 70 andi r18, 0x01 ; 1
|
10 | 243a: 22 95 swap r18
|
11 | 243c: 22 0f add r18, r18
|
12 | 243e: 22 0f add r18, r18
|
13 | 2440: 20 7c andi r18, 0xC0 ; 192
|
14 | 2442: fc 01 movw r30, r24
|
15 | 2444: 30 81 ld r19, Z
|
16 | 2446: 3f 7b andi r19, 0xBF ; 191
|
17 | 2448: 23 2b or r18, r19
|
18 | 244a: fc 01 movw r30, r24
|
19 | 244c: 20 83 st Z, r18
|
##############################################
Bei sehr zeitkritischen Anwendungen sieht das nicht sehr optimiert aus,
denn es gibt doch die beiden AVR instructions:
SBI P,b Set Bit in I/O Register
CBI P,b Clear Bit in I/O Register
Gibt es keine elegantere, bzw. einfacherer Methode in C, diesen beiden
instructions in den assembler code einzubauen ?
Vielleicht kann Peter hierzu ein paar Kommentare beisteuern.
Gruß
Manni