1 /* -------------------------------- Arctic Core ------------------------------
\r
2 * Arctic Core - the open source AUTOSAR platform http://arccore.com
\r
4 * Copyright (C) 2009 ArcCore AB <contact@arccore.com>
\r
6 * This source code is free software; you can redistribute it and/or modify it
\r
7 * under the terms of the GNU General Public License version 2 as published by the
\r
8 * Free Software Foundation; See <http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt>.
\r
10 * This program is distributed in the hope that it will be useful, but
\r
11 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
\r
12 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
\r
14 * -------------------------------- Arctic Core ------------------------------*/
\r
20 #include "resource_i.h"
\r
24 * Since this types and methods defined here are used by the drivers, they should
\r
25 * include it. E.g. #include "isr.h"
\r
27 * This file is also used internally by the kernel
\r
30 * irq_types.h ( Vector enums )
\r
31 * irq.h ( Interface )
\r
34 * Os_Cfg.h needs types from isr.h
\r
38 /* ----------------------------[includes]------------------------------------*/
\r
39 /* ----------------------------[define]--------------------------------------*/
\r
41 #define ISR_TYPE_1 0
\r
42 #define ISR_TYPE_2 1
\r
44 /* ----------------------------[macro]---------------------------------------*/
\r
45 #define ISR_DECLARE_ISR2(_name, _entry, _unique, _vector,_priority,_app ) \
\r
46 const OsIsrConstType _entry ## _unique = { \
\r
47 .vector = _vector, \
\r
48 .type = ISR_TYPE_2, \
\r
49 .priority = _priority, \
\r
52 .resourceMask = 0, \
\r
53 .timingProtPtr = NULL, \
\r
57 #define _ISR_INSTALL_ISR2(_name, _entry, _unique, _vector,_priority,_app ) \
\r
59 const OsIsrConstType _entry ## _unique = { \
\r
60 .vector = _vector, \
\r
61 .type = ISR_TYPE_2, \
\r
62 .priority = _priority, \
\r
65 .resourceMask = 0, \
\r
66 .timingProtPtr = NULL, \
\r
69 Os_IsrAdd( & _entry ## _unique); \
\r
72 #define ISR_INSTALL_ISR2(_name,_entry, _vector,_priority,_app) \
\r
73 _ISR_INSTALL_ISR2(_name,_entry, __LINE__, _vector,_priority,_app)
\r
76 /* ----------------------------[typedef]-------------------------------------*/
\r
80 /* STD container : OsIsrResourceLock
\r
83 * OsIsrResourceLockBudget 1 Float in seconds (MAXRESOURCELOCKINGTIME)
\r
84 * OsIsrResourceLockResourceRef 1 Ref to OsResource
\r
87 typedef struct OsIsrResourceLock {
\r
88 uint32_t lockBudget;
\r
89 uint32_t lockResourceRef; /* Wrong type */
\r
90 } OsIsrResourceLockType;
\r
93 /* STD container : OsIsrTimingProtection
\r
96 * OsIsrAllInterruptLockBudget 0..1 float
\r
97 * OsIsrExecutionBudget 0..1 float
\r
98 * OsIsrOsInterruptLockBudget 0..1 float
\r
99 * OsIsrTimeFrame 0..1 float
\r
100 * OsIsrResourceLock[C] 0..*
\r
103 typedef struct OsIsrTimingProtection {
\r
104 uint32_t allInterruptLockBudget;
\r
105 uint32_t executionBudget;
\r
106 uint32_t osInterruptLockBudget;
\r
107 uint32_t timeFrame;
\r
108 uint32_t resourceLock; /* Wrong type */
\r
109 } OsIsrTimingProtectionType;
\r
112 void *curr; /* Current stack ptr( at swap time ) */
\r
113 void *top; /* Top of the stack( low address ) */
\r
114 uint32 size; /* The size of the stack */
\r
118 /* STD container : OsIsr
\r
121 * OsIsrCategory: 1 CATEGORY_1 or CATEGORY_2
\r
122 * OsIsrResourceRef: 0..* Reference to OsResources
\r
123 * OsIsrTimingProtection[C] 0..1
\r
134 /* Mapped against OsIsrResourceRef */
\r
135 uint32_t resourceMask;
\r
136 #if ( OS_USE_ISR_TIMING_PROT == STD_ON )
\r
137 /* Mapped against OsIsrTimingProtection[C] */
\r
138 OsIsrTimingProtectionType *timingProtPtr;
\r
140 void *timingProtPtr;
\r
149 // OsIsrStackType stack;
\r
151 const OsIsrConstType *constPtr;
\r
152 /* List of resource held by this ISR */
\r
153 TAILQ_HEAD(,OsResource) resourceHead;
\r
157 /* ----------------------------[functions]-----------------------------------*/
\r
159 #if OS_ISR_MAX_CNT!=0
\r
160 extern OsIsrVarType Os_IsrVarList[OS_ISR_MAX_CNT];
\r
163 void Os_IsrInit( void );
\r
164 ISRType Os_IsrAdd( const OsIsrConstType * restrict isrPtr );
\r
165 void Os_IsrGetStackInfo( OsIsrStackType *stack );
\r
166 void *Os_Isr( void *stack, int16_t vector);
\r
167 #if defined(CFG_ARM_CM3)
\r
168 void Os_Isr_cm3( void *isr_p );
\r
169 void TailChaining(void *stack);
\r
172 static inline const OsIsrVarType *Os_IsrGet( ISRType id ) {
\r
173 return &Os_IsrVarList[id];
\r
176 static inline ApplicationType Os_IsrGetApplicationOwner( ISRType id ) {
\r
177 ApplicationType rv = INVALID_OSAPPLICATION;
\r
179 #if (OS_ISR_CNT!=0)
\r
180 if( id < OS_ISR_CNT ) {
\r
181 rv = Os_IsrGet(id)->constPtr->appOwner;
\r
187 static inline void Os_IsrResourceAdd( OsResourceType *rPtr, OsIsrVarType *isrPtr) {
\r
188 /* Save old task prio in resource and set new task prio */
\r
189 rPtr->owner = isrPtr->id;
\r
191 assert( rPtr->type != RESOURCE_TYPE_INTERNAL );
\r
194 static inline void Os_IsrResourceRemove( OsResourceType *rPtr , OsIsrVarType *isrPtr) {
\r
195 assert( rPtr->owner == isrPtr->id );
\r
196 rPtr->owner = NO_TASK_OWNER;
\r
198 if( rPtr->type != RESOURCE_TYPE_INTERNAL ) {
\r
199 /* The list can't be empty here */
\r
200 assert( !TAILQ_EMPTY(&isrPtr->resourceHead) );
\r
202 /* The list should be popped in LIFO order */
\r
203 assert( TAILQ_LAST(&isrPtr->resourceHead, head) == rPtr );
\r
205 /* Remove the entry */
\r
206 TAILQ_REMOVE(&isrPtr->resourceHead, rPtr, listEntry);
\r
210 static inline void Os_IsrResourceFreeAll( OsIsrVarType *isrPtr ) {
\r
211 OsResourceType *rPtr;
\r
213 /* Pop the queue */
\r
214 TAILQ_FOREACH(rPtr, &isrPtr->resourceHead, listEntry ) {
\r
215 Os_IsrResourceRemove(rPtr,isrPtr);
\r
219 static inline _Bool Os_IsrOccupiesResources( OsIsrVarType *isrPtr ) {
\r
220 return !(TAILQ_EMPTY(&isrPtr->resourceHead));
\r