}
stack = (uint32_t *)stack_p;
-
- /*
- struct OsTaskVar * pcb = (struct OsTaskVar *)Irq_VectorTable[virtualChannel];
- // Save the hardware channel in the PCB, so that Os_Isr knows which interrupt channel to deactivate.
- pcb->vector = channel;
- */
- // Don't know what to pass here yet. Use the virtual channel for now, but
- // probably need to pass channel as well.
- stack = Os_Isr(stack, virtualChannel);
+ stack = Os_Isr_cr4(stack, virtualChannel, channel);
//Irq_Enable();
return stack;
return (prio>>1);
}
-/**
- * Attach a ISR type 2 to the interrupt controller.
- *
- * @param tid
- * @param int_ctrl
- * @param vector
- */
-/*
-void Irq_AttachIsr2(TaskType tid,void *int_ctrl,IrqType vector ) {
- OsTaskVarType *pcb;
-
- pcb = Os_TaskGet(tid);
- Irq_VectorTable[vector] = (void *)pcb;
- IrqActivateChannel(vector);
-
- // TOdo replace NVIC_InitVector(vector, osPrioToCpuPio(pcb->prio));
-}
-*/
void Irq_EnableVector( int16_t vector, int priority, int core ) {
if (vector < NUMBER_OF_INTERRUPTS_AND_EXCEPTIONS) {
\r
\r
#define Irq_SOI() \\r
- IrqDeactivateChannel(isrPtr->constPtr->vector)\r
+ IrqDeactivateChannel(isrPtr->activeVector)\r
\r
\r
#define Irq_EOI() \\r
- IrqActivateChannel(isrPtr->constPtr->vector)\r
+ IrqActivateChannel(isrPtr->activeVector)\r
\r
\r
typedef enum {\r
// OsIsrStackType stack;\r
int state;\r
const OsIsrConstType *constPtr;\r
+#if defined(CFG_ARM_CR4)\r
+ int16_t activeVector;\r
+#endif\r
+\r
/* List of resource held by this ISR */\r
TAILQ_HEAD(,OsResource) resourceHead;\r
} OsIsrVarType;\r
ISRType Os_IsrAdd( const OsIsrConstType * restrict isrPtr );\r
void Os_IsrGetStackInfo( OsIsrStackType *stack );\r
void *Os_Isr( void *stack, int16_t vector);\r
+#if defined(CFG_ARM_CR4)\r
+void *Os_Isr_cr4( void *stack, int16_t virtualVector, int16_t vector );\r
+#endif\r
#if defined(CFG_ARM_CM3)\r
void Os_Isr_cm3( int16_t vector );\r
void TailChaining(void *stack);\r
}\r
\r
\r
+#if defined(CFG_ARM_CR4)\r
+void *Os_Isr_cr4( void *stack, int16_t virtualVector, int16_t vector ) {\r
+ OsIsrVarType *isrPtr = &Os_IsrVarList[Os_VectorToIsr[virtualVector]];\r
+ isrPtr->activeVector = vector;\r
+ return Os_Isr(stack, virtualVector);\r
+}\r
+#endif\r
+\r
/**\r
* Handle ISR type 2 interrupts from interrupt controller.\r
*\r
* @param vector\r
*/\r
void *Os_Isr( void *stack, int16_t vector ) {\r
+\r
OsIsrVarType *isrPtr = &Os_IsrVarList[Os_VectorToIsr[vector]];\r
OsTaskVarType *taskPtr = NULL;\r
\r