On 26 July 2012 20:56, Ytai Ben-tsvi <y...@google.com> wrote: > Hi! > I've built simulavr from source on Ubuntu / 64-bit. > > I'm getting: > $ simulavr -d at90can128 --gdbserver > simulavr: irqsystem.cpp:289: void > HWIrqSystem::DebugVerifyInterruptVector(unsigned int, const Hardware*): > Assertion `existing == source' failed. > Aborted > > I'm getting the same behavior with the pre-built binaries. > It works OK with other targets (e.g. atmega 8).
The assertion means that the contstructor uses the same index (7) for multiple interrupt vectors. I compared the interrupt vectors to datasheet and I think the values of vector are completly wrong. Also the code wrote beyond end of array of vectors. I suggest these changes (syrroy, I cannot produce proper diff): - irqSystem = new HWIrqSystem(this, (flash_bytes > 8U * 1024U) ? 4 : 2, 26); + irqSystem = new HWIrqSystem(this, (flash_bytes > 8U * 1024U) ? 4 : 2, 37); ... - eeprom = new HWEeprom(this, irqSystem, ee_bytes, 23, HWEeprom::DEVMODE_EXTENDED); + eeprom = new HWEeprom(this, irqSystem, ee_bytes, 26, HWEeprom::DEVMODE_EXTENDED); ... - timerIrq0->registerLine(0, new IRQLine("TOV0", 16)); - timerIrq0->registerLine(1, new IRQLine("OCF0A", 15)); + timerIrq0->registerLine(0, new IRQLine("TOV0", 17)); // TIMER0 OVF + timerIrq0->registerLine(1, new IRQLine("OCF0A", 16)); // TIMER0 COMP ... - timerIrq1->registerLine(0, new IRQLine("TOV1", 14)); - timerIrq1->registerLine(1, new IRQLine("OCF1A", 13)); - timerIrq1->registerLine(2, new IRQLine("OCF1B", 12)); - timerIrq1->registerLine(3, new IRQLine("OCF1C", 11)); - timerIrq1->registerLine(5, new IRQLine("ICF1", 10)); + timerIrq1->registerLine(0, new IRQLine("TOV1", 15)); // TIMER1 OVF + timerIrq1->registerLine(1, new IRQLine("OCF1A", 12)); // TIMER1 COMPA + timerIrq1->registerLine(2, new IRQLine("OCF1B", 13)); // TIMER1 COMPB + timerIrq1->registerLine(3, new IRQLine("OCF1C", 14)); // TIMER1 COMPC + timerIrq1->registerLine(5, new IRQLine("ICF1", 11)); // TIMER1 CAPT ... - timerIrq2->registerLine(0, new IRQLine("TOV2", 9)); - timerIrq2->registerLine(1, new IRQLine("OCF2A", 7)); + timerIrq2->registerLine(0, new IRQLine("TOV2", 10)); // TIMER2 OVF + timerIrq2->registerLine(1, new IRQLine("OCF2A", 9)); // TIMER2 COMP ... - timerIrq3->registerLine(0, new IRQLine("TOV3", 30)); - timerIrq3->registerLine(1, new IRQLine("OCF3A", 27)); - timerIrq3->registerLine(2, new IRQLine("OCF3B", 28)); - timerIrq3->registerLine(3, new IRQLine("OCF3C", 29)); - timerIrq3->registerLine(5, new IRQLine("ICF3", 26)); + timerIrq3->registerLine(0, new IRQLine("TOV3", 31)); // TIMER3 OVF + timerIrq3->registerLine(1, new IRQLine("OCF3A", 28)); // TIMER3 COMPA + timerIrq3->registerLine(2, new IRQLine("OCF3B", 29)); // TIMER3 COMPB + timerIrq3->registerLine(3, new IRQLine("OCF3C", 30)); // TIMER3 COMPC + timerIrq3->registerLine(5, new IRQLine("ICF3", 27)); // TIMER3 CAPT ... - acomp = new HWAcomp(this, irqSystem, PinAtPort(&porte, 2), PinAtPort(&porte, 3), 23); + acomp = new HWAcomp(this, irqSystem, PinAtPort(&porte, 2), PinAtPort(&porte, 3), 24); ... - 20, // RX complete vector - 21, // UDRE vector - 22, // TX complete vector + 21, // RX complete vector + 22, // UDRE vector + 23, // TX complete vector ... - 31, // RX complete vector - 32, // UDRE vector - 33, // TX complete vector + 32, // RX complete vector + 33, // UDRE vector + 34, // TX complete vector After this changes the constructor finishes correctly and irqSystem->DebugDumpTable() produces following table (which matches datasheet): Interrupt vector table (for comparison against a d Vector | Address/2 | Source Peripheral (class) 1 | $0000 | funct AvrDevice::Reset() 2 | $0002 | class ExternalIRQHandler 3 | $0004 | class ExternalIRQHandler 4 | $0006 | class ExternalIRQHandler 5 | $0008 | class ExternalIRQHandler 6 | $000a | class ExternalIRQHandler 7 | $000c | class ExternalIRQHandler 8 | $000e | class ExternalIRQHandler 9 | $0010 | class ExternalIRQHandler 10 | $0012 | class TimerIRQRegister 11 | $0014 | class TimerIRQRegister 12 | $0016 | class TimerIRQRegister 13 | $0018 | class TimerIRQRegister 14 | $001a | class TimerIRQRegister 15 | $001c | class TimerIRQRegister 16 | $001e | class TimerIRQRegister 17 | $0020 | class TimerIRQRegister 18 | $0022 | class TimerIRQRegister 19 | $0024 | (unsupported or not registered) 20 | $0026 | (unsupported or not registered) 21 | $0028 | class HWSpi 22 | $002a | class HWUsart 23 | $002c | class HWUsart 24 | $002e | class HWUsart 25 | $0030 | class HWAcomp 26 | $0032 | class HWAd 27 | $0034 | class HWEeprom 28 | $0036 | class TimerIRQRegister 29 | $0038 | class TimerIRQRegister 30 | $003a | class TimerIRQRegister 31 | $003c | class TimerIRQRegister 32 | $003e | class TimerIRQRegister 33 | $0040 | class HWUsart 34 | $0042 | class HWUsart 35 | $0044 | class HWUsart 36 | $0046 | (unsupported or not registered) 37 | $0048 | (unsupported or not registered) Opinions? -- Petr Hluzin _______________________________________________ Simulavr-devel mailing list Simulavr-devel@nongnu.org https://lists.nongnu.org/mailman/listinfo/simulavr-devel