]> rtime.felk.cvut.cz Git - arc.git/blobdiff - include/Os.h
EcuM: More EcuM fixes.
[arc.git] / include / Os.h
index 57d65a4847b103ea45e139fcd3526cb159073088..0d9e8e1edb449157806a8baa6283db60fd015855 100644 (file)
@@ -15,6 +15,7 @@
 \r
 \r
 \r
+\r
 #ifndef OS_H_\r
 #define OS_H_\r
 \r
 #include "Os_Cfg.h"\r
 #include "MemMap.h"\r
 #include "Cpu.h"\r
+#include "limits.h"\r
+#include <sys/queue.h>\r
+\r
+typedef uint8 StatusType;\r
+\r
+#if (OS_ISR_CNT > OS_ISR_MAX_CNT)\r
+#error OS configuration error. OS_ISR_MAX_CNT must be bigger or equal to OS_ISR_CNT\r
+#endif\r
+\r
+#define E_OS_ACCESS (StatusType)1               /**< STD OSEK */\r
+#define        E_OS_CALLEVEL (StatusType)2             /**< STD OSEK */\r
+#define        E_OS_ID (StatusType)3                   /**< STD OSEK */\r
+#define        E_OS_LIMIT (StatusType)4                /**< STD OSEK */\r
+#define        E_OS_NOFUNC (StatusType)5               /**< STD OSEK */\r
+#define        E_OS_RESOURCE (StatusType)6             /**< STD OSEK */\r
+#define        E_OS_STATE (StatusType)7                /**< STD OSEK */\r
+#define        E_OS_VALUE (StatusType)8                /**< STD OSEK */\r
+\r
+#define        E_OS_SERVICEID (StatusType)9                /**< AUTOSAR, see 7.10 */\r
+#define        E_OS_RATE (StatusType)10                    /**< AUTOSAR, see 7.10 */\r
+#define        E_OS_ILLEGAL_ADDRESS (StatusType)11         /**< AUTOSAR, see 7.10 */\r
+#define        E_OS_MISSINGEND (StatusType)12              /**< AUTOSAR, see 7.10 */\r
+#define        E_OS_DISABLEDINT (StatusType)13             /**< AUTOSAR, see 7.10 */\r
+#define        E_OS_STACKFAULT (StatusType)14              /**< AUTOSAR, see 7.10 */\r
+#define        E_OS_PROTECTION_MEMORY (StatusType)15       /**< AUTOSAR, see 7.10 */\r
+#define        E_OS_PROTECTION_TIME (StatusType)16         /**< AUTOSAR, see 7.10 */\r
+#define        E_OS_PROTECTION_LOCKED (StatusType)17       /**< AUTOSAR, see 7.10 */\r
+#define        E_OS_PROTECTION_EXCEPTION (StatusType)18    /**< AUTOSAR, see 7.10 */\r
+#define        E_OS_PROTECTION_RATE (StatusType)19          /**< AUTOSAR, see 7.10 */\r
+\r
+#define E_COM_ID 255 // TODO: var ska E_COM_ID vara?"\r
+\r
 \r
 typedef uint32_t               EventMaskType;\r
 typedef EventMaskType *        EventMaskRefType;\r
@@ -37,21 +70,40 @@ typedef enum {
        TASK_STATE_WAITING,\r
        TASK_STATE_READY,\r
        TASK_STATE_SUSPENDED,\r
-       TASK_STATE_RUNNING,\r
+       TASK_STATE_RUNNING\r
 } TaskStateType;\r
 \r
+#define INVALID_TASK   0xdeadU\r
 \r
 typedef TaskStateType *TaskStateRefType;\r
 \r
 /* FIXME: OSMEMORY_IS__ , see 8.2*/\r
 \r
+#define OSMEMORY_IS_READABLE(_access)\r
+#define OSMEMORY_IS_WRITEABLE(_access)\r
+#define OSMEMORY_IS_EXECUTABLE(_access)\r
+#define OSMEMORY_IS_STACKSPACE(_access)\r
+\r
 #define OSDEFAULTAPPMODE  1\r
 \r
 #define INVALID_OSAPPLICATION (-1)\r
 \r
+#define TASK(_task)            void _task( void )\r
+\r
+\r
 /* TODO, I have no idea what this should be*/\r
+#if (OS_USE_APPLICATIONS == STD_ON)\r
 typedef sint32 ApplicationType;\r
 \r
+typedef enum {\r
+       APPLICATION_ACCESSIBLE,\r
+       APPLICATION_RESTARTING,\r
+       APPLICATION_TERMINATED\r
+} ApplicationStateType;\r
+\r
+typedef ApplicationStateType *ApplicationStateRefType;\r
+#endif\r
+\r
 /* See oil config for defines */\r
 typedef sint32 AppModeType;\r
 \r
@@ -124,6 +176,8 @@ typedef  void * TrustedFunctionParameterRefType;
 #define INVALID_ISR            ((sint16)(-1))\r
 typedef        sint16 ISRType;\r
 \r
+#define APP_NO_OWNER   (-1UL)\r
+\r
 typedef void * MemoryStartAddressType;\r
 typedef uint32 MemorySizeType;\r
 \r
@@ -140,9 +194,6 @@ StatusType GetEvent( TaskType TaskId, EventMaskRefType Mask);
 void InitOS( void );\r
 void StartOS( AppModeType Mode );\r
 \r
-\r
-\r
-ApplicationType GetApplicationID( void );\r
 ISRType GetISRID( void );\r
 StatusType GetActiveApplicationMode( AppModeType* mode);\r
 \r
@@ -169,7 +220,7 @@ static inline void DisableAllInterrupts( void ) {
        Irq_Disable();\r
        Os_IntDisableAllCnt++;\r
        /* No nesting allowed */\r
-       assert(Os_IntDisableAllCnt>1);\r
+       assert(Os_IntDisableAllCnt==1);\r
 }\r
 \r
 static inline void EnableAllInterrupts( void ) {\r
@@ -220,6 +271,9 @@ static inline void ResumeOSInterrupts( void ) {
 /*\r
  * Class 2,3 and 4 API\r
  */\r
+\r
+#if (OS_USE_APPLICATIONS == STD_ON)\r
+\r
 ApplicationType GetApplicationID( void );\r
 AccessType     CheckISRMemoryAccess(   ISRType ISRID,\r
                                                                        MemoryStartAddressType Address,\r
@@ -229,8 +283,17 @@ AccessType         CheckTaskMemoryAccess(  TaskType TaskID,
                                                                        MemoryStartAddressType Address,\r
                                                                        MemorySizeType Size );\r
 \r
+ObjectAccessType CheckObjectAccess( ApplicationType ApplId,\r
+                                                                       ObjectTypeType ObjectType,\r
+                                                                       uint32_t objectId );\r
+ApplicationType CheckObjectOwnership( ObjectTypeType ObjectType,\r
+                                                                       uint32_t objectId );\r
+StatusType TerminateApplication(  ApplicationType Application, RestartType RestartOption );\r
+StatusType AllowAccess( void );\r
+StatusType GetApplicationState(   ApplicationType Application,  ApplicationStateRefType Value );\r
 StatusType     CallTrustedFunction(    TrustedFunctionIndexType FunctionIndex,\r
                                                                        TrustedFunctionParameterRefType FunctionParams );\r
+#endif\r
 \r
 StatusType     GetTaskID(              TaskRefType TaskID );\r
 StatusType     GetTaskState(   TaskType task_id, TaskStateRefType state);\r
@@ -247,9 +310,9 @@ StatusType GetResource( ResourceType ResID );
 StatusType ReleaseResource( ResourceType ResID);\r
 \r
 /*\r
- * Define the scheduler resource as ~0\r
+ * Define scheduler as topmost\r
  */\r
-#define        RES_SCHEDULER                   (ResourceType)(~0)\r
+#define        RES_SCHEDULER                   OS_RESOURCE_CNT\r
 \r
 /*\r
  * Priorities of tasks and resources\r
@@ -263,13 +326,7 @@ typedef struct OsDriver_s {
        int     OsGptChannelRef;\r
 } OsDriver;\r
 \r
-/*-------------------------------------------------------------------\r
- * Free running timer\r
- *-----------------------------------------------------------------*/\r
-typedef const uint32 OsTickType;\r
-void Os_SysTickInit( void );\r
-void Os_SysTickStart(uint32_t period_ticks);\r
-uint32_t Os_SysTickGetTimeElapsed( void );\r
+\r
 \r
 /*-------------------------------------------------------------------\r
  * Counters\r
@@ -283,6 +340,54 @@ StatusType IncrementCounter( CounterType );
 StatusType GetCounterValue( CounterType, TickRefType );\r
 StatusType GetElapsedCounterValue( CounterType, TickRefType val, TickRefType elapsed_val);\r
 \r
+\r
+/*-------------------------------------------------------------------\r
+ * System timer\r
+ *-----------------------------------------------------------------*/\r
+typedef const uint32 OsTickType;\r
+\r
+extern OsTickType OsTickFreq;\r
+void Os_SysTickInit( void );\r
+void Os_SysTickStart(TickType period_ticks);\r
+TickType Os_SysTickGetValue( void );\r
+TickType Os_SysTickGetElapsedValue( TickType preValue );\r
+\r
+/* Return a value that is always a free running timer */\r
+TickType GetOsTick( void );\r
+\r
+/* Since this is based on SW ticks, no use to have ns resolution */\r
+#define OSTICKDURATION_US              (OSTICKDURATION/1000UL)\r
+\r
+/* Have special macros to always get the OsTick */\r
+#define OS_TICKS2SEC_OS_TICK(_ticks)           ( (OSTICKDURATION_US * (_ticks))/1000000UL )\r
+#define OS_TICKS2MS_OS_TICK(_ticks)            ( (OSTICKDURATION_US * (_ticks))/1000UL )\r
+#define OS_TICKS2US_OS_TICK(_ticks)            (OSTICKDURATION_US * (_ticks))\r
+#define OS_TICKS2NS_OS_TICK(_ticks)            (OSTICKDURATION * (_ticks))\r
+\r
+/*-------------------------------------------------------------------\r
+ * Kernel extra\r
+ *-----------------------------------------------------------------*/\r
+\r
+#if defined(USE_KERNEL_EXTRA)\r
+\r
+#define TICK_MAX       UINT_MAX\r
+\r
+typedef struct OsSemaphore {\r
+       int val;\r
+       STAILQ_HEAD(,OsTaskVar) taskHead;\r
+} OsSemaphoreType;\r
+\r
+typedef OsSemaphoreType OsMutexType;\r
+\r
+StatusType Sleep( TickType ticks );\r
+StatusType InitSemaphore( OsSemaphoreType *semPtr, int initialCount  );\r
+StatusType WaitSemaphore( OsSemaphoreType *semPtr, TickType tmo );\r
+void SignalSemaphore( OsSemaphoreType *semPtr );\r
+StatusType WaitMutex( OsMutexType *mutexPtr );\r
+StatusType ReleaseMutex( OsMutexType *mutexPtr );\r
+#endif\r
+\r
+\r
 /*-------------------------------------------------------------------\r
  * Schedule Tables\r
  *-----------------------------------------------------------------*/\r
@@ -346,23 +451,48 @@ typedef enum {
     OSServiceId_StartupHook,\r
     OSServiceId_ShutdownHook,\r
     OSServiceId_GetTaskState,\r
-} OsServiceIdType;;\r
+    OSServiceId_GetApplicationID,\r
+    OSServiceId_GetISRID,\r
+    OSServiceId_CallTrustedFunction,\r
+    OSServiceId_CheckISRMemoryAccess,\r
+    OSServiceId_TaskMemoryAccess,\r
+    OSServiceId_CheckObjectAccess,\r
+    OSServiceId_CheckObjectOwnership,\r
+    OSServiceId_StartScheduleTableRel,\r
+    OSServiceId_StartScheduleTableAbs,\r
+    OSServiceId_StopScheduleTable,\r
+    OSServiceId_NextScheduleTable,\r
+    OSServiceId_StartScheduleTableSynchron,\r
+    OSServiceId_SyncScheduleTable,\r
+    OSServiceId_GetScheduleTable,\r
+    OSServiceId_SetScheduleTableAsync,\r
+    OSServiceId_IncrementCounter,\r
+    OSServiceId_GetCounterValue,\r
+    OSServiceId_GetElapsedValue,\r
+    OSServiceId_TerminateApplication,\r
+    OSServiceId_AllowAccess,\r
+    OSServiceId_GetApplicationState,\r
+\r
+#if defined(USE_KERNEL_EXTRA)\r
+    OSServiceId_Sleep,\r
+#endif\r
+} OsServiceIdType;\r
 \r
-typedef struct os_error_s {\r
+typedef struct OsError {\r
        OsServiceIdType serviceId;\r
        uint32_t param1;\r
        uint32_t param2;\r
        uint32_t param3;\r
-} os_error_t;\r
+} OsErrorType;\r
 \r
-extern os_error_t os_error;\r
+extern OsErrorType os_error;\r
 \r
 // TODO: Add the service id to all OS service methods.\r
 static inline OsServiceIdType OSErrorGetServiceId(void)  {\r
        return os_error.serviceId;\r
 }\r
 \r
-extern os_error_t os_error;\r
+extern OsErrorType os_error;\r
 \r
 #define OSError_ActivateTask_TaskID ((TaskType) os_error.param1)\r
 #define OSError_ChainTask_TaskID ((TaskType) os_error.param1)\r