simavr es un simulador AVR para Linux o cualquier plataforma que utilice avr-gcc. Utiliza la propia definición de registro de avr-gcc para simplificar la creación de nuevos objetivos para dispositivos AVR compatibles. El núcleo fue diseñado para ser pequeño y compacto, y pirateable, para permitir la creación rápida de prototipos de un proyecto AVR. El núcleo AVR ahora es estable para su uso con piezas con <= 128 KB flash y con soporte preliminar para piezas más grandes. El simulador carga archivos ELF directamente e incluso hay una manera de especificar los parámetros de simulación directamente en el código emulado usando una sección .elf. También puede cargar archivos HEX de varias partes.
- _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.
En OSX, recomendamos usar homebrew:
brew tap osx-cross/avr
brew install --HEAD simavr
En Ubuntu, SimAVR está disponible en la fuente del paquete Bionic:
apt-get install simavr
(Tenga en cuenta que el comando está disponible con el nombre simavr
no run_avr
).
De lo contrario, make
es suficiente para comenzar a usar bin/simavr . Para instalar el comando simavr en todo el sistema, make install RELEASE=1
.
¡Los parches siempre son bienvenidos! Envíe sus cambios a través de solicitudes de extracción de Github.
simavr puede generar la mayoría de sus pines, variables de firmware, interrupciones y algunas otras cosas como señales para volcarlas en un archivo que se puede trazar usando gtkwave para un análisis más detallado y preciso. Un firmware puede contener instrucciones para que simavr sepa qué rastrear y el archivo se genera automáticamente. Ejemplo:
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, },
};
Le indicará a simavr que genere un seguimiento cada vez que cambie el registro UDR0 y cada vez que se genere la interrupción (en UCSR0A). La etiqueta MMCU le dice a gcc que necesita compilarse, pero no estará vinculada en su programa, por lo que ocupa literalmente cero bytes. Esta es una sección de código que es privada para simavr , ¡es gratis! Un programa que se ejecute con estas instrucciones y escriba en el puerto serie generará un archivo que mostrará:
$ ./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
Y cuando el archivo se carga en gtkwave, ves:
Obtiene un desglose de tiempo muy preciso de cualquier cambio que agregue al seguimiento, hasta el ciclo AVR.
simavr está realmente diseñado para ser el centro para emular sus propios proyectos AVR, no solo un depurador, sino también la emulación de los periféricos que usará en su firmware, para que pueda probar y desarrollar sin conexión, y de vez en cuando probarlo en el hardware. .
También puede utilizar simavr para realizar pruebas en el firmware de envío para validarlo antes de enviar una nueva versión y evitar regresiones o errores.
simavr tiene algunos 'proyectos completos/ que demuestran esto, la mayoría de ellos se crearon usando hardware real en algún momento, y el binario del firmware es exactamente el que se ejecutó en el hardware. La clave aquí es emular las piezas o periféricos que están conectados al AVR. Por supuesto, no es necesario emular el hardware completo, sólo es necesario generar el estímulo adecuado para engañar al AVR.
Esta placa de ejemplo conecta un Atmega48 a una pantalla LCD HD44780 emulada y muestra un contador en funcionamiento en la 'lcd'. Todo está emulado, el firmware se ejecuta exactamente así en un hardware real.
Y este es un rastro de gtkwave de lo que está haciendo el firmware. Puede acercar, medir, etc. en gtkwave, seleccionar trazas para ver, etc.
¡Hay muchos otros ejemplos disponibles!