fenman:
I’ll probably use digitalWrite() and digitalRead() where appropriate. Actually they may not be any slower as they probably make use of the SBI and CBI instructions.
They don’t. They are both very slow as they have to first read from the flash the address and bitmask for each pin. Then because everything is now pointers they have to use the slow LDS and STS instructions.
Here is how horrible both functions look:
00000cf0 <digitalWrite>:
cf0: 48 2f mov r20, r24
cf2: 50 e0 ldi r21, 0x00 ; 0
cf4: ca 01 movw r24, r20
cf6: 84 5b subi r24, 0xB4 ; 180
cf8: 9f 4f sbci r25, 0xFF ; 255
cfa: fc 01 movw r30, r24
cfc: 24 91 lpm r18, Z+
cfe: ca 01 movw r24, r20
d00: 80 5c subi r24, 0xC0 ; 192
d02: 9f 4f sbci r25, 0xFF ; 255
d04: fc 01 movw r30, r24
d06: 34 91 lpm r19, Z+
d08: 4c 5c subi r20, 0xCC ; 204
d0a: 5f 4f sbci r21, 0xFF ; 255
d0c: fa 01 movw r30, r20
d0e: 94 91 lpm r25, Z+
d10: 99 23 and r25, r25
d12: 09 f4 brne .+2 ; 0xd16 <digitalWrite+0x26>
d14: 3b c0 rjmp .+118 ; 0xd8c <digitalWrite+0x9c>
d16: 22 23 and r18, r18
d18: 09 f1 breq .+66 ; 0xd5c <digitalWrite+0x6c>
d1a: 21 30 cpi r18, 0x01 ; 1
d1c: 31 f4 brne .+12 ; 0xd2a <digitalWrite+0x3a>
d1e: 80 b7 in r24, 0x30 ; 48
d20: 8f 77 andi r24, 0x7F ; 127
d22: 80 bf out 0x30, r24 ; 48
d24: 80 b7 in r24, 0x30 ; 48
d26: 8f 7b andi r24, 0xBF ; 191
d28: 07 c0 rjmp .+14 ; 0xd38 <digitalWrite+0x48>
d2a: 22 30 cpi r18, 0x02 ; 2
d2c: 39 f4 brne .+14 ; 0xd3c <digitalWrite+0x4c>
d2e: 80 b7 in r24, 0x30 ; 48
d30: 8f 7d andi r24, 0xDF ; 223
d32: 80 bf out 0x30, r24 ; 48
d34: 80 b7 in r24, 0x30 ; 48
d36: 8f 7e andi r24, 0xEF ; 239
d38: 80 bf out 0x30, r24 ; 48
d3a: 10 c0 rjmp .+32 ; 0xd5c <digitalWrite+0x6c>
d3c: 23 30 cpi r18, 0x03 ; 3
d3e: 31 f4 brne .+12 ; 0xd4c <digitalWrite+0x5c>
d40: 8f b5 in r24, 0x2f ; 47
d42: 8f 77 andi r24, 0x7F ; 127
d44: 8f bd out 0x2f, r24 ; 47
d46: 8f b5 in r24, 0x2f ; 47
d48: 8f 7b andi r24, 0xBF ; 191
d4a: 07 c0 rjmp .+14 ; 0xd5a <digitalWrite+0x6a>
d4c: 24 30 cpi r18, 0x04 ; 4
d4e: 31 f4 brne .+12 ; 0xd5c <digitalWrite+0x6c>
d50: 8f b5 in r24, 0x2f ; 47
d52: 8f 7d andi r24, 0xDF ; 223
d54: 8f bd out 0x2f, r24 ; 47
d56: 8f b5 in r24, 0x2f ; 47
d58: 8f 7e andi r24, 0xEF ; 239
d5a: 8f bd out 0x2f, r24 ; 47
d5c: e9 2f mov r30, r25
d5e: f0 e0 ldi r31, 0x00 ; 0
d60: ee 0f add r30, r30
d62: ff 1f adc r31, r31
d64: e8 5d subi r30, 0xD8 ; 216
d66: ff 4f sbci r31, 0xFF ; 255
d68: a5 91 lpm r26, Z+
d6a: b4 91 lpm r27, Z+
d6c: 66 23 and r22, r22
d6e: 41 f4 brne .+16 ; 0xd80 <digitalWrite+0x90>
d70: 9f b7 in r25, 0x3f ; 63
d72: f8 94 cli
d74: 8c 91 ld r24, X
d76: 30 95 com r19
d78: 83 23 and r24, r19
d7a: 8c 93 st X, r24
d7c: 9f bf out 0x3f, r25 ; 63
d7e: 08 95 ret
d80: 9f b7 in r25, 0x3f ; 63
d82: f8 94 cli
d84: 8c 91 ld r24, X
d86: 83 2b or r24, r19
d88: 8c 93 st X, r24
d8a: 9f bf out 0x3f, r25 ; 63
d8c: 08 95 ret
00000d8e <digitalRead>:
d8e: 68 2f mov r22, r24
d90: 70 e0 ldi r23, 0x00 ; 0
d92: cb 01 movw r24, r22
d94: 84 5b subi r24, 0xB4 ; 180
d96: 9f 4f sbci r25, 0xFF ; 255
d98: fc 01 movw r30, r24
d9a: 24 91 lpm r18, Z+
d9c: cb 01 movw r24, r22
d9e: 80 5c subi r24, 0xC0 ; 192
da0: 9f 4f sbci r25, 0xFF ; 255
da2: fc 01 movw r30, r24
da4: 44 91 lpm r20, Z+
da6: 6c 5c subi r22, 0xCC ; 204
da8: 7f 4f sbci r23, 0xFF ; 255
daa: fb 01 movw r30, r22
dac: 94 91 lpm r25, Z+
dae: 99 23 and r25, r25
db0: 19 f4 brne .+6 ; 0xdb8 <digitalRead+0x2a>
db2: 20 e0 ldi r18, 0x00 ; 0
db4: 30 e0 ldi r19, 0x00 ; 0
db6: 33 c0 rjmp .+102 ; 0xe1e <digitalRead+0x90>
db8: 22 23 and r18, r18
dba: 09 f1 breq .+66 ; 0xdfe <digitalRead+0x70>
dbc: 21 30 cpi r18, 0x01 ; 1
dbe: 31 f4 brne .+12 ; 0xdcc <digitalRead+0x3e>
dc0: 80 b7 in r24, 0x30 ; 48
dc2: 8f 77 andi r24, 0x7F ; 127
dc4: 80 bf out 0x30, r24 ; 48
dc6: 80 b7 in r24, 0x30 ; 48
dc8: 8f 7b andi r24, 0xBF ; 191
dca: 07 c0 rjmp .+14 ; 0xdda <digitalRead+0x4c>
dcc: 22 30 cpi r18, 0x02 ; 2
dce: 39 f4 brne .+14 ; 0xdde <digitalRead+0x50>
dd0: 80 b7 in r24, 0x30 ; 48
dd2: 8f 7d andi r24, 0xDF ; 223
dd4: 80 bf out 0x30, r24 ; 48
dd6: 80 b7 in r24, 0x30 ; 48
dd8: 8f 7e andi r24, 0xEF ; 239
dda: 80 bf out 0x30, r24 ; 48
ddc: 10 c0 rjmp .+32 ; 0xdfe <digitalRead+0x70>
dde: 23 30 cpi r18, 0x03 ; 3
de0: 31 f4 brne .+12 ; 0xdee <digitalRead+0x60>
de2: 8f b5 in r24, 0x2f ; 47
de4: 8f 77 andi r24, 0x7F ; 127
de6: 8f bd out 0x2f, r24 ; 47
de8: 8f b5 in r24, 0x2f ; 47
dea: 8f 7b andi r24, 0xBF ; 191
dec: 07 c0 rjmp .+14 ; 0xdfc <digitalRead+0x6e>
dee: 24 30 cpi r18, 0x04 ; 4
df0: 31 f4 brne .+12 ; 0xdfe <digitalRead+0x70>
df2: 8f b5 in r24, 0x2f ; 47
df4: 8f 7d andi r24, 0xDF ; 223
df6: 8f bd out 0x2f, r24 ; 47
df8: 8f b5 in r24, 0x2f ; 47
dfa: 8f 7e andi r24, 0xEF ; 239
dfc: 8f bd out 0x2f, r24 ; 47
//from here it starts actually reading the pin
dfe: 89 2f mov r24, r25
e00: 90 e0 ldi r25, 0x00 ; 0
e02: 88 0f add r24, r24
e04: 99 1f adc r25, r25
e06: 82 5d subi r24, 0xD2 ; 210
e08: 9f 4f sbci r25, 0xFF ; 255
e0a: fc 01 movw r30, r24
e0c: a5 91 lpm r26, Z+
e0e: b4 91 lpm r27, Z+
e10: 8c 91 ld r24, X
e12: 20 e0 ldi r18, 0x00 ; 0
e14: 30 e0 ldi r19, 0x00 ; 0
e16: 84 23 and r24, r20
e18: 11 f0 breq .+4 ; 0xe1e <digitalRead+0x90>
e1a: 21 e0 ldi r18, 0x01 ; 1
e1c: 30 e0 ldi r19, 0x00 ; 0
e1e: c9 01 movw r24, r18
e20: 08 95 ret