Re: RFC: Speeding up small ISRs: PR20296
"Thomas D. Dean" <[email protected]> Tue, 20 Jun 2017 19:46:36 -0700
| Newsgroups | gmane.comp.hardware.avr.gcc |
|---|---|
| Message-ID | <[email protected]> |
On 06/19/2017 10:48 PM, Erik Christiansen wrote:
> On 15.06.17 14:43, Georg-Johann Lay wrote:
>> https://gcc.gnu.org/PR20296
>>
>> is about speeding up "small" ISRs, and is open for 12 years now...
>>
>> Anyone familiar with avr-gcc knows that a fix would be high effort and risk,
>> and that's the major reason for why PR20296 is still open (and even
>> classified "suspended").
> ...
>
> Johann, I'll be off the net for about a week from late tonight (GMT+10),
> so unfortunately not able to respond immediately on any complications
> arising. (They're always there, in anything which has remained unsolved
> for 12 years.)
>
> A low-effort solution seems needed here, because it is so easy to avoid
> all the complexity by just replacing the long-winded ugly and convoluted
> 'C' in PR20296:
>
> void SIG_PIN_CHANGE0 (void) __attribute__ ((signal)); void SIG_PIN_CHANGE0 (void)
> {
> (*(volatile unsigned char *)((0x12) + 0x20)) |= 1;
> }
>
> with a simple and elegant assembler file:
>
>>>
> .func SIG_PIN_CHANGE0
> .global SIG_PIN_CHANGE0
>
> sbi 0x12, 0
> reti
> <<
>
> put it through gas, and just link its .o file in with all those produced
> from 'C'. All finished and done - without any hassles or toolchain
> modification.
>
> Call me pragmatic, but I see two classes of user: those who don't
> understand the two lines of assembler, and won't know or fuss about the
> inefficient gcc overprotection; and those who do know enough to fuss,
> and can therefore type two lines of assembler, a global declaration, and
> add to their makefile a:
>
> %.o: %.s
> $(AS) -I$(INC_DIR) $(ASFLAGS) -o $(OBJDIR)/$@ $<
>
> To produce the ISR .o file.
>
> If their linking makefile target uses *.o, then the new one is linked
> automatically. I tend to list object files explicitly, as I omit some
> during development, e.g.:
>
> target: init.o encoder.o lcd.o os.o keyboard.o ui.o mathlib.o
> ( cd $(OBJDIR) ; $(CC) $(LDFLAGS) $(CFLAGS) -o [email protected] $^ > map )
> ...
>
> Either way, there's not much to it, and there is never any unexpected
> code padding. That's a big part of the reason why it seems that only a
> minimally intrusive (and labour intensive) toolchain effort is
> warranted.
>
> Erik
> cat avr-sig.c
#include <io.h>
#include <interrupt.h>
ISR(PCINT0_vect,ISR_NAKED ){
(*(volatile unsigned char *)((0x12) + 0x20)) |= 1;
reti();
}
> avr-gcc -O3 -mmcu=atmega165 -S avr-sig.c -I /usr/lib/avr/include/avr/
> cat avr-sig.s
.file "avr-sig.c"
__SP_H__ = 0x3e
__SP_L__ = 0x3d
__SREG__ = 0x3f
__tmp_reg__ = 0
__zero_reg__ = 1
.text
.global __vector_2
.type __vector_2, @function
__vector_2:
/* prologue: naked */
/* frame size = 0 */
/* stack size = 0 */
.L__stack_usage = 0
sbi 0x12,0
/* #APP */
; 6 "avr-sig.c" 1
reti
; 0 "" 2
/* epilogue start */
/* #NOAPP */
.size __vector_2, .-__vector_2
.ident "GCC: (GNU) 4.9.2"