Hi
I have the following problem.
I have a stack overflow as I get a eternal loop like this:
> gdb) i s
> #0 0x0ff56f34 in rt_task_sigharden () from
> /opt/eldk/ppc_4xx/usr/xenomai/lib/libnative.so.3 #1 0x0ffad8b4 in
> wind_task_sigharden () from
> /opt/eldk/ppc_4xx/usr/xenomai/lib/libvxworks.so.1 #2 0x0ff56f78 in
> rt_task_sigharden () from /opt/eldk/ppc_4xx/usr/xenomai/lib/libnative.so.3
> #3 0x0ffad8b4 in wind_task_sigharden () from
> /opt/eldk/ppc_4xx/usr/xenomai/lib/libvxworks.so.1 #4 0x0ff56f78 in
> rt_task_sigharden () from /opt/eldk/ppc_4xx/usr/xenomai/lib/libnative.so.3
The disassembler tells me:
> (gdb) x /10i 0x0ffad8a0
> 0xffad8a0 <wind_task_sigharden+48>: lwz r0,-32764(r30)
> 0xffad8a4 <wind_task_sigharden+52>: cmpw cr7,r9,r0
> 0xffad8a8 <wind_task_sigharden+56>: beq- cr7,0xffad8b4
> <wind_task_sigharden+68> 0xffad8ac <wind_task_sigharden+60>: mtctr r9
> 0xffad8b0 <wind_task_sigharden+64>: bctrl
> 0xffad8b4 <wind_task_sigharden+68>: lis r0,512
> 0xffad8> static irqreturn_t cpld_interrupt(int irq, void *dev_id)
> b8 <wind_task_sigharden+72>: ori r0,r0,555
> 0xffad8bc <wind_task_sigharden+76>: li r3,1
> 0xffad8c0 <wind_task_sigharden+80>: sc
> 0xffad8c4 <wind_task_sigharden+84>: mfcr r0
> (gdb) x /10i 0x0ff56f60
> 0xff56f60 <rt_task_sigharden+44>: beq- cr7,0xff56f78
> <rt_task_sigharden+68> 0xff56f64 <rt_task_sigharden+48>: lwz
> r0,-32764(r30)
> 0xff56f68 <rt_task_sigharden+52>: cmpw cr7,r9,r0
> 0xff56f6c <rt_task_sigharden+56>: beq- cr7,0xff56f78
> <rt_task_sigharden+68> 0xff56f70 <rt_task_sigharden+60>: mtctr r9
> 0xff56f74 <rt_task_sigharden+64>: bctrl
> 0xff56f78 <rt_task_sigharden+68>: lis r0,512
> 0xff56f7c <rt_task_sigharden+72>: ori r0,r0,555
> 0xff56f80 <rt_task_sigharden+76>: li r3,1
> 0xff56f84 <rt_task_sigharden+80>: sc
> (gdb)
Here some interrupt related infos:
> cat /proc/interrupts
> CPU0
> 16: 589 UIC Level serial
> 17: 12114 UIC Level MAL TX EOB
> 18: 16702 UIC Level MAL RX EOB
> 19: 0 UIC Level CAN_0
> 20: 0 UIC Level CAN_1
> 21: 0 UIC Level MAL SERR
> 22: 0 UIC Level MAL TX DE
> 23: 0 UIC Level MAL RX DE
> 24: 0 UIC Level EMAC
> 25: 0 UIC Level CPLD
> BAD: 0
> -bash-3.2# cat /proc/xenomai/irq
> IRQ CPU0
> 19: 1 intr_19
> 25: 0 intr_25
> 512: 202313 [virtual]
> 515: 229 [virtual]
Here are is the kernel code of my interrupt handlers:
> {
> #if 1
> /* TODO: make interval selectable */
> out_be16(tick_ctrl_reg, TICK_INT_ENABLE | TICK_INT_RESET |
> TICK_START | TICK_INTERVAL_1000_US);
> out_be16(tick_ctrl_reg, TICK_INT_ENABLE |
> TICK_START | TICK_INTERVAL_1000_US);
> #endif
> return IRQ_HANDLED;
> }
>
> /* can_interrupt is just a placeholder for the xenomai IRQ object. But it
> * needs to be here. Else it is not possible to create a (XENOMAI)
> interrupt * object from user-space.
> */
>
> static irqreturn_t can_interrupt(int irq, void *dev_id)
> {
> return IRQ_HANDLED;
> }
If I restart the program a second time, I usually have no problem.
Has anybody an idea, what is going wrong?
Best regards
--
NIklaus Giger
_______________________________________________
Xenomai-help mailing list
[email protected]
https://mail.gna.org/listinfo/xenomai-help