joryn wrote on Wednesday, July 07, 2010:
I may have found something of a problem with the way that the PSoC ide manages the RAM vector table. Below is the code for the ROM version of the vector table. Note that it properly sets up the initial stack pointer:
__attribute__ ((section(".romvectors")))
void (* RomVectors[])(void) =
{
(void (*)(void))((unsigned long) &Image$$ARM_LIB_STACK$$ZI$$Limit), /* The initial stack pointer */
Reset, /* The reset handler 0 */
IntDefaultHandler, /* The NMI handler 1 */
IntDefaultHandler, /* The hard fault handler 2 */
IntDefaultHandler, /* The MPU fault handler 3 */
IntDefaultHandler, /* The bus fault handler 4 */
IntDefaultHandler, /* The usage fault handler 5 */
0, /* Reserved 6 */
0, /* Reserved 7 */
0, /* Reserved 8 */
0, /* Reserved 9 */
IntDefaultHandler, /* SVCall handler 10 */
IntDefaultHandler, /* Debug monitor handler 11 */
0, /* Reserved 12 *//
IntDefaultHandler, /* The PendSV handler 13 */
IntDefaultHandler, /* The SysTick handler 14 */
IntDefaultHandler, /* External Interrupt(0) 15 */
IntDefaultHandler, /* External Interrupt(1) 16 */
IntDefaultHandler, /* External Interrupt(2) 17 */
IntDefaultHandler, /* External Interrupt(3) 18 */
IntDefaultHandler, /* External Interrupt(4) 19 */
IntDefaultHandler, /* External Interrupt(5) 20 */
IntDefaultHandler, /* External Interrupt(6) 21 */
IntDefaultHandler, /* External Interrupt(7) 22 */
IntDefaultHandler, /* External Interrupt(8) 23 */
IntDefaultHandler, /* External Interrupt(9) 24 */
IntDefaultHandler, /* External Interrupt(A) 25 */
IntDefaultHandler, /* External Interrupt(B) 26 */
IntDefaultHandler, /* External Interrupt(C) 27 */
IntDefaultHandler, /* External Interrupt(D) 28 */
IntDefaultHandler, /* External Interrupt(E) 29 */
IntDefaultHandler, /* External Interrupt(F) 30 */
IntDefaultHandler, /* External Interrupt(10) 31 */
IntDefaultHandler, /* External Interrupt(11) 32 */
IntDefaultHandler, /* External Interrupt(12) 33 */
IntDefaultHandler, /* External Interrupt(13) 34 */
IntDefaultHandler, /* External Interrupt(14) 35 */
IntDefaultHandler, /* External Interrupt(15) 36 */
IntDefaultHandler, /* External Interrupt(16) 37 */
IntDefaultHandler, /* External Interrupt(17) 38 */
IntDefaultHandler, /* External Interrupt(18) 39 */
IntDefaultHandler, /* External Interrupt(19) 40 */
IntDefaultHandler, /* External Interrupt(1A) 41 */
IntDefaultHandler, /* External Interrupt(1B) 42 */
IntDefaultHandler, /* External Interrupt(1C) 43 */
IntDefaultHandler, /* External Interrupt(1D) 44 */
IntDefaultHandler, /* External Interrupt(1E) 45 */
IntDefaultHandler /* External Interrupt(1F) 46 */
};
And here is the code for how it sets up the RAM vector table…at least initially. The FreeRTOS handlers are initialized later. What I find most interesting is that they don’t re-specify the initial stack pointer.
__attribute__ ((section(".ramvectors"))) cyisraddress CyRamVectors[NUM_INTERRUPTS];
void $Sub$$main(void)
{
unsigned long index;
/* Setup the M3. */
/* Set Priority group 5. */
/* Writes to the NVIC_APINT register require the VECTKEY in the upper half */
*NVIC_APINT = NVIC_APINT_VECTKEY | NVIC_APINT_PRIGROUP_3_5;
/* Set Ram interrupt vectors to default functions. */
for(index = 0; index < NUM_INTERRUPTS; index++)
{
CyRamVectors[index] = IntDefaultHandler;
}
/* Point NVIC at the RAM vector table. */
*CYINT_VECTORS = (cyisraddress) CyRamVectors;
}
I’m thinking that it’s possible that the stack pointer is not being setup correctly by FreeRTOS and thus is causing the issues that I’m seeing here. What do you guys think?
Thanks again,
Joe