Вт окт 22, 2019 14:02:51
static inline void lighton(void)
{
PORTB |= (1 << PB3);
DDRB |= (1 << DDRB3);
}
Вт окт 22, 2019 14:13:18
Вт окт 22, 2019 14:32:49
А inline - не панацея. Это всего-лишь хинт компилятору. Не факт, что будет инлайн.
Ладно еще с avr-gcc, на другой платформе, например PIC с XC8 там вообще всё плохо с этим.
Плюс макрос можно закинуть в .h и вызывать из разных .c.
Вт окт 22, 2019 15:32:44
__attribute__((always_inline)).
А если делать -Os - что для avr-gcc strongly recommended - то всё норм.
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/cpufunc.h>
#include <stdbool.h>
static inline void lighton(void) {
PORTB |= (1 << PB3);
DDRB |= (1 << PB3);
}
static inline void lightoff(void) {
PORTB &= ~(1 << PB3);
DDRB &= ~(1 << PB3);
}
ISR(INT0_vect) {
lighton();
}
int main() {
lightoff();
_NOP();
lighton();
while(true);
}
...
00000038 <lighton>:
38: c3 9a sbi 0x18, 3 ; 24
3a: bb 9a sbi 0x17, 3 ; 23
3c: 08 95 ret
0000003e <__vector_1>:
3e: 1f 92 push r1
40: 0f 92 push r0
42: 0f b6 in r0, 0x3f ; 63
44: 0f 92 push r0
46: 11 24 eor r1, r1
48: 2f 93 push r18
4a: 3f 93 push r19
4c: 4f 93 push r20
4e: 5f 93 push r21
50: 6f 93 push r22
52: 7f 93 push r23
54: 8f 93 push r24
56: 9f 93 push r25
58: af 93 push r26
5a: bf 93 push r27
5c: ef 93 push r30
5e: ff 93 push r31
60: eb df rcall .-42 ; 0x38 <lighton>
62: ff 91 pop r31
64: ef 91 pop r30
66: bf 91 pop r27
68: af 91 pop r26
6a: 9f 91 pop r25
6c: 8f 91 pop r24
6e: 7f 91 pop r23
70: 6f 91 pop r22
72: 5f 91 pop r21
74: 4f 91 pop r20
76: 3f 91 pop r19
78: 2f 91 pop r18
7a: 0f 90 pop r0
7c: 0f be out 0x3f, r0 ; 63
7e: 0f 90 pop r0
80: 1f 90 pop r1
82: 18 95 reti
00000084 <main>:
84: c3 98 cbi 0x18, 3 ; 24
86: bb 98 cbi 0x17, 3 ; 23
88: 00 00 nop
8a: d6 df rcall .-84 ; 0x38 <lighton>
8c: ff cf rjmp .-2 ; 0x8c <main+0x8>
...
00000044 <__vector_1>:
44: 1f 92 push r1
46: 0f 92 push r0
48: 0f b6 in r0, 0x3f ; 63
4a: 0f 92 push r0
4c: 11 24 eor r1, r1
4e: c3 9a sbi 0x18, 3 ; 24
50: bb 9a sbi 0x17, 3 ; 23
52: 0f 90 pop r0
54: 0f be out 0x3f, r0 ; 63
56: 0f 90 pop r0
58: 1f 90 pop r1
5a: 18 95 reti
Вт окт 22, 2019 16:43:35
__attribute__((always_inline)).
Но для записи битика в пару регистров честно не вижу смысла городить функцию.
Диод ставить куда больший изврат )))
А если делать -Os - что для avr-gcc strongly recommended - то всё норм.
А вот как раз таки наоборот. При -Os делается rcall:
Вт окт 22, 2019 18:09:06
Если для проекта вызов функции критичен, то надо либо в сторону ассемблера смотреть, либо в сторону контроллера помощнее.
Хотя, это субъективно. Каждый сам определяет, когда нужно остановиться .
Ср окт 23, 2019 12:12:35
ISR(INT0_vect) {
lighton();
}
Мне как-то несколько байт не хватало ) Пришлось пожертвовать читаемостью кода и все функции запихнуть одной простыней. Зато влезло в текущий МК, который был под рукой и который не надо было покупать. Это когда речь о личных поделках.
А в серийных ус-ах порой разница в цене за счет серийности может встать в существенную сумму. Всякое бывает.
Ср окт 23, 2019 14:21:44
То вызовов функции не будет в main. Она будет инлайниться.
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/cpufunc.h>
#include <stdbool.h>
static inline void lighton(void) {
PORTB |= (1 << PB3);
DDRB |= (1 << PB3);
}
static inline void lightoff(void) {
PORTB &= ~(1 << PB3);
DDRB &= ~(1 << PB3);
}
void fn() {
lighton();
}
int main() {
fn();
_NOP();
lightoff();
_NOP();
lighton();
while(true);
}
...
00000038 <lighton>:
38: c3 9a sbi 0x18, 3 ; 24
3a: bb 9a sbi 0x17, 3 ; 23
3c: 08 95 ret
0000003e <fn>:
3e: fc cf rjmp .-8 ; 0x38 <lighton>
00000040 <main>:
40: fb df rcall .-10 ; 0x38 <lighton>
42: 00 00 nop
44: c3 98 cbi 0x18, 3 ; 24
46: bb 98 cbi 0x17, 3 ; 23
48: 00 00 nop
4a: f6 df rcall .-20 ; 0x38 <lighton>
4c: ff cf rjmp .-2 ; 0x4c <main+0xc>
...
Ср окт 23, 2019 14:24:38
Ср окт 23, 2019 15:34:21
То вызовов функции не будет в main. Она будет инлайниться.
Ср окт 23, 2019 18:05:49
Ср окт 23, 2019 19:35:27
Чт окт 24, 2019 06:08:06
Чт окт 24, 2019 07:11:58
Чт окт 24, 2019 08:20:09
Чт окт 24, 2019 14:19:56
static inline void lighton(void) {
PORTB |= (1 << PB3);
DDRB |= (1 << PB3);
}
static inline void lightoff(void) {
PORTB &= ~(1 << PB3);
DDRB &= ~(1 << PB3);
}
void fn(void) {
lighton();
}
ISR(INT0_vect) {
lighton();
}
int main(void) {
fn();
_NOP();
lightoff();
_NOP();
lighton();
while(true);
}
00000080 <lighton>:
80: 2b 9a sbi 0x05, 3 ; 5
82: 23 9a sbi 0x04, 3 ; 4
84: 08 95 ret
00000086 <fn>:
86: 0c 94 40 00 jmp 0x80 ; 0x80 <lighton>
0000008a <__vector_1>:
8a: 1f 92 push r1
8c: 0f 92 push r0
8e: 0f b6 in r0, 0x3f ; 63
90: 0f 92 push r0
92: 11 24 eor r1, r1
94: 2f 93 push r18
96: 3f 93 push r19
98: 4f 93 push r20
9a: 5f 93 push r21
9c: 6f 93 push r22
9e: 7f 93 push r23
a0: 8f 93 push r24
a2: 9f 93 push r25
a4: af 93 push r26
a6: bf 93 push r27
a8: ef 93 push r30
aa: ff 93 push r31
ac: 0e 94 40 00 call 0x80 ; 0x80 <lighton>
b0: ff 91 pop r31
b2: ef 91 pop r30
b4: bf 91 pop r27
b6: af 91 pop r26
b8: 9f 91 pop r25
ba: 8f 91 pop r24
bc: 7f 91 pop r23
be: 6f 91 pop r22
c0: 5f 91 pop r21
c2: 4f 91 pop r20
c4: 3f 91 pop r19
c6: 2f 91 pop r18
c8: 0f 90 pop r0
ca: 0f be out 0x3f, r0 ; 63
cc: 0f 90 pop r0
ce: 1f 90 pop r1
d0: 18 95 reti
000000d2 <main>:
d2: 0e 94 40 00 call 0x80 ; 0x80 <lighton>
d6: 00 00 nop
d8: 2b 98 cbi 0x05, 3 ; 5
da: 23 98 cbi 0x04, 3 ; 4
dc: 00 00 nop
de: 0e 94 40 00 call 0x80 ; 0x80 <lighton>
e2: ff cf rjmp .-2 ; 0xe2 <main+0x10>
static void lighton(void) {
PORTB |= (1 << PB3);
DDRB |= (1 << PB3);
}
static void lightoff(void) {
PORTB &= ~(1 << PB3);
DDRB &= ~(1 << PB3);
}
void fn(void) {
lighton();
}
ISR(INT0_vect) {
lighton();
}
int main(void) {
fn();
_NOP();
lightoff();
_NOP();
lighton();
while(true);
}
00000080 <lighton>:
80: 2b 9a sbi 0x05, 3 ; 5
82: 23 9a sbi 0x04, 3 ; 4
84: 08 95 ret
00000086 <fn>:
86: 0c 94 40 00 jmp 0x80 ; 0x80 <lighton>
0000008a <__vector_1>:
8a: 1f 92 push r1
8c: 0f 92 push r0
8e: 0f b6 in r0, 0x3f ; 63
90: 0f 92 push r0
92: 11 24 eor r1, r1
94: 2f 93 push r18
96: 3f 93 push r19
98: 4f 93 push r20
9a: 5f 93 push r21
9c: 6f 93 push r22
9e: 7f 93 push r23
a0: 8f 93 push r24
a2: 9f 93 push r25
a4: af 93 push r26
a6: bf 93 push r27
a8: ef 93 push r30
aa: ff 93 push r31
ac: 0e 94 40 00 call 0x80 ; 0x80 <lighton>
b0: ff 91 pop r31
b2: ef 91 pop r30
b4: bf 91 pop r27
b6: af 91 pop r26
b8: 9f 91 pop r25
ba: 8f 91 pop r24
bc: 7f 91 pop r23
be: 6f 91 pop r22
c0: 5f 91 pop r21
c2: 4f 91 pop r20
c4: 3f 91 pop r19
c6: 2f 91 pop r18
c8: 0f 90 pop r0
ca: 0f be out 0x3f, r0 ; 63
cc: 0f 90 pop r0
ce: 1f 90 pop r1
d0: 18 95 reti
000000d2 <main>:
d2: 0e 94 40 00 call 0x80 ; 0x80 <lighton>
d6: 00 00 nop
d8: 2b 98 cbi 0x05, 3 ; 5
da: 23 98 cbi 0x04, 3 ; 4
dc: 00 00 nop
de: 0e 94 40 00 call 0x80 ; 0x80 <lighton>
e2: ff cf rjmp .-2 ; 0xe2 <main+0x10>
#define INLINE static inline __attribute__((__always_inline__))
INLINE void lighton(void) {
PORTB |= (1 << PB3);
DDRB |= (1 << PB3);
}
INLINE void lightoff(void) {
PORTB &= ~(1 << PB3);
DDRB &= ~(1 << PB3);
}
void fn(void) {
lighton();
}
ISR(INT0_vect) {
lighton();
}
int main(void) {
fn();
_NOP();
lightoff();
_NOP();
lighton();
while(true);
}
00000080 <fn>:
80: 2b 9a sbi 0x05, 3 ; 5
82: 23 9a sbi 0x04, 3 ; 4
84: 08 95 ret
00000086 <__vector_1>:
86: 2b 9a sbi 0x05, 3 ; 5
88: 23 9a sbi 0x04, 3 ; 4
8a: 18 95 reti
0000008c <main>:
8c: 0e 94 40 00 call 0x80 ; 0x80 <fn>
90: 00 00 nop
92: 2b 98 cbi 0x05, 3 ; 5
94: 23 98 cbi 0x04, 3 ; 4
96: 00 00 nop
98: 2b 9a sbi 0x05, 3 ; 5
9a: 23 9a sbi 0x04, 3 ; 4
9c: ff cf rjmp .-2 ; 0x9c <main+0x10>
Чт окт 24, 2019 14:54:43
Чт окт 24, 2019 16:42:51
Чт окт 24, 2019 19:20:07
Вс окт 27, 2019 08:49:09