0
我試圖在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亞軍如下:
#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頻率上升時,以毫秒爲單位的延遲主要由更快的速度運行? – tofro
我以爲'_delay_ms'宏擴展爲忙等待?例如,如果我用'F_CPU = 800000'對其進行編譯,然後將其上載並運行在運行頻率爲16MHz的真實芯片上,我確實發現閃爍速度是兩倍。 – Cactus
@tofro:[此文檔頁面](http://www.nongnu.org/avr-libc/user-manual/group__util__delay.html)非常明確指出'_delay_ms'&c。正在使用忙等待編譯時計算的循環數。 – Cactus