1 /* -------------------------------- Arctic Core ------------------------------
2 * Arctic Core - the open source AUTOSAR platform http://arccore.com
4 * Copyright (C) 2009 ArcCore AB <contact@arccore.com>
6 * This source code is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License version 2 as published by the
8 * Free Software Foundation; See <http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt>.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * -------------------------------- Arctic Core ------------------------------*/
21 #define OS_SW_MAJOR_VERSION 1
22 #define OS_SW_MINOR_VERSION 0
23 #define OS_SW_PATCH_VERSION 0
\r
26 #include "Std_Types.h"
\r
31 typedef uint32_t EventMaskType;
\r
32 typedef EventMaskType * EventMaskRefType;
\r
33 typedef uint16_t TaskType;
\r
34 typedef TaskType * TaskRefType;
\r
39 TASK_STATE_SUSPENDED,
\r
44 typedef TaskStateType *TaskStateRefType;
\r
46 /* FIXME: OSMEMORY_IS__ , see 8.2*/
\r
48 #define OSDEFAULTAPPMODE 1
\r
50 #define INVALID_OSAPPLICATION (-1)
\r
52 /* TODO, I have no idea what this should be*/
\r
53 typedef sint32 ApplicationType;
\r
55 /* See oil config for defines */
\r
56 typedef sint32 AppModeType;
\r
58 /* FIXME: more types here */
\r
59 typedef uint16 ScheduleTableType;
\r
60 typedef uint16 GlobalTimeTickType;
\r
63 SCHEDULETABLE_STOPPED,
\r
65 SCHEDULETABLE_WAITING,
\r
66 SCHEDULETABLE_RUNNING,
\r
67 SCHEDULETABLE_RUNNING_AND_SYNCHRONOUS
\r
68 } ScheduleTableStatusType;
\r
70 typedef ScheduleTableStatusType *ScheduleTableStatusRefType;
\r
72 /* Flags for AccessType */
\r
73 #define ACCESSTYPE_W 1
\r
74 #define ACCESSTYPE_R (1<<1)
\r
76 typedef uint32 AccessType;
\r
89 OBJECT_SCHEDULETABLE,
\r
96 PRO_KILLAPPL_RESTART,
\r
98 } ProtectionReturnType;
\r
106 typedef ProtectionReturnType (*ProtectionHookType)( StatusType);
\r
107 typedef void (*StartupHookType)( void );
\r
108 typedef void (*ShutdownHookType)( StatusType );
\r
109 typedef void (*ErrorHookType)( StatusType );
\r
110 typedef void (*PreTaskHookType)( void );
\r
111 typedef void (*PostTaskHookType)( void );
\r
113 ProtectionReturnType ProtectionHook( StatusType FatalError );
\r
114 void StartupHook( void );
\r
115 void ShutdownHook( StatusType Error );
\r
116 void ErrorHook( StatusType Error );
\r
117 void PreTaskHook( void );
\r
118 void PostTaskHook( void );
\r
120 typedef uint16 TrustedFunctionIndexType;
\r
121 typedef void * TrustedFunctionParameterRefType;
\r
124 #define INVALID_ISR ((sint16)(-1))
\r
125 typedef sint16 ISRType;
\r
127 typedef void * MemoryStartAddressType;
\r
128 typedef uint32 MemorySizeType;
\r
131 #define WaitEvent(...) SC_CALL(WaitEvent,1,1,__VA_ARGS__)
\r
132 #define SetEvent(...) SC_CALL(SetEvent,2,2,__VA_ARGS__)
\r
133 #define ClearEvent(...) SC_CALL(ClearEvent,3,1,__VA_ARGS__)
\r
135 StatusType WaitEvent( EventMaskType Mask );
\r
136 StatusType SetEvent( TaskType TaskID, EventMaskType Mask );
\r
137 StatusType ClearEvent( EventMaskType Mask);
\r
138 StatusType GetEvent( TaskType TaskId, EventMaskRefType Mask);
\r
141 void StartOS( AppModeType Mode );
145 ApplicationType GetApplicationID( void );
\r
146 ISRType GetISRID( void );
\r
148 typedef int8_t Os_IntCounterType;
150 /* requirements here: OS368(ISR2), OS092 */
152 extern Os_IntCounterType Os_IntDisableAllCnt;
153 extern Os_IntCounterType Os_IntSuspendAllCnt;
154 extern Os_IntCounterType Os_IntSuspendOsCnt;
159 /* OSEK: States that " service does not support nesting", but says
160 * nothing what to do about it.
162 * OS092: " If EnableAllInterrupts()/ResumeAllInterrupts()/ResumeOSInterrupts()
163 * are called and no corresponding DisableAllInterupts()/SuspendAllInterrupts()/
164 * SuspendOSInterrupts() was done before, the Operating System shall not
165 * perform this OS service.
167 static inline void DisableAllInterrupts( void ) {
169 Os_IntDisableAllCnt++;
170 /* No nesting allowed */
171 assert(Os_IntDisableAllCnt>1);
174 static inline void EnableAllInterrupts( void ) {
176 if(Os_IntDisableAllCnt==0) {
177 /** @req OS092 EnableAllInterrupts */
179 Os_IntDisableAllCnt--;
184 static inline void SuspendAllInterrupts( void ) {
186 Os_IntSuspendAllCnt++;
189 static inline void ResumeAllInterrupts( void ) {
191 if(Os_IntSuspendAllCnt==0) {
192 /** @req OS092 ResumeAllInterrupts */
194 Os_IntSuspendAllCnt--;
199 /* Only ISR2 interrupts should be suspended but this can NEVER be
200 * done in a more efficient way than to disable all, so let's
201 * do that for all targets.
204 static inline void SuspendOSInterrupts( void ) {
206 Os_IntSuspendOsCnt++;
209 static inline void ResumeOSInterrupts( void ) {
211 if(Os_IntSuspendOsCnt==0) {
212 /** @req OS092 ResumeOSInterrupts */
214 Os_IntSuspendOsCnt--;
220 /* Can't find these anymore, removed from Autosar? */
\r
221 StatusType EnableInterruptSource( ISRType EnableISR );
\r
222 StatusType DisableInterruptSource( ISRType EnableISR );
\r
226 * Class 2,3 and 4 API
228 ApplicationType GetApplicationID( void );
\r
229 AccessType CheckISRMemoryAccess( ISRType ISRID,
\r
230 MemoryStartAddressType Address,
\r
231 MemorySizeType Size );
\r
233 AccessType CheckTaskMemoryAccess( TaskType TaskID,
\r
234 MemoryStartAddressType Address,
\r
235 MemorySizeType Size );
237 StatusType CallTrustedFunction( TrustedFunctionIndexType FunctionIndex,
\r
238 TrustedFunctionParameterRefType FunctionParams );
\r
240 StatusType GetTaskID( TaskRefType TaskID );
\r
241 StatusType GetTaskState( TaskType task_id, TaskStateRefType state);
\r
243 void ShutdownOS( StatusType );
\r
244 StatusType ActivateTask( TaskType TaskID );
\r
245 StatusType TerminateTask( void );
\r
246 StatusType ChainTask( TaskType TaskID );
\r
247 StatusType Schedule( void );
\r
249 typedef uint32 ResourceType;
\r
250 #define DeclareResource(x) extern ResourceType (x);
\r
251 StatusType GetResource( ResourceType ResID );
\r
252 StatusType ReleaseResource( ResourceType ResID);
\r
255 * Define the scheduler resource as 0
257 #define RES_SCHEDULER 0
\r
260 * Priorities of tasks and resources
262 #define OS_TASK_PRIORITY_MIN 0
263 #define OS_TASK_PRIORITY_MAX 31
264 /* Logical priority is higher higher than normal tasks */
265 #define OS_RES_SCHEDULER_PRIO 32
\r
267 typedef struct OsDriver_s {
\r
268 int OsGptChannelRef;
\r
271 /*-------------------------------------------------------------------
\r
272 * Free running timer
\r
273 *-----------------------------------------------------------------*/
274 typedef const uint32 OsTickType;
275 void Os_SysTickInit( void );
\r
276 void Os_SysTickStart(uint32_t period_ticks);
\r
277 uint32_t Os_SysTickGetTimeElapsed( void );
\r
279 /*-------------------------------------------------------------------
\r
281 *-----------------------------------------------------------------*/
\r
282 typedef sint16 CounterType;
284 typedef uint32 TickType;
\r
285 typedef TickType *TickRefType;
\r
287 StatusType IncrementCounter( CounterType );
\r
288 StatusType GetCounterValue( CounterType, TickRefType );
\r
289 StatusType GetElapsedCounterValue( CounterType, TickRefType val, TickRefType elapsed_val);
\r
291 /*-------------------------------------------------------------------
\r
293 *-----------------------------------------------------------------*/
\r
295 StatusType StartScheduleTableRel(ScheduleTableType sid, TickType offset);
\r
296 StatusType StartScheduleTableAbs(ScheduleTableType sid, TickType val );
\r
297 StatusType StartScheduleTableSynchron(ScheduleTableType sid );
\r
298 StatusType StopScheduleTable(ScheduleTableType sid);
\r
299 StatusType NextScheduleTable( ScheduleTableType sid_curr, ScheduleTableType sid_next);
\r
300 StatusType SyncScheduleTable( ScheduleTableType sid, GlobalTimeTickType global_time );
\r
301 StatusType GetScheduleTableStatus( ScheduleTableType sid, ScheduleTableStatusRefType status );
\r
302 StatusType SetScheduleTableAsync( ScheduleTableType sid );
\r
305 /*-------------------------------------------------------------------
\r
307 *-----------------------------------------------------------------*/
\r
309 typedef uint16 AlarmType;
\r
312 TickType maxallowedvalue;
\r
313 TickType tickperbase;
\r
317 typedef AlarmBaseType *AlarmBaseRefType;
\r
319 StatusType GetAlarmBase( AlarmType AlarmId, AlarmBaseRefType Info );
\r
320 StatusType GetAlarm(AlarmType AlarmId, TickRefType Tick);
\r
321 StatusType SetRelAlarm(AlarmType AlarmId, TickType Increment, TickType Cycle);
\r
322 StatusType SetAbsAlarm(AlarmType AlarmId, TickType Start, TickType Cycle);
\r
323 StatusType CancelAlarm(AlarmType AlarmId);
\r
326 /*-------------------------------------------------------------------
\r
328 *-----------------------------------------------------------------*/
\r
330 OSServiceId_ActivateTask,
\r
331 OSServiceId_TerminateTask,
\r
332 OSServiceId_ChainTask,
\r
333 OSServiceId_Schedule,
\r
334 OSServiceId_GetTaskID,
\r
335 OSServiceId_GetResource,
\r
336 OSServiceId_ReleaseResource,
\r
337 OSServiceId_SetEvent,
\r
338 OSServiceId_ClearEvent,
\r
339 OSServiceId_GetEvent,
\r
340 OSServiceId_WaitEvent,
\r
341 OSServiceId_GetAlarmBase,
\r
342 OSServiceId_GetAlarm,
\r
343 OSServiceId_SetRelAlarm,
\r
344 OSServiceId_SetAbsAlarm,
\r
345 OSServiceId_CancelAlarm,
\r
346 OSServiceId_StartOS,
\r
347 OSServiceId_ShutdownOS,
\r
348 OSServiceId_ErrorHook,
\r
349 OSServiceId_PreTaskHook,
\r
350 OSServiceId_PostTaskHook,
\r
351 OSServiceId_StartupHook,
\r
352 OSServiceId_ShutdownHook,
\r
353 OSServiceId_GetTaskState,
\r
354 } OsServiceIdType;;
\r
356 typedef struct os_error_s {
\r
357 OsServiceIdType serviceId;
\r
363 extern os_error_t os_error;
\r
365 // TODO: Add the service id to all OS service methods.
\r
366 static inline OsServiceIdType OSErrorGetServiceId(void) {
\r
367 return os_error.serviceId;
\r
370 extern os_error_t os_error;
\r
372 #define OSError_ActivateTask_TaskID ((TaskType) os_error.param1)
\r
373 #define OSError_ChainTask_TaskID ((TaskType) os_error.param1)
\r
374 #define OSError_GetTaskID_TaskID ((TaskRefType) os_error.param1)
\r
375 #define OSError_GetResource_ResID ((ResourceType) os_error.param1)
\r
376 #define OSError_ReleaseResource_ResID ((ResourceType) os_error.param1)
\r
377 #define OSError_SetEvent_TaskID ((TaskType) os_error.param1)
\r
378 #define OSError_SetEvent_Mask ((EventMaskType) os_error.param2)
\r
379 #define OSError_ClearEvent_Mask ((EventMaskType) os_error.param1)
\r
380 #define OSError_GetEvent_TaskId ((TaskType) os_error.param1)
\r
381 #define OSError_GetEvent_Mask ((EventMaskRefType) os_error.param2)
\r
382 #define OSError_WaitEvent_Mask ((EventMaskType) os_error.param1)
\r
383 #define OSError_GetAlarmBase_AlarmId ((AlarmType) os_error.param1)
\r
384 #define OSError_GetAlarmBase_Info ((AlarmBaseRefType) os_error.param2)
\r
385 #define OSError_GetAlarm_AlarmId ((AlarmType) os_error.param1)
\r
386 #define OSError_GetAlarm_Tick ((TickRefType) os_error.param2)
\r
387 #define OSError_SetRelAlarm_AlarmId ((AlarmType) os_error.param1)
\r
388 #define OSError_SetRelAlarm_Increment ((TickType) os_error.param2)
\r
389 #define OSError_SetRelAlarm_Cycle ((TickType) os_error.param3)
\r
390 #define OSError_SetAbsAlarm_AlarmId ((AlarmType) os_error.param1)
\r
391 #define OSError_SetAbsAlarm_Start ((TickType) os_error.param2)
\r
392 #define OSError_SetAbsAlarm_Cycle ((TickType) os_error.param3)
\r
393 #define OSError_CancelAlarm_AlarmId ((AlarmType) os_error.param1)
\r
394 #define OSError_StartOS_Mode ((AppModeType) os_error.param1)
\r
395 #define OSError_ErrorHook_Error ((StatusType) os_error.param1)
\r
396 #define OSError_ShutdownHook_Error ((StatusType) os_error.param1)
\r
397 #define OSError_GetTaskState_TaskId ((TaskType) os_error.param1)
\r
398 #define OSError_GetTaskState_State ((TaskStateRefType) os_error.param2)
\r
401 #if defined(LOCALMESSAGESONLY)
402 #error LOCALMESSAGESONLY shall not be defined
406 /*-------------------------------------------------------------------
\r
407 * COM ( TODO : move )
\r
408 *-----------------------------------------------------------------*/
\r
411 * The only information about the COM that is valid is
\r
412 * in the COM specification ..SWS_COM.pdf.
\r
414 * The most important requirements are COM010 and COM013
\r
420 * No. GetMessageStatus()
\r
421 * No. SendZeroMessage()
\r
422 * No. SendDynamicMessage(), RecieveDynamicMessage()
\r
424 * Yes. SendMessage()
\r
429 typedef uint32 MessageType;
\r
430 typedef void *ApplicationDataRef;
\r
433 StatusType SendMessage( MessageType message_id, ApplicationDataRef dataRef );
\r
434 StatusType ReceiveMessage( MessageType message_id, ApplicationDataRef dataRef );
\r
437 * ArcCore extensions
\r
439 TickType GetOsTick();
\r
443 #define OS_ISR_TYPE2 0
\r
444 #define OS_ISR_TYPE1 1
\r
448 void (*entry)(void);
\r