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
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
58 #define __ISR_INSTALL_ISR2(_name, _entry, _unique, _vector,_priority,_app ) \
\r
60 const OsIsrConstType _entry ## _unique = { \
\r
61 .vector = _vector, \
\r
62 .type = ISR_TYPE_2, \
\r
63 .priority = _priority, \
\r
66 .resourceMask = 0, \
\r
67 .timingProtPtr = NULL, \
\r
70 Os_IsrAdd( & _entry ## _unique); \
\r
75 #define _ISR_INSTALL_ISR2(_name,_entry, _unique, _vector,_priority,_app) \
\r
76 __ISR_INSTALL_ISR2(_name,_entry, _unique, _vector,_priority,_app)
\r
78 #define ISR_INSTALL_ISR2(_name,_entry, _vector,_priority,_app) \
\r
79 _ISR_INSTALL_ISR2(_name,_entry, __LINE__, _vector,_priority,_app)
\r
82 #define ISR_DECLARE_ISR1(_name, _entry, _unique, _vector,_priority,_app ) \
\r
83 const OsIsrConstType _entry ## _unique = { \
\r
84 .vector = _vector, \
\r
85 .type = ISR_TYPE_1, \
\r
86 .priority = _priority, \
\r
89 .resourceMask = 0, \
\r
90 .timingProtPtr = NULL, \
\r
94 #define __ISR_INSTALL_ISR1(_name, _entry, _unique, _vector,_priority,_app ) \
\r
96 const OsIsrConstType _entry ## _unique = { \
\r
97 .vector = _vector, \
\r
98 .type = ISR_TYPE_2, \
\r
99 .priority = _priority, \
\r
102 .resourceMask = 0, \
\r
103 .timingProtPtr = NULL, \
\r
104 .appOwner = _app, \
\r
106 Os_IsrAdd( & _entry ## _unique); \
\r
109 #define _ISR_INSTALL_ISR1(_name,_entry, _unique, _vector,_priority,_app) \
\r
110 __ISR_INSTALL_ISR1(_name,_entry, _unique, _vector,_priority,_app)
\r
112 #define ISR_INSTALL_ISR1(_name,_entry, _vector,_priority,_app) \
\r
113 _ISR_INSTALL_ISR1(_name,_entry, __LINE__, _vector,_priority,_app)
\r
117 /* ----------------------------[typedef]-------------------------------------*/
\r
121 /* STD container : OsIsrResourceLock
\r
124 * OsIsrResourceLockBudget 1 Float in seconds (MAXRESOURCELOCKINGTIME)
\r
125 * OsIsrResourceLockResourceRef 1 Ref to OsResource
\r
128 typedef struct OsIsrResourceLock {
\r
129 uint32_t lockBudget;
\r
130 uint32_t lockResourceRef; /* Wrong type */
\r
131 } OsIsrResourceLockType;
\r
134 /* STD container : OsIsrTimingProtection
\r
137 * OsIsrAllInterruptLockBudget 0..1 float
\r
138 * OsIsrExecutionBudget 0..1 float
\r
139 * OsIsrOsInterruptLockBudget 0..1 float
\r
140 * OsIsrTimeFrame 0..1 float
\r
141 * OsIsrResourceLock[C] 0..*
\r
144 typedef struct OsIsrTimingProtection {
\r
145 uint32_t allInterruptLockBudget;
\r
146 uint32_t executionBudget;
\r
147 uint32_t osInterruptLockBudget;
\r
148 uint32_t timeFrame;
\r
149 uint32_t resourceLock; /* Wrong type */
\r
150 } OsIsrTimingProtectionType;
\r
153 void *curr; /* Current stack ptr( at swap time ) */
\r
154 void *top; /* Top of the stack( low address ) */
\r
155 uint32 size; /* The size of the stack */
\r
159 /* STD container : OsIsr
\r
162 * OsIsrCategory: 1 CATEGORY_1 or CATEGORY_2
\r
163 * OsIsrResourceRef: 0..* Reference to OsResources
\r
164 * OsIsrTimingProtection[C] 0..1
\r
167 typedef struct OsIsrConst {
\r
175 /* Mapped against OsIsrResourceRef */
\r
176 uint32_t resourceMask;
\r
177 #if ( OS_USE_ISR_TIMING_PROT == STD_ON )
\r
178 /* Mapped against OsIsrTimingProtection[C] */
\r
179 OsIsrTimingProtectionType *timingProtPtr;
\r
181 void *timingProtPtr;
\r
190 // OsIsrStackType stack;
\r
192 const OsIsrConstType *constPtr;
\r
193 /* List of resource held by this ISR */
\r
194 TAILQ_HEAD(,OsResource) resourceHead;
\r
198 /* ----------------------------[functions]-----------------------------------*/
\r
200 #if OS_ISR_MAX_CNT!=0
\r
201 extern OsIsrVarType Os_IsrVarList[OS_ISR_MAX_CNT];
\r
204 void Os_IsrInit( void );
\r
205 ISRType Os_IsrAdd( const OsIsrConstType * restrict isrPtr );
\r
206 void Os_IsrGetStackInfo( OsIsrStackType *stack );
\r
207 void *Os_Isr( void *stack, int16_t vector);
\r
208 #if defined(CFG_ARM_CM3)
\r
209 void Os_Isr_cm3( void *isr_p );
\r
210 void TailChaining(void *stack);
\r
213 static inline const OsIsrVarType *Os_IsrGet( ISRType id ) {
\r
214 return &Os_IsrVarList[id];
\r
217 static inline ApplicationType Os_IsrGetApplicationOwner( ISRType id ) {
\r
218 ApplicationType rv = INVALID_OSAPPLICATION;
\r
220 #if (OS_ISR_CNT!=0)
\r
221 if( id < OS_ISR_CNT ) {
\r
222 rv = Os_IsrGet(id)->constPtr->appOwner;
\r
230 static inline void Os_IsrResourceAdd( OsResourceType *rPtr, OsIsrVarType *isrPtr) {
\r
231 /* Save old task prio in resource and set new task prio */
\r
232 rPtr->owner = isrPtr->id;
\r
234 assert( rPtr->type != RESOURCE_TYPE_INTERNAL );
\r
237 static inline void Os_IsrResourceRemove( OsResourceType *rPtr , OsIsrVarType *isrPtr) {
\r
238 assert( rPtr->owner == isrPtr->id );
\r
239 rPtr->owner = NO_TASK_OWNER;
\r
241 if( rPtr->type != RESOURCE_TYPE_INTERNAL ) {
\r
242 /* The list can't be empty here */
\r
243 assert( !TAILQ_EMPTY(&isrPtr->resourceHead) );
\r
245 /* The list should be popped in LIFO order */
\r
246 assert( TAILQ_LAST(&isrPtr->resourceHead, head) == rPtr );
\r
248 /* Remove the entry */
\r
249 TAILQ_REMOVE(&isrPtr->resourceHead, rPtr, listEntry);
\r
253 static inline void Os_IsrResourceFreeAll( OsIsrVarType *isrPtr ) {
\r
254 OsResourceType *rPtr;
\r
256 /* Pop the queue */
\r
257 TAILQ_FOREACH(rPtr, &isrPtr->resourceHead, listEntry ) {
\r
258 Os_IsrResourceRemove(rPtr,isrPtr);
\r
262 static inline _Bool Os_IsrOccupiesResources( OsIsrVarType *isrPtr ) {
\r
263 return !(TAILQ_EMPTY(&isrPtr->resourceHead));
\r