Вопрос возможно странный но вот в linux с этим не все так радужно, ну не знаю Arduino я не трогаю по заветам ncrmnt, использовать AVRA (AVR Assembler), тоже не хочется ибо проект давно не развивается да и зачем когда есть GNU As....
Далее возникают проблемы с отладкой, я понимаю что JTAG отладка на реальном железе это наверное здорово(а по мне так просто оправдание что симулятор не очень работает), но таскать с собой кучу железок ой как не хочется.
Есть два проекта эмуляции работы AVR-ок это simulavr и simavr, про второй ничего не скажу, а вот simulavr замечательно описан на wiki и в разделе features прям пальчики оближешь , только беда в том что это не работает ,а TCL код который там эмулировал подключенный дисплей и прочее, просто перестали поддерживать так как чувак который знал TCL забил на проект, в документации скудно с примерами.
Возможно автоматический тест на python(который не включен по умолчанию) и можно написать... но вот с удаленной отладкой не все так здорово.
Вопрос Как вызвать прерывание при удаленной отладке через GDB???
#include <avr/io.h>
#include <avr/interrupt.h>
;; В примере используется обработка прерываний, нажатие INT0(stop)
;; #include <compat/deprecated.h>
#define SFR(X) _SFR_IO_ADDR(X) ;Обращение к регистрам ввода вывода только через это
;; И оно не сработало пришлось вручную все заменить.... непонятно
;; Нужен ручной препроцессор здесь он не справляется т.е дополнительный .h файл
#define reg_led r20
#define temp r16
#define START 0
.section .text
.global main
;;###############Основная программа
main: ldi reg_led,0xfe
ldi temp,pm_lo8(RAMEND) ;RAMEnd константа окончания RAM памяти
out _SFR_IO_ADDR(SPL),temp
ldi temp,pm_hi8(RAMEND) ;
out _SFR_IO_ADDR(SPH),temp
sec
set
ser temp
out _SFR_IO_ADDR(DDRB),temp
out _SFR_IO_ADDR(PORTB),temp
clr temp
out _SFR_IO_ADDR(DDRD),temp
ldi temp,0x05
out _SFR_IO_ADDR(PORTD),temp
ldi temp,0x40 ;Установка битов INT1, INT0 или INT2 разрешает прерывания
;0100 0000
/*
Условия генерации прерываний устанавливаются с помощью конфигурационных регистров.
Для INT0, INT1 – это регистр MCUCR (MCU Control Register).
Для INT2 – MCUCSR (MCU Control and Status Register)
*/
out _SFR_IO_ADDR(GICR),temp ;от процессора лучше это отдать макросам
ldi temp,0x00 ;ISC01, ISC00 для INT
out _SFR_IO_ADDR(MCUCR),temp
sei
waitstart:
sbic _SFR_IO_ADDR(PIND),START
rjmp waitstart
loop: out _SFR_IO_ADDR(PORTB),reg_led
rcall delay
ser temp
out _SFR_IO_ADDR(PORTB),temp
brts left
sbrs reg_led,0
set
ror reg_led
rjmp loop
left: sbrs reg_led,7
clt
rol reg_led
rjmp loop
;;###############Функция задержки
delay: ldi r17,250
d1: ldi r18,250
d2: dec r18
brne d2
dec r17
brne d1
ret
.global INT0_vect ;Название взято отсюда
;; www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html
;;###############Обработка прерывания INT0
INT0_vect:
waitstart2:
sbic _SFR_IO_ADDR(PIND),START
rjmp waitstart2
reti
.end
AVRFreaks не предлагать, bugtracker не предлагать, я там уже был и патч слал.