void MIPS32 IntConfigureSystem(u8 mode) { unsigned int temp; asm("di"); // Disable all interrupts temp = _CP0_GET_STATUS(); // Get Status temp |= 0x00400000; // Set BEV bit _CP0_SET_STATUS(temp); // Update Status #if defined(PIC32_PINGUINO_220) || defined(GENERIC32MX250F128) || defined(GENERIC32MX220F032) _CP0_SET_EBASE(0xBD003000); // Set an EBase value of 0xBD003000 #else _CP0_SET_EBASE(0xBD005000); // Set an EBase value of 0xBD005000 #endif _CP0_SET_INTCTL(0x00000020); // Set the Vector Spacing to non-zero value temp = _CP0_GET_CAUSE(); // Get Cause temp |= 0x00800000; // Set IV _CP0_SET_CAUSE(temp); // Update Cause temp = _CP0_GET_STATUS(); // Get Status temp &= 0xFFBFFFFD; // Clear BEV and EXL _CP0_SET_STATUS(temp); // Update Status switch (mode) { case INT_SYSTEM_CONFIG_MULT_VECTOR: // Set the CP0 registers for multi-vector interrupt INTCONSET = 0x1000; // Set MVEC bit break; case INT_SYSTEM_CONFIG_SINGLE_VECTOR: // Set the CP0 registers for single-vector interrupt INTCONCLR = 0x1000; // Clear MVEC bit break; } asm("ei"); // Enable all interrupts }
/* * See header file for description. */ StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) { /* Ensure byte alignment is maintained when leaving this function. */ pxTopOfStack--; *pxTopOfStack = (StackType_t) 0xDEADBEEF; pxTopOfStack--; *pxTopOfStack = (StackType_t) 0x12345678; /* Word to which the stack pointer will be left pointing after context restore. */ pxTopOfStack--; *pxTopOfStack = (StackType_t) _CP0_GET_CAUSE(); pxTopOfStack--; *pxTopOfStack = (StackType_t) portINITIAL_SR;/* CP0_STATUS */ pxTopOfStack--; *pxTopOfStack = (StackType_t) pxCode; /* CP0_EPC */ pxTopOfStack--; *pxTopOfStack = (StackType_t) portTASK_RETURN_ADDRESS; /* ra */ pxTopOfStack -= 15; *pxTopOfStack = (StackType_t) pvParameters; /* Parameters to pass in. */ pxTopOfStack -= 15; return pxTopOfStack; }
/* * See header file for description. */ portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters ) { /* Ensure byte alignment is maintained when leaving this function. */ pxTopOfStack--; *pxTopOfStack = (portSTACK_TYPE) 0xDEADBEEF; pxTopOfStack--; *pxTopOfStack = (portSTACK_TYPE) 0x12345678; /* Word to which the stack pointer will be left pointing after context restore. */ pxTopOfStack--; *pxTopOfStack = (portSTACK_TYPE) _CP0_GET_CAUSE(); pxTopOfStack--; *pxTopOfStack = (portSTACK_TYPE) portINITIAL_SR; /* CP0_STATUS */ pxTopOfStack--; *pxTopOfStack = (portSTACK_TYPE) pxCode; /* CP0_EPC */ pxTopOfStack--; *pxTopOfStack = (portSTACK_TYPE) NULL; /* ra */ pxTopOfStack -= 15; *pxTopOfStack = (portSTACK_TYPE) pvParameters; /* Parameters to pass in */ pxTopOfStack -= 14; *pxTopOfStack = (portSTACK_TYPE) 0x00000000; /* critical nesting level - no longer used. */ pxTopOfStack--; return pxTopOfStack; }
/* * See header file for description. */ StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) { /* Ensure 8 byte alignment is maintained when leaving this function. */ pxTopOfStack--; pxTopOfStack--; *pxTopOfStack = (StackType_t) 0xDEADBEEF; pxTopOfStack--; *pxTopOfStack = (StackType_t) 0x12345678; /* Word to which the stack pointer will be left pointing after context restore. */ pxTopOfStack--; *pxTopOfStack = (StackType_t) _CP0_GET_CAUSE(); pxTopOfStack--; *pxTopOfStack = (StackType_t) portINITIAL_SR;/* CP0_STATUS */ pxTopOfStack--; *pxTopOfStack = (StackType_t) pxCode; /* CP0_EPC */ pxTopOfStack--; *pxTopOfStack = (StackType_t) 0x00000000; /* DSPControl */ pxTopOfStack -= 7; /* Includes space for AC1 - AC3. */ *pxTopOfStack = (StackType_t) portTASK_RETURN_ADDRESS; /* ra */ pxTopOfStack -= 15; *pxTopOfStack = (StackType_t) pvParameters; /* Parameters to pass in. */ pxTopOfStack -= 15; *pxTopOfStack = (StackType_t) pdFALSE; /*by default disable FPU context save on parts with FPU */ return pxTopOfStack; }
void __attribute__((weak, nomips16)) _general_exception_handler (void) { char buff[SYS_CONSOLE_BUFFER_LEN]; uint32_t epc, cause; int cause_ix; const char* cause_str; snprintf(buff, SYS_CONSOLE_BUFFER_LEN, "\n\rSystem Exception Handler entered.\n\r"); (debug_handle->pObj->print)(debug_handle->obHandle, buff); epc = _CP0_GET_EPC(); cause = _CP0_GET_CAUSE(); cause_ix = (cause & _CP0_CAUSE_EXCCODE_MASK) >> _CP0_CAUSE_EXCCODE_POSITION; if(cause_ix < sizeof(_sys_excep_tbl)/sizeof(*_sys_excep_tbl)) { cause_str = _sys_excep_tbl[cause_ix]; } else { cause_str = "Unidentified"; } snprintf(buff, SYS_CONSOLE_BUFFER_LEN, "\n\rA %s type exception occurred at address: 0x%08x\n\r", cause_str, epc); (debug_handle->pObj->print)(debug_handle->obHandle, buff); snprintf(buff, SYS_CONSOLE_BUFFER_LEN, "\n\rSystem will halt!\n\r"); (debug_handle->pObj->print)(debug_handle->obHandle, buff); // break into the debugger __asm__ volatile (" sdbbp 0"); }
void _general_exception_handler(void) { volatile int code; volatile int intlev; _excep_vaddr = _CP0_GET_BADVADDR(); _excep_code = _CP0_GET_CAUSE(); _excep_code = (_excep_code & 0x0000007C) >> 2; /* Try to show what has happened. */ code = (_excep_code & 0x000000FF) >> 2; intlev =(_excep_code & 0x0000FF00) >> 10; while(1); }
Summary: Overrides the XC32 _weak_ _generic_exception_handler. Description: This function overrides the XC32 default _weak_ _generic_exception_handler. Remarks: Refer to the XC32 User's Guide for additional information. */ void _general_exception_handler ( void ) { /* Mask off Mask of the ExcCode Field from the Cause Register Refer to the MIPs Software User's manual */ _excep_code = (_CP0_GET_CAUSE() & 0x0000007C) >> 2; _excep_addr = _CP0_GET_EPC(); _cause_str = cause[_excep_code]; SYS_DEBUG_PRINT(SYS_ERROR_FATAL, "\n\rGeneral Exception %s (cause=%d, addr=%x).\n\r", _cause_str, _excep_code, _excep_addr); while (1) { SYS_DEBUG_BreakPoint(); } } /******************************************************************************* End of File */