simavr é um simulador AVR para Linux ou qualquer plataforma que use avr-gcc. Ele usa a própria definição de registro do avr-gcc para simplificar a criação de novos alvos para dispositivos AVR suportados. O núcleo foi feito para ser pequeno e compacto e hackeável, permitindo a rápida prototipagem de um projeto AVR. O núcleo AVR agora está estável para uso com peças com flash <= 128 KB e com suporte preliminar para peças maiores. O simulador carrega arquivos ELF diretamente e existe até uma maneira de especificar parâmetros de simulação diretamente no código emulado usando uma seção .elf. Você também pode carregar arquivos HEX multipartes.
- _simavr_ is provided **AS IS**. If you think you should report "security vulnerabilities"
- and waste everyones time with them, you are either a grifter OR an idiot, or both. And
- anyone checking the CV you brag about it will see this paragraph, first.
No OSX, recomendamos o uso do homebrew:
brew tap osx-cross/avr
brew install --HEAD simavr
No Ubuntu, o SimAVR está disponível na fonte do pacote Bionic:
apt-get install simavr
(Observe que o comando está disponível com o nome simavr
e não run_avr
.)
Caso contrário, make
é suficiente para começar a usar bin/simavr . Para instalar o comando simavr em todo o sistema, make install RELEASE=1
.
Patches são sempre bem vindos! Envie suas alterações por meio de solicitações pull do Github.
simavr pode gerar a maioria de seus pinos, variáveis de firmware, interrupções e algumas outras coisas como sinais a serem despejados em um arquivo que pode ser plotado usando gtkwave para análise mais precisa. Um firmware pode conter instruções para o simavr saber o que rastrear, e o arquivo é gerado automaticamente. Exemplo:
const struct avr_mmcu_vcd_trace_t _mytrace[] _MMCU_ = {
{ AVR_MCU_VCD_SYMBOL("UDR0"), .what = (void*)&UDR0, },
{ AVR_MCU_VCD_SYMBOL("UDRE0"), .mask = (1 << UDRE0), .what = (void*)&UCSR0A, },
};
Dirá ao simavr para gerar um rastreamento toda vez que o registro UDR0 mudar e toda vez que a interrupção for gerada (em UCSR0A). A tag MMCU diz ao gcc que ele precisa ser compilado, mas não será vinculado ao seu programa, portanto ocupa literalmente zero bytes, esta é uma seção de código privada para simavr , é grátis! Um programa executado com estas instruções e gravando na porta serial gerará um arquivo que exibirá:
$ ./simavr/run_avr tests/atmega88_example.axf
AVR_MMCU_TAG_VCD_TRACE 00c6:00 - UDR0
AVR_MMCU_TAG_VCD_TRACE 00c0:20 - UDRE0
Loaded 1780 .text
Loaded 114 .data
Loaded 4 .eeprom
Starting atmega88 - flashend 1fff ramend 04ff e2end 01ff
atmega88 init
avr_eeprom_ioctl: AVR_IOCTL_EEPROM_SET Loaded 4 at offset 0
Creating VCD trace file 'gtkwave_trace.vcd'
Read from eeprom 0xdeadbeef -- should be 0xdeadbeef..
Read from eeprom 0xcafef00d -- should be 0xcafef00d..
simavr: sleeping with interrupts off, quitting gracefully
E quando o arquivo é carregado no gtkwave, você vê:
Você obtém um detalhamento de tempo muito preciso de qualquer alteração adicionada ao rastreamento, até o ciclo AVR.
simavr foi realmente feito para ser o centro de emulação de seus próprios projetos AVR, não apenas um depurador, mas também a emulação dos periféricos que você usará em seu firmware, para que você possa testar e desenvolver offline, e de vez em quando experimentá-lo no hardware .
Você também pode usar o simavr para testar unidades em seu firmware enviado para validá-lo antes de enviar uma nova versão, para evitar regressões ou erros.
simavr tem alguns 'projetos completos' que demonstram isso, a maioria deles foi feita usando hardware real em algum momento, e o binário do firmware é exatamente aquele que rodava no hardware. A chave aqui é emular as peças ou periféricos conectados ao AVR. Claro, você não precisa emular o hardware completo, basta gerar o estímulo adequado para que o AVR seja enganado.
Esta placa de exemplo conecta um Atmega48 a um LCD HD44780 emulado e exibe um contador em execução no 'lcd'. Tudo é emulado, o firmware roda exatamente assim em um hardware real.
E este é um rastreamento gtkwave do que o firmware está fazendo. Você pode ampliar, medir, etc. no gtkwave, selecionar traços para ver etc.
Vários outros exemplos estão disponíveis!