SimAVR
AVR Simulator
|
Main AVR instance. More...
#include <sim_avr.h>
Data Fields | |
const char * | mmcu |
name of the AVR More... | |
uint16_t | ramend |
uint32_t | flashend |
uint32_t | e2end |
uint8_t | vector_size |
uint8_t | signature [3] |
uint8_t | fuse [4] |
avr_io_addr_t | rampz |
optional, only for ELPM/SPM on >64Kb cores More... | |
avr_io_addr_t | eind |
optional, only for EIJMP/EICALL on >64Kb cores More... | |
uint8_t | address_size |
2, or 3 for cores >128KB in flash More... | |
uint32_t | codeend |
filled by the ELF data, this allow tracking of invalid jumps More... | |
int | state |
stopped, running, sleeping More... | |
uint32_t | frequency |
frequency we are running at More... | |
uint32_t | vcc |
uint32_t | avcc |
uint32_t | aref |
(optional) voltages in millivolts More... | |
avr_cycle_count_t | cycle |
current cycle More... | |
avr_cycle_count_t | run_cycle_count |
cycles to run before next timer More... | |
avr_cycle_count_t | run_cycle_limit |
maximum run cycle interval limit More... | |
uint32_t | sleep_usec |
Sleep requests are accumulated in sleep_usec until the minimum sleep value is reached, at which point sleep_usec is cleared and the sleep request is passed on to the operating system. More... | |
void(* | init )(struct avr_t *avr) |
Called at init time. More... | |
void(* | special_init )(struct avr_t *avr, void *data) |
called at init time (for special purposes like using a memory mapped file as flash see: simduino) More... | |
void(* | special_deinit )(struct avr_t *avr, void *data) |
called at termination time ( to clean special initializations) More... | |
void * | special_data |
value passed to special_init() and special_deinit() More... | |
void(* | reset )(struct avr_t *avr) |
called at reset time More... | |
avr_run_t | run |
Default AVR core run function. More... | |
void(* | sleep )(struct avr_t *avr, avr_cycle_count_t howLong) |
Sleep default behaviour. More... | |
avr_irq_pool_t | irq_pool |
Every IRQs will be stored in this pool. More... | |
uint8_t | sreg [8] |
Mirror of the SREG register, to facilitate the access to bits in the opcode decoder. More... | |
int8_t | interrupt_state |
Interrupt state: 00: idle (no wait, no pending interrupts) or disabled <0: wait till zero >0: interrupt pending. More... | |
avr_flashaddr_t | pc |
Current PC Note that the PC is representing /bytes/ while the AVR value is assumed to be "words". More... | |
struct { | |
struct avr_irq_t * irq | |
optional, used only if asked for with avr_iomem_getirq() More... | |
struct { | |
void * param | |
avr_io_read_t c | |
} r | |
struct { | |
void * param | |
avr_io_write_t c | |
} w | |
} | io [MAX_IOs] |
Callback when specific IO registers are read/written. More... | |
int | io_shared_io_count |
This block allows sharing of the IO write/read on addresses between multiple callbacks. More... | |
struct { | |
int used | |
struct { | |
void * param | |
void * c | |
} io [4] | |
} | io_shared_io [4] |
uint8_t * | flash |
Flash memory (initialized to 0xff, and code loaded into it) More... | |
uint8_t * | data |
SRAM memory, starting by the general purpose registers, and IO registers. More... | |
struct avr_io_t * | io_port |
Queue of io modules. More... | |
avr_cycle_timer_pool_t | cycle_timers |
Cycle timers tracking & delivery. More... | |
avr_int_table_t | interrupts |
Interrupt vectors and delivery fifo. More... | |
uint8_t | trace:1 |
DEBUG ONLY – value ignored if CONFIG_SIMAVR_TRACE = 0. More... | |
uint8_t | log:2 |
log level, default to 1 More... | |
struct avr_trace_data_t * | trace_data |
Only used if CONFIG_SIMAVR_TRACE is defined. More... | |
struct avr_vcd_t * | vcd |
Value Change Dump file (waveforms) This is the VCD file that gets allocated if the firmware that is loaded explicitly asks for a trace to be generated, and allocates it's own symbols using AVR_MMCU_TAG_VCD_TRACE (see avr_mcu_section.h) More... | |
struct avr_gdb_t * | gdb |
gdb hooking structure. Only present when gdb server is active More... | |
int | gdb_port |
if non-zero, the gdb server will be started when the core crashed even if not activated at startup if zero, the simulator will just exit() in case of a crash More... | |
Main AVR instance.
Some of these fields are set by the AVR "Core" definition files the rest is runtime data (as little as possible)
uint8_t address_size |
2, or 3 for cores >128KB in flash
uint32_t aref |
(optional) voltages in millivolts
uint32_t avcc |
void* c |
uint32_t codeend |
filled by the ELF data, this allow tracking of invalid jumps
avr_cycle_count_t cycle |
current cycle
avr_cycle_timer_pool_t cycle_timers |
Cycle timers tracking & delivery.
uint8_t* data |
SRAM memory, starting by the general purpose registers, and IO registers.
uint32_t e2end |
avr_io_addr_t eind |
optional, only for EIJMP/EICALL on >64Kb cores
uint8_t* flash |
Flash memory (initialized to 0xff, and code loaded into it)
uint32_t flashend |
uint32_t frequency |
frequency we are running at
uint8_t fuse[4] |
struct avr_gdb_t* gdb |
gdb hooking structure. Only present when gdb server is active
int gdb_port |
if non-zero, the gdb server will be started when the core crashed even if not activated at startup if zero, the simulator will just exit() in case of a crash
int8_t interrupt_state |
Interrupt state: 00: idle (no wait, no pending interrupts) or disabled <0: wait till zero >0: interrupt pending.
interrupt state
avr_int_table_t interrupts |
Interrupt vectors and delivery fifo.
struct { ... } io[MAX_IOs] |
Callback when specific IO registers are read/written.
There is one drawback here, there is in way of knowing what is the "beginning of useful sram" on a core, so there is no way to deduce what is the maximum IO register for a core, and thus, we can't allocate this table dynamically. If you wanted to emulate the BIG AVRs, and XMegas, this would need work.
struct { ... } io[4] |
struct avr_io_t* io_port |
Queue of io modules.
struct { ... } io_shared_io[4] |
int io_shared_io_count |
This block allows sharing of the IO write/read on addresses between multiple callbacks.
In 99% of case it's not needed, however on the tiny* (tiny85 at last) some registers have bits that are used by different IO modules. If this case is detected, a special "dispatch" callback is installed that will handle this particular case, without impacting the performance of the other, normal cases...
struct avr_irq_t* irq |
optional, used only if asked for with avr_iomem_getirq()
avr_irq_pool_t irq_pool |
Every IRQs will be stored in this pool.
It is not mandatory (yet) but will allow listing IRQs and their connections
uint8_t log |
log level, default to 1
const char* mmcu |
name of the AVR
void* param |
Current PC Note that the PC is representing /bytes/ while the AVR value is assumed to be "words".
This is in line with what GDB does... this is why you will see >>1 and <<1 in the decoder to handle jumps. It CAN be a little confusing, so concentrate, young grasshopper.
struct { ... } r |
uint16_t ramend |
avr_io_addr_t rampz |
optional, only for ELPM/SPM on >64Kb cores
avr_run_t run |
Default AVR core run function.
Two modes are available, a "raw" run that goes as fast as it can, and a "gdb" mode that also watchouts for gdb events and is a little bit slower.
avr_cycle_count_t run_cycle_count |
cycles to run before next timer
avr_cycle_count_t run_cycle_limit |
maximum run cycle interval limit
uint8_t signature[3] |
void(* sleep) (struct avr_t *avr, avr_cycle_count_t howLong) |
Sleep default behaviour.
In "raw" mode, it calls usleep, in gdb mode, it waits for howLong for gdb command on it's sockets.
uint32_t sleep_usec |
Sleep requests are accumulated in sleep_usec until the minimum sleep value is reached, at which point sleep_usec is cleared and the sleep request is passed on to the operating system.
void* special_data |
value passed to special_init() and special_deinit()
called at termination time ( to clean special initializations)
called at init time (for special purposes like using a memory mapped file as flash see: simduino)
uint8_t sreg[8] |
Mirror of the SREG register, to facilitate the access to bits in the opcode decoder.
This array is re-synthesized back/forth when SREG changes
int state |
stopped, running, sleeping
uint8_t trace |
DEBUG ONLY – value ignored if CONFIG_SIMAVR_TRACE = 0.
struct avr_trace_data_t* trace_data |
Only used if CONFIG_SIMAVR_TRACE is defined.
int used |
uint32_t vcc |
struct avr_vcd_t* vcd |
Value Change Dump file (waveforms) This is the VCD file that gets allocated if the firmware that is loaded explicitly asks for a trace to be generated, and allocates it's own symbols using AVR_MMCU_TAG_VCD_TRACE (see avr_mcu_section.h)
uint8_t vector_size |
struct { ... } w |