simavr是一个适用于 Linux 或任何使用 avr-gcc 的平台的 AVR 模拟器。它使用 avr-gcc 自己的寄存器定义来简化为支持的 AVR 设备创建新目标的过程。核心设计得小而紧凑,并且可修改,因此可以快速构建 AVR 项目的原型。 AVR 内核现在可以稳定地与闪存 <= 128KB 的部件一起使用,并初步支持更大的部件。模拟器直接加载 ELF 文件,甚至可以使用 .elf 部分直接在模拟代码中指定模拟参数。您还可以加载多部分 HEX 文件。
- _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.
在 OSX 上,我们建议使用自制程序:
brew tap osx-cross/avr
brew install --HEAD simavr
在 Ubuntu 上,SimAVR 可在 Bionic 软件包源中找到:
apt-get install simavr
(请注意,该命令以simavr
名称而不是run_avr
名称提供。)
否则, make
足以开始使用bin/simavr 。要在系统范围内安装simavr命令, make install RELEASE=1
。
补丁总是受欢迎的!请通过 Github 拉取请求提交您的更改。
simavr可以输出其大部分引脚、固件变量、中断和其他一些内容作为信号转储到文件中,可以使用 gtkwave 绘制该文件以进行进一步的精确分析。固件可以包含让simavr了解要跟踪的内容的指令,并且文件会自动生成。例子:
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, },
};
每次 UDR0 寄存器更改和每次引发中断(在 UCSR0A 中)时,都会告诉simavr生成跟踪。 MMCU标记告诉 gcc 它需要编译,但它不会链接到您的程序中,因此它实际上需要零字节,这是simavr私有的代码部分,它是免费的!使用这些指令运行并写入串行端口的程序将生成一个文件,该文件将显示:
$ ./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
当文件加载到 gtkwave 中时,您会看到:
您可以对添加到跟踪的任何更改进行非常精确的时序细分,直至 AVR 周期。
simavr确实是模拟您自己的 AVR 项目的中心,不仅仅是一个调试器,还可以模拟您将在固件中使用的外设,因此您可以离线测试和开发,然后时不时地在硬件上尝试。
您还可以使用simavr对您的出厂固件进行测试单元,以便在发布新版本之前对其进行验证,以防止回归或错误。
simavr有一些“完整的项目/”证明了这一点,其中大多数是在某个时候使用真实硬件制作的,并且固件二进制文件正是在硬件上运行的。这里的关键是模拟连接到 AVR 的部件或外围设备。当然,您不必模拟完整的硬件,您只需生成适当的激励,以便愚弄 AVR。
此示例板将 Atmega48 连接到模拟 HD44780 LCD,并在“lcd”中显示运行计数器。一切都是模拟的,固件在真实硬件上的运行完全一样。
这是固件正在执行的操作的 gtkwave 跟踪。您可以在 gtkwave 中进行放大、测量等操作,选择迹线进行查看等。
还有很多其他示例可用!