/**************************************************************************** * * NAME: vOSError * * DESCRIPTION: * Catches any unexpected OS errors * * RETURNS: * void * ****************************************************************************/ PUBLIC void vOSError(OS_teStatus eStatus, void *hObject) { OS_thTask hTask; /* ignore queue underruns */ if ((OS_E_QUEUE_EMPTY == eStatus) || ((eStatus >= OS_E_SWTIMER_STOPPED) && (eStatus <= OS_E_SWTIMER_RUNNING))) { return; } DBG_vPrintf(TRACE_EXCEPTION, "OS Error %d, offending object handle = 0x%08x\n", eStatus, hObject); /* NB the task may have been pre-empted by an ISR which may be at fault */ OS_eGetCurrentTask(&hTask); DBG_vPrintf(TRACE_EXCEPTION, "Currently active task handle = 0x%08x\n", hTask); #ifdef OS_STRICT_CHECKS DBG_vPrintf(TRACE_EXCEPTION, "Currently active ISR fn address = 0x%08x\n", OS_prGetActiveISR()); #endif #if HALT_ON_EXCEPTION DBG_vDumpStack(); if ((eStatus < OS_E_SWTIMER_STOPPED) || (eStatus > OS_E_SWTIMER_RUNNING)) { while(1); } #endif }
/**************************************************************************** * * NAME: vUnclaimedInterrupt * * DESCRIPTION: * Catches any unexpected interrupts * * RETURNS: * void * ****************************************************************************/ PUBLIC void vUnclaimedInterrupt(void) { DBG_vPrintf(TRACE_EXCEPTION, "Unclaimed interrupt\n"); DBG_vDumpStack(); #if HALT_ON_EXCEPTION while (1); #else vAHI_SwReset(); #endif }
/**************************************************************************** * * NAME: vAppMain * * DESCRIPTION: * Entry point for application from a cold start. * * RETURNS: * void * ****************************************************************************/ PUBLIC void vAppMain(void) { #if JENNIC_CHIP_FAMILY == JN516x /* Wait until FALSE i.e. on XTAL - otherwise uart data will be at wrong speed */ while (bAHI_GetClkSource() == TRUE); /* Now we are running on the XTAL, optimise the flash memory wait states */ vAHI_OptimiseWaitStates(); #endif /* * Don't use RTS/CTS pins on UART0 as they are used for buttons * */ vAHI_UartSetRTSCTS(E_AHI_UART_0, FALSE); /* * Initialize the debug diagnostics module to use UART0 at 115K Baud; * Do not use UART 1 if LEDs are used, as it shares DIO with the LEDS * */ DBG_vUartInit(DBG_E_UART_0, DBG_E_UART_BAUD_RATE_115200); DBG_vPrintf(TRACE_START, "\nAPP Start: Switch Power Up"); /* * Initialise the stack overflow exception to trigger if the end of the * stack is reached. See the linker command file to adjust the allocated * stack size. */ vAHI_SetStackOverflow(TRUE, (uint32)&_stack_low_water_mark); /* * Catch resets due to watchdog timer expiry. Comment out to harden code. */ if (bAHI_WatchdogResetEvent()) { DBG_vPrintf(TRACE_START, "\nAPP Start: Watchdog timer has reset device!"); DBG_vDumpStack(); #if HALT_ON_EXCEPTION vAHI_WatchdogStop(); while (1); #endif } /* initialise ROM based software modules */ #ifndef JENNIC_MAC_MiniMacShim u32AppApiInit(NULL, NULL, NULL, NULL, NULL, NULL); #endif /* Define HIGH_POWER_ENABLE to enable high power module */ #ifdef HIGH_POWER_ENABLE vAHI_HighPowerModuleEnable(TRUE, TRUE); #endif /* start the RTOS */ OS_vStart(vInitialiseApp, vUnclaimedInterrupt, vOSError); DBG_vPrintf(TRACE_START, "OS started\n"); /* idle task commences here */ while (TRUE) { /* Re-load the watch-dog timer. Execution must return through the idle * task before the CPU is suspended by the power manager. This ensures * that at least one task / ISR has executed with in the watchdog period * otherwise the system will be reset. */ DBG_vPrintf(TRACE_START, "#"); vAHI_WatchdogRestart(); /* * suspends CPU operation when the system is idle or puts the device to * sleep if there are no activities in progress */ PWRM_vManagePower(); DBG_vPrintf(TRACE_START, "?"); } }