【发布时间】:2017-07-04 02:18:31
【问题描述】:
我正在尝试在 SimAVR 上运行以下 AVR 程序:
#include <avr/io.h>
#include <util/delay.h>
int main ()
{
DDRB |= _BV(DDB5);
for (;;)
{
PORTB ^= _BV(PB5);
_delay_ms(2000);
}
}
我用F_CPU=16000000 编译了它。 SimAVR runner 如下:
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include "sim_avr.h"
#include "avr_ioport.h"
#include "sim_elf.h"
avr_t * avr = NULL;
static void* avr_run_thread(void * ignore)
{
for (;;) {
avr_run(avr);
}
return NULL;
}
void led_changed_hook(struct avr_irq_t* irq, uint32_t value, void* param)
{
printf("led_changed_hook %d %d\n", irq->irq, value);
}
int main(int argc, char *argv[])
{
elf_firmware_t f;
elf_read_firmware("image.elf", &f);
f.frequency = 16e6;
const char *mmcu = "atmega328p";
avr = avr_make_mcu_by_name(mmcu);
if (!avr) {
fprintf(stderr, "%s: AVR '%s' not known\n", argv[0], mmcu);
exit(1);
}
avr_init(avr);
avr_load_firmware(avr, &f);
avr_irq_register_notify(
avr_io_getirq(avr, AVR_IOCTL_IOPORT_GETIRQ('B'), 5),
led_changed_hook,
NULL);
pthread_t run;
pthread_create(&run, NULL, avr_run_thread, NULL);
for (;;) {}
}
问题是我从led_changed_hook 的输出中看到它以~4 倍的速度运行。此外,更改f.frequency 似乎对模拟速度没有任何影响。
如何确保 SimAVR 以正确的实时速度运行仿真?
【问题讨论】:
-
为什么当你提高 CPU 频率时,主要由以毫秒为单位的恒定延迟组成的东西运行得更快?
-
我认为
_delay_ms宏扩展为忙等待?例如,如果我使用F_CPU=800000编译它,然后上传并在运行频率为 16MHz 的真实芯片上运行它,我确实看到闪烁速度是两倍。 -
@tofro: this documentation page 非常明确地表明
_delay_ms&c。正在使用忙等待编译时计算的周期数。 -
是的,确实如此 - 所以它是同一个二进制文件?中间没有构建?
-
@tofro:我使用
F_CPU=16e6构建了 AVR 程序,然后将生成的image.elf加载到 SimAVR 运行器中。然后我开始尝试在 SimAVR 中设置频率,即通过更改f.frequency,这似乎并没有改变“闪烁”速度。
标签: emulation avr simulator simavr