#ifndef ISR_H_\r
#define ISR_H_\r
\r
+#include "task_i.h"\r
+#include "resource_i.h"\r
+\r
/*\r
* INCLUDE "RULES"\r
- * Since this types and methods defined here are used by the drivers, they should\r
+ * Since the types and methods defined here are used by the drivers, they should\r
* include it. E.g. #include "isr.h"\r
*\r
* This file is also used internally by the kernel\r
#define ISR_TYPE_2 1\r
\r
/* ----------------------------[macro]---------------------------------------*/\r
+#if 0\r
+//#ifdef CFG_DRIVERS_USE_CONFIG_ISRS\r
+#define ISR_INSTALL_ISR2( _name, _entry, _vector, _priority, _app )\r
+#define ISR_INSTALL_ISR1(_name,_entry, _vector,_priority,_app)\r
+#else\r
#define ISR_DECLARE_ISR2(_name, _entry, _unique, _vector,_priority,_app ) \\r
- const OsIsrConstType _entry ## _unique = { \\r
+ static const OsIsrConstType _entry ## _unique = { \\r
.vector = _vector, \\r
.type = ISR_TYPE_2, \\r
.priority = _priority, \\r
.appOwner = _app, \\r
}; \\r
\r
-#define _ISR_INSTALL_ISR2(_name, _entry, _unique, _vector,_priority,_app ) \\r
+\r
+#define __ISR_INSTALL_ISR2(_name, _entry, _unique, _vector,_priority,_app ) \\r
do { \\r
- const OsIsrConstType _entry ## _unique = { \\r
+ static const OsIsrConstType _entry ## _unique = { \\r
.vector = _vector, \\r
.type = ISR_TYPE_2, \\r
.priority = _priority, \\r
Os_IsrAdd( & _entry ## _unique); \\r
} while(0);\r
\r
+\r
+\r
+#define _ISR_INSTALL_ISR2(_name,_entry, _unique, _vector,_priority,_app) \\r
+ __ISR_INSTALL_ISR2(_name,_entry, _unique, _vector,_priority,_app)\r
+\r
#define ISR_INSTALL_ISR2(_name,_entry, _vector,_priority,_app) \\r
_ISR_INSTALL_ISR2(_name,_entry, __LINE__, _vector,_priority,_app)\r
\r
\r
+#define ISR_DECLARE_ISR1(_name, _entry, _unique, _vector,_priority,_app ) \\r
+ static const OsIsrConstType _entry ## _unique = { \\r
+ .vector = _vector, \\r
+ .type = ISR_TYPE_1, \\r
+ .priority = _priority, \\r
+ .entry = _entry, \\r
+ .name = _name, \\r
+ .resourceMask = 0, \\r
+ .timingProtPtr = NULL, \\r
+ .appOwner = _app, \\r
+ }; \\r
+\r
+#define __ISR_INSTALL_ISR1(_name, _entry, _unique, _vector,_priority,_app ) \\r
+ do { \\r
+ static const OsIsrConstType _entry ## _unique = { \\r
+ .vector = _vector, \\r
+ .type = ISR_TYPE_1, \\r
+ .priority = _priority, \\r
+ .entry = _entry, \\r
+ .name = _name, \\r
+ .resourceMask = 0, \\r
+ .timingProtPtr = NULL, \\r
+ .appOwner = _app, \\r
+ }; \\r
+ Os_IsrAdd( & _entry ## _unique); \\r
+ } while(0);\r
+\r
+#define _ISR_INSTALL_ISR1(_name,_entry, _unique, _vector,_priority,_app) \\r
+ __ISR_INSTALL_ISR1(_name,_entry, _unique, _vector,_priority,_app)\r
+\r
+#define ISR_INSTALL_ISR1(_name,_entry, _vector,_priority,_app) \\r
+ _ISR_INSTALL_ISR1(_name,_entry, __LINE__, _vector,_priority,_app)\r
+\r
+#endif\r
+\r
/* ----------------------------[typedef]-------------------------------------*/\r
\r
\r
* OsIsrTimingProtection[C] 0..1\r
* */\r
\r
-typedef struct {\r
+typedef struct OsIsrConst {\r
const char *name;\r
uint8_t core;\r
int16_t vector;\r
/*\r
*\r
*/\r
-typedef struct {\r
+typedef struct OsIsrVar{\r
ISRType id;\r
- OsIsrStackType stack;\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
\r
\r
/* ----------------------------[functions]-----------------------------------*/\r
\r
+#if OS_ISR_MAX_CNT!=0\r
+extern OsIsrVarType Os_IsrVarList[OS_ISR_MAX_CNT];\r
+#endif\r
+\r
void Os_IsrInit( void );\r
ISRType Os_IsrAdd( const OsIsrConstType * restrict isrPtr );\r
-const OsIsrConstType * Os_IsrGet( int16_t vector);\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
+#endif\r
+\r
+static inline const OsIsrVarType *Os_IsrGet( ISRType id ) {\r
+#if OS_ISR_CNT != 0\r
+ return &Os_IsrVarList[id];\r
+#else\r
+ (void)id;\r
+ return NULL;\r
+#endif\r
+}\r
+\r
+static inline ApplicationType Os_IsrGetApplicationOwner( ISRType id ) {\r
+ ApplicationType rv = INVALID_OSAPPLICATION;\r
+\r
+#if (OS_ISR_CNT!=0)\r
+ if( id < OS_ISR_CNT ) {\r
+ rv = Os_IsrGet(id)->constPtr->appOwner;\r
+ }\r
+#else\r
+ (void)id;\r
+#endif\r
+ return rv;\r
+}\r
+\r
+static inline void Os_IsrResourceAdd( OsResourceType *rPtr, OsIsrVarType *isrPtr) {\r
+ /* Save old task prio in resource and set new task prio */\r
+ rPtr->owner = isrPtr->id;\r
+\r
+ assert( rPtr->type != RESOURCE_TYPE_INTERNAL );\r
+}\r
+\r
+static inline void Os_IsrResourceRemove( OsResourceType *rPtr , OsIsrVarType *isrPtr) {\r
+ assert( rPtr->owner == isrPtr->id );\r
+ rPtr->owner = NO_TASK_OWNER;\r
+\r
+ if( rPtr->type != RESOURCE_TYPE_INTERNAL ) {\r
+ /* The list can't be empty here */\r
+ assert( !TAILQ_EMPTY(&isrPtr->resourceHead) );\r
+\r
+ /* The list should be popped in LIFO order */\r
+ assert( TAILQ_LAST(&isrPtr->resourceHead, head) == rPtr );\r
+\r
+ /* Remove the entry */\r
+ TAILQ_REMOVE(&isrPtr->resourceHead, rPtr, listEntry);\r
+ }\r
+}\r
+\r
+static inline void Os_IsrResourceFreeAll( OsIsrVarType *isrPtr ) {\r
+ OsResourceType *rPtr;\r
+\r
+ /* Pop the queue */\r
+ TAILQ_FOREACH(rPtr, &isrPtr->resourceHead, listEntry ) {\r
+ Os_IsrResourceRemove(rPtr,isrPtr);\r
+ }\r
+}\r
+\r
+static inline _Bool Os_IsrOccupiesResources( OsIsrVarType *isrPtr ) {\r
+ return !(TAILQ_EMPTY(&isrPtr->resourceHead));\r
+}\r
+\r
+\r
+\r
+\r
\r
#endif /*ISR_H_*/\r