Пример #1
0
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
}
Пример #2
0
/*
 * 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;
}
Пример #3
0
/*
 * 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;
}
Пример #4
0
/*
 * 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;
}
Пример #5
0
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");
}
Пример #6
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);
}
Пример #7
0
  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
*/