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 the 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
46 //#ifdef CFG_DRIVERS_USE_CONFIG_ISRS
\r
47 #define ISR_INSTALL_ISR2( _name, _entry, _vector, _priority, _app )
\r
48 #define ISR_INSTALL_ISR1(_name,_entry, _vector,_priority,_app)
\r
50 #define ISR_DECLARE_ISR2(_name, _entry, _unique, _vector,_priority,_app ) \
\r
51 static const OsIsrConstType _entry ## _unique = { \
\r
52 .vector = _vector, \
\r
53 .type = ISR_TYPE_2, \
\r
54 .priority = _priority, \
\r
57 .resourceMask = 0, \
\r
58 .timingProtPtr = NULL, \
\r
63 #define __ISR_INSTALL_ISR2(_name, _entry, _unique, _vector,_priority,_app ) \
\r
65 static const OsIsrConstType _entry ## _unique = { \
\r
66 .vector = _vector, \
\r
67 .type = ISR_TYPE_2, \
\r
68 .priority = _priority, \
\r
71 .resourceMask = 0, \
\r
72 .timingProtPtr = NULL, \
\r
75 Os_IsrAdd( & _entry ## _unique); \
\r
80 #define _ISR_INSTALL_ISR2(_name,_entry, _unique, _vector,_priority,_app) \
\r
81 __ISR_INSTALL_ISR2(_name,_entry, _unique, _vector,_priority,_app)
\r
83 #define ISR_INSTALL_ISR2(_name,_entry, _vector,_priority,_app) \
\r
84 _ISR_INSTALL_ISR2(_name,_entry, __LINE__, _vector,_priority,_app)
\r
87 #define ISR_DECLARE_ISR1(_name, _entry, _unique, _vector,_priority,_app ) \
\r
88 static const OsIsrConstType _entry ## _unique = { \
\r
89 .vector = _vector, \
\r
90 .type = ISR_TYPE_1, \
\r
91 .priority = _priority, \
\r
94 .resourceMask = 0, \
\r
95 .timingProtPtr = NULL, \
\r
99 #define __ISR_INSTALL_ISR1(_name, _entry, _unique, _vector,_priority,_app ) \
\r
101 static const OsIsrConstType _entry ## _unique = { \
\r
102 .vector = _vector, \
\r
103 .type = ISR_TYPE_2, \
\r
104 .priority = _priority, \
\r
107 .resourceMask = 0, \
\r
108 .timingProtPtr = NULL, \
\r
109 .appOwner = _app, \
\r
111 Os_IsrAdd( & _entry ## _unique); \
\r
114 #define _ISR_INSTALL_ISR1(_name,_entry, _unique, _vector,_priority,_app) \
\r
115 __ISR_INSTALL_ISR1(_name,_entry, _unique, _vector,_priority,_app)
\r
117 #define ISR_INSTALL_ISR1(_name,_entry, _vector,_priority,_app) \
\r
118 _ISR_INSTALL_ISR1(_name,_entry, __LINE__, _vector,_priority,_app)
\r
122 /* ----------------------------[typedef]-------------------------------------*/
\r
126 /* STD container : OsIsrResourceLock
\r
129 * OsIsrResourceLockBudget 1 Float in seconds (MAXRESOURCELOCKINGTIME)
\r
130 * OsIsrResourceLockResourceRef 1 Ref to OsResource
\r
133 typedef struct OsIsrResourceLock {
\r
134 uint32_t lockBudget;
\r
135 uint32_t lockResourceRef; /* Wrong type */
\r
136 } OsIsrResourceLockType;
\r
139 /* STD container : OsIsrTimingProtection
\r
142 * OsIsrAllInterruptLockBudget 0..1 float
\r
143 * OsIsrExecutionBudget 0..1 float
\r
144 * OsIsrOsInterruptLockBudget 0..1 float
\r
145 * OsIsrTimeFrame 0..1 float
\r
146 * OsIsrResourceLock[C] 0..*
\r
149 typedef struct OsIsrTimingProtection {
\r
150 uint32_t allInterruptLockBudget;
\r
151 uint32_t executionBudget;
\r
152 uint32_t osInterruptLockBudget;
\r
153 uint32_t timeFrame;
\r
154 uint32_t resourceLock; /* Wrong type */
\r
155 } OsIsrTimingProtectionType;
\r
158 void *curr; /* Current stack ptr( at swap time ) */
\r
159 void *top; /* Top of the stack( low address ) */
\r
160 uint32 size; /* The size of the stack */
\r
164 /* STD container : OsIsr
\r
167 * OsIsrCategory: 1 CATEGORY_1 or CATEGORY_2
\r
168 * OsIsrResourceRef: 0..* Reference to OsResources
\r
169 * OsIsrTimingProtection[C] 0..1
\r
172 typedef struct OsIsrConst {
\r
180 /* Mapped against OsIsrResourceRef */
\r
181 uint32_t resourceMask;
\r
182 #if ( OS_USE_ISR_TIMING_PROT == STD_ON )
\r
183 /* Mapped against OsIsrTimingProtection[C] */
\r
184 OsIsrTimingProtectionType *timingProtPtr;
\r
186 void *timingProtPtr;
\r
195 // OsIsrStackType stack;
\r
197 const OsIsrConstType *constPtr;
\r
198 #if defined(CFG_ARM_CR4)
\r
199 int16_t activeVector;
\r
202 /* List of resource held by this ISR */
\r
203 TAILQ_HEAD(,OsResource) resourceHead;
\r
207 /* ----------------------------[functions]-----------------------------------*/
\r
209 #if OS_ISR_MAX_CNT!=0
\r
210 extern OsIsrVarType Os_IsrVarList[OS_ISR_MAX_CNT];
\r
213 void Os_IsrInit( void );
\r
214 ISRType Os_IsrAdd( const OsIsrConstType * restrict isrPtr );
\r
215 void Os_IsrGetStackInfo( OsIsrStackType *stack );
\r
216 void *Os_Isr( void *stack, int16_t vector);
\r
217 #if defined(CFG_ARM_CR4)
\r
218 void *Os_Isr_cr4( void *stack, int16_t virtualVector, int16_t vector );
\r
220 #if defined(CFG_ARM_CM3)
\r
221 void Os_Isr_cm3( int16_t vector );
\r
222 void TailChaining(void *stack);
\r
225 static inline const OsIsrVarType *Os_IsrGet( ISRType id ) {
\r
226 return &Os_IsrVarList[id];
\r
229 static inline ApplicationType Os_IsrGetApplicationOwner( ISRType id ) {
\r
230 ApplicationType rv = INVALID_OSAPPLICATION;
\r
232 #if (OS_ISR_CNT!=0)
\r
233 if( id < OS_ISR_CNT ) {
\r
234 rv = Os_IsrGet(id)->constPtr->appOwner;
\r
242 static inline void Os_IsrResourceAdd( OsResourceType *rPtr, OsIsrVarType *isrPtr) {
\r
243 /* Save old task prio in resource and set new task prio */
\r
244 rPtr->owner = isrPtr->id;
\r
246 assert( rPtr->type != RESOURCE_TYPE_INTERNAL );
\r
249 static inline void Os_IsrResourceRemove( OsResourceType *rPtr , OsIsrVarType *isrPtr) {
\r
250 assert( rPtr->owner == isrPtr->id );
\r
251 rPtr->owner = NO_TASK_OWNER;
\r
253 if( rPtr->type != RESOURCE_TYPE_INTERNAL ) {
\r
254 /* The list can't be empty here */
\r
255 assert( !TAILQ_EMPTY(&isrPtr->resourceHead) );
\r
257 /* The list should be popped in LIFO order */
\r
258 assert( TAILQ_LAST(&isrPtr->resourceHead, head) == rPtr );
\r
260 /* Remove the entry */
\r
261 TAILQ_REMOVE(&isrPtr->resourceHead, rPtr, listEntry);
\r
265 static inline void Os_IsrResourceFreeAll( OsIsrVarType *isrPtr ) {
\r
266 OsResourceType *rPtr;
\r
268 /* Pop the queue */
\r
269 TAILQ_FOREACH(rPtr, &isrPtr->resourceHead, listEntry ) {
\r
270 Os_IsrResourceRemove(rPtr,isrPtr);
\r
274 static inline _Bool Os_IsrOccupiesResources( OsIsrVarType *isrPtr ) {
\r
275 return !(TAILQ_EMPTY(&isrPtr->resourceHead));
\r