Other Parts Discussed in Thread: SYSBIOS, SYSCONFIG
Tool/software: TI-RTOS
Hello, I am having an intermittent (but repeatable) problem with my SYS/BIOS application. I'm hoping that someone can help me to determine how best to proceed in tracking down this unusual problem.
I am running SYS/BIOS on the C66x core of an AM5716 processor. I have a single interrupt in the system; it is triggered on the rising edge of a GPIO pin. I have found that the system occasionally becomes unresponsive, and when I break in with the XDS200 JTAG emulator, I always find the following error signature:
- The PC is at abort() in exit.c, meaning that SYS/BIOS has shut down.
- The Exception module in the ROV shows that an internal exception has occurred.
- The decoded exception is: Internal: Instruction fetch exception; Opcode exception;
- The address of the exception (the ERP register) is the address of ti_sysbios_family_c64p_Hwi_int15; this is the vector for the interrupt that I am using.
- The exception TSR snapshot register (ETSR) has the value 0x10204, indicating that an interrupt was being processed when the exception occurred.
- The stack pointer is in the valid range, and ROV does not show stack or heap overflows.
- The interrupt return pointer (IRP) is set to the address of a particular trampoline function in my firmware (let's call it $Tramp$S$$MyFunctionName). The target of the trampoline is the function MyFunctionName, which lives in external memory (DDR).
The best clue that I have is the consistent interrupt return pointer when the exception occurs. Based on the exception return pointer, the exception occurs upon reaching ti_sysbios_family_c64p_Hwi_int15, not returning from it (i.e., at the very beginning of the interrupt handling, not the end). I have verified that there is nothing wrong with the opcode at ti_sysbios_family_c64p_Hwi_int15, but the decoded internal exception values are instruction fetch exception and opcode exception.
So it seems that the exception happens only when the interrupt occurs at the precise moment that the PC is at the address $Tramp$S$$MyFunctionName (the very beginning of the trampoline, not even after the branch)... but this doesn't make any sense to me! Thanks in advance for any guesses or ideas on what else I can do to debug this issue.
Best regards,
Dave