void ErrorHook(StatusType Error) { TaskType tskid; StatusType ercd; #ifdef IOC_E_NO_DATA /* IOC_E_NO_DATAはエラーではない */ if (Error == IOC_E_NO_DATA) { return; } #endif /* IOC_E_NO_DATA */ syslog(LOG_NOTICE, "## ErrorHook is called !! (%d)", Error); ercd = GetTaskID(&tskid); if (ercd == E_OK) { syslog(LOG_NOTICE, "GetTaskID: %d", (sintptr) tskid); } else { syslog(LOG_NOTICE, "GetTaskID is unavailable."); } syslog(LOG_NOTICE, "GetISRID: %d", (sintptr) GetISRID()); syslog(LOG_NOTICE, "OSErrorGetServiceId(): %d", OSErrorGetServiceId()); return; }
/*test case:test the reaction of the system called with an activation of a task*/ static void test_error_instance2(void) { ISRType ISRType_inst_1; StatusType result_inst_1; SCHEDULING_CHECK_INIT(8); result_inst_1 = OSErrorGetServiceId(); SCHEDULING_CHECK_AND_EQUAL_INT(8,OSServiceId_ActivateTask , result_inst_1); SCHEDULING_CHECK_INIT(9); ISRType_inst_1 = GetISRID(); SCHEDULING_CHECK_AND_EQUAL_INT(9, INVALID_ISR, ISRType_inst_1); }
ErrorHook(StatusType Error) { ISRType ISRInError; TaskType TaskInError; /* * This code sample shows how to determine which Task or * ISR was running when the error occurred. */ ISRInError = GetISRID(); if (ISRInError != INVALID_ISR) { /* The error occurred when ISR 'ISRInError' was running */ } else { GetTaskID(&TaskInError); if (TaskInError != INVALID_TASK) { /* The error occurred when Task 'TaskInError' was running */ } else { /* The error occurred during StartOS, Os_Cbk_Idle or ShutdownOS */ } } /* * This code sample shows how to determine which error * was detected. */ switch (Error) { case E_OS_ACCESS: /* Handle E_OS_ACCESS */ break; case E_OS_CALLEVEL: /* Handle E_OS_CALLEVEL */ break; case E_OS_ID: /* Handle E_OS_ID */ break; case E_OS_LIMIT: /* Handle E_OS_LIMIT */ break; case E_OS_NOFUNC: /* Handle E_OS_NOFUNC */ break; case E_OS_RESOURCE: /* Handle E_OS_RESOURCE */ break; case E_OS_STATE: /* Handle E_OS_STATE */ break; case E_OS_VALUE: /* Handle E_OS_VALUE */ break; case E_OS_SERVICEID: /* Handle E_OS_SERVICEID */ break; case E_OS_ILLEGAL_ADDRESS: /* Handle E_OS_ILLEGAL_ADDRESS */ break; case E_OS_MISSINGEND: /* Handle E_OS_MISSINGEND */ break; case E_OS_DISABLEDINT: /* Handle E_OS_DISABLEDINT */ break; case E_OS_STACKFAULT: /* Handle E_OS_STACKFAULT */ break; case E_OS_SYS_NO_RESTART: /* Handle E_OS_SYS_NO_RESTART */ break; case E_OS_SYS_RESTART: /* Handle E_OS_SYS_RESTART */ break; case E_OS_SYS_OVERRUN: /* Handle E_OS_SYS_OVERRUN */ break; } #ifdef OSErrorGetServiceId /* * With Service ID logging enabled, it is possible to * determine which API was running when the error was * detected through OSErrorGetServiceId(). * If Parameter logging is enabled, it is also possible * to use the OSError_ macros to see the parameter * values passed to the API. */ switch (OSErrorGetServiceId()) { case OSServiceId_None: /* Handle ISR termination errors */ break; case OSServiceId_ActivateTask: /* Handle error from ActivateTask */ /* OSError_ActivateTask_TaskID() contains the TaskType 'TaskID' passed to ActivateTask */ break; case OSServiceId_Os_AdvanceCounter: /* Handle error from Os_AdvanceCounter */ /* OSError_Os_AdvanceCounter_CounterID() contains the CounterType 'CounterID' passed to Os_AdvanceCounter */ break; case OSServiceId_CancelAlarm: /* Handle error from CancelAlarm */ /* OSError_CancelAlarm_AlarmID() contains the AlarmType 'AlarmID' passed to CancelAlarm */ break; case OSServiceId_CallTrustedFunction: /* Handle error from CallTrustedFunction */ /* OSError_CallTrustedFunction_FunctionIndex() contains the TrustedFunctionIndexType 'FunctionIndex' passed to CallTrustedFunction */ /* OSError_CallTrustedFunction_FunctionParams() contains the TrustedFunctionParameterRefType 'FunctionParams' passed to CallTrustedFunction */ break; case OSServiceId_CheckISRMemoryAccess: /* Handle error from CheckISRMemoryAccess */ break; case OSServiceId_CheckObjectAccess: /* Handle error from CheckObjectAccess */ break; case OSServiceId_CheckObjectOwnership: /* Handle error from CheckObjectOwnership */ break; case OSServiceId_CheckTaskMemoryAccess: /* Handle error from CheckTaskMemoryAccess */ break; case OSServiceId_ChainTask: /* Handle error from ChainTask */ /* OSError_ChainTask_TaskID() contains the TaskType 'TaskID' passed to ChainTask */ break; case OSServiceId_ClearEvent: /* Handle error from ClearEvent */ /* OSError_ClearEvent_Mask() contains the EventMaskType 'Mask' passed to ClearEvent */ break; case OSServiceId_DisableAllInterrupts: /* Handle error from DisableAllInterrupts */ break; case OSServiceId_EnableAllInterrupts: /* Handle error from EnableAllInterrupts */ break; case OSServiceId_GetActiveApplicationMode: /* Handle error from GetActiveApplicationMode */ break; case OSServiceId_GetAlarm: /* Handle error from GetAlarm */ /* OSError_GetAlarm_AlarmID() contains the AlarmType 'AlarmID' passed to GetAlarm */ /* OSError_GetAlarm_Tick() contains the TickRefType 'Tick' passed to GetAlarm */ break; case OSServiceId_GetAlarmBase: /* Handle error from GetAlarmBase */ /* OSError_GetAlarmBase_AlarmID() contains the AlarmType 'AlarmID' passed to GetAlarmBase */ /* OSError_GetAlarmBase_Info() contains the AlarmBaseRefType 'Info' passed to GetAlarmBase */ break; case OSServiceId_GetApplicationID: /* Handle error from GetApplicationID */ break; case OSServiceId_GetCounterValue: /* Handle error from GetCounterValue */ /* OSError_GetCounterValue_CounterID() contains the CounterType 'CounterID' passed to GetCounterValue */ /* OSError_GetCounterValue_Value() contains the TickRefType 'Value' passed to GetCounterValue */ break; case OSServiceId_GetElapsedCounterValue: /* Handle error from GetElapsedCounterValue */ /* OSError_GetElapsedCounterValue_CounterID() contains the CounterType 'CounterID' passed to GetElapsedCounterValue */ /* OSError_GetElapsedCounterValue_Value() contains the TickRefType 'Value' passed to GetElapsedCounterValue */ /* OSError_GetElapsedCounterValue_ElapsedValue() contains the TickRefType 'ElapsedValue' passed to GetElapsedCounterValue */ break; case OSServiceId_GetEvent: /* Handle error from GetEvent */ /* OSError_GetEvent_TaskID() contains the TaskType 'TaskID' passed to GetEvent */ /* OSError_GetEvent_Event() contains the EventMaskRefType 'Event' passed to GetEvent */ break; case OSServiceId_GetISRID: /* Handle error from GetISRID */ break; case OSServiceId_GetResource: /* Handle error from GetResource */ /* OSError_GetResource_ResID() contains the ResourceType 'ResID' passed to GetResource */ break; case OSServiceId_GetScheduleTableStatus: /* Handle error from GetScheduleTableStatus */ /* OSError_GetScheduleTableStatus_ScheduleTableID() contains the ScheduleTableType 'ScheduleTableID' passed to GetScheduleTableStatus */ /* OSError_GetScheduleTableStatus_ScheduleStatus() contains the ScheduleTableStatusRefType 'ScheduleStatus' passed to GetScheduleTableStatus */ break; case OSServiceId_GetTaskID: /* Handle error from GetTaskID */ /* OSError_GetTaskID_TaskID() contains the TaskRefType 'TaskID' passed to GetTaskID */ break; case OSServiceId_GetTaskState: /* Handle error from GetTaskState */ /* OSError_GetTaskState_TaskID() contains the TaskType 'TaskID' passed to GetTaskState */ /* OSError_GetTaskState_State() contains the TaskStateRefType 'State' passed to GetTaskState */ break; case OSServiceId_GetVersionInfo: /* Handle error from GetVersionInfo */ break; case OSServiceId_IncrementCounter: /* Handle error from IncrementCounter */ /* OSError_IncrementCounter_CounterID() contains the CounterType 'CounterID' passed to IncrementCounter */ break; case OSServiceId_NextScheduleTable: /* Handle error from NextScheduleTable */ /* OSError_NextScheduleTable_ScheduleTableID_From() contains the ScheduleTableType 'ScheduleTableID_From' passed to NextScheduleTable */ /* OSError_NextScheduleTable_ScheduleTableID_To() contains the ScheduleTableType 'ScheduleTableID_To' passed to NextScheduleTable */ break; case OSServiceId_Os_GetExecutionTime: /* Handle error from Os_GetExecutionTime */ break; case OSServiceId_Os_GetISRMaxExecutionTime: /* Handle error from Os_GetISRMaxExecutionTime */ /* OSError_Os_GetISRMaxExecutionTime_ISRID() contains the ISRType 'ISRID' passed to Os_GetISRMaxExecutionTime */ break; case OSServiceId_Os_GetTaskMaxExecutionTime: /* Handle error from Os_GetTaskMaxExecutionTime */ /* OSError_Os_GetTaskMaxExecutionTime_TaskID() contains the TaskType 'TaskID' passed to Os_GetTaskMaxExecutionTime */ break; case OSServiceId_Os_ResetISRMaxExecutionTime: /* Handle error from Os_ResetISRMaxExecutionTime */ /* OSError_Os_ResetISRMaxExecutionTime_ISRID() contains the ISRType 'ISRID' passed to Os_ResetISRMaxExecutionTime */ break; case OSServiceId_Os_ResetTaskMaxExecutionTime: /* Handle error from Os_ResetTaskMaxExecutionTime */ /* OSError_Os_ResetTaskMaxExecutionTime_TaskID() contains the TaskType 'TaskID' passed to Os_ResetTaskMaxExecutionTime */ break; case OSServiceId_Os_GetStackUsage: /* Handle error from Os_GetStackUsage */ break; case OSServiceId_Os_GetISRMaxStackUsage: /* Handle error from Os_GetISRMaxStackUsage */ /* OSError_Os_GetISRMaxStackUsage_ISRID() contains the ISRType 'ISRID' passed to Os_GetISRMaxStackUsage */ break; case OSServiceId_Os_GetTaskMaxStackUsage: /* Handle error from Os_GetTaskMaxStackUsage */ /* OSError_Os_GetTaskMaxStackUsage_TaskID() contains the TaskType 'TaskID' passed to Os_GetTaskMaxStackUsage */ break; case OSServiceId_Os_ResetISRMaxStackUsage: /* Handle error from Os_ResetISRMaxStackUsage */ /* OSError_Os_ResetISRMaxStackUsage_ISRID() contains the ISRType 'ISRID' passed to Os_ResetISRMaxStackUsage */ break; case OSServiceId_Os_ResetTaskMaxStackUsage: /* Handle error from Os_ResetTaskMaxStackUsage */ /* OSError_Os_ResetTaskMaxStackUsage_TaskID() contains the TaskType 'TaskID' passed to Os_ResetTaskMaxStackUsage */ break; case OSServiceId_ReleaseResource: /* Handle error from ReleaseResource */ /* OSError_ReleaseResource_ResID() contains the ResourceType 'ResID' passed to ReleaseResource */ break; case OSServiceId_Restart: /* Handle error from Restart */ break; case OSServiceId_ResumeAllInterrupts: /* Handle error from ResumeAllInterrupts */ break; case OSServiceId_ResumeOSInterrupts: /* Handle error from ResumeOSInterrupts */ break; case OSServiceId_Schedule: /* Handle error from Schedule */ break; case OSServiceId_SetEvent: /* Handle error from SetEvent */ /* OSError_SetEvent_TaskID() contains the TaskType 'TaskID' passed to SetEvent */ /* OSError_SetEvent_Mask() contains the EventMaskType 'Mask' passed to SetEvent */ break; case OSServiceId_SetAbsAlarm: /* Handle error from SetAbsAlarm */ /* OSError_SetAbsAlarm_AlarmID() contains the AlarmType 'AlarmID' passed to SetAbsAlarm */ /* OSError_SetAbsAlarm_start() contains the TickType 'start' passed to SetAbsAlarm */ /* OSError_SetAbsAlarm_cycle() contains the TickType 'cycle' passed to SetAbsAlarm */ break; case OSServiceId_SetRelAlarm: /* Handle error from SetRelAlarm */ /* OSError_SetRelAlarm_AlarmID() contains the AlarmType 'AlarmID' passed to SetRelAlarm */ /* OSError_SetRelAlarm_increment() contains the TickType 'increment' passed to SetRelAlarm */ /* OSError_SetRelAlarm_cycle() contains the TickType 'cycle' passed to SetRelAlarm */ break; case OSServiceId_SetRestartPoint: /* Handle error from SetRestartPoint */ break; case OSServiceId_ShutdownOS: /* Handle error from ShutdownOS */ break; case OSServiceId_StartOS: /* Handle error from StartOS */ break; case OSServiceId_StartScheduleTableAbs: /* Handle error from StartScheduleTableAbs */ /* OSError_StartScheduleTableAbs_ScheduleTableID() contains the ScheduleTableType 'ScheduleTableID' passed to StartScheduleTableAbs */ /* OSError_StartScheduleTableAbs_Start() contains the TickType 'Start' passed to StartScheduleTableAbs */ break; case OSServiceId_StartScheduleTableRel: /* Handle error from StartScheduleTableRel */ /* OSError_StartScheduleTableRel_ScheduleTableID() contains the ScheduleTableType 'ScheduleTableID' passed to StartScheduleTableRel */ /* OSError_StartScheduleTableRel_Offset() contains the TickType 'Offset' passed to StartScheduleTableRel */ break; case OSServiceId_StartScheduleTableSynchron: /* Handle error from StartScheduleTableSynchron */ /* OSError_StartScheduleTableSynchron_ScheduleTableID() contains the ScheduleTableType 'ScheduleTableID' passed to StartScheduleTableSynchron */ break; case OSServiceId_SyncScheduleTable: /* Handle error from SyncScheduleTable */ /* OSError_SyncScheduleTable_ScheduleTableID() contains the ScheduleTableType 'ScheduleTableID' passed to SyncScheduleTable */ /* OSError_SyncScheduleTable_Value() contains the TickType 'Value' passed to SyncScheduleTable */ break; case OSServiceId_SetScheduleTableAsync: /* Handle error from SetScheduleTableAsync */ /* OSError_SetScheduleTableAsync_ScheduleTableID() contains the ScheduleTableType 'ScheduleTableID' passed to SetScheduleTableAsync */ break; case OSServiceId_StopScheduleTable: /* Handle error from StopScheduleTable */ /* OSError_StopScheduleTable_ScheduleTableID() contains the ScheduleTableType 'ScheduleTableID' passed to StopScheduleTable */ break; case OSServiceId_SuspendAllInterrupts: /* Handle error from SuspendAllInterrupts */ break; case OSServiceId_SuspendOSInterrupts: /* Handle error from SuspendOSInterrupts */ break; case OSServiceId_TerminateApplication: /* Handle error from TerminateApplication */ /* OSError_TerminateApplication_RestartOption() contains the RestartType 'RestartOption' passed to TerminateApplication */ break; case OSServiceId_TerminateTask: /* Handle error from TerminateTask */ break; case OSServiceId_WaitEvent: /* Handle error from WaitEvent */ /* OSError_WaitEvent_Mask() contains the EventMaskType 'Mask' passed to WaitEvent */ break; } #endif /* OSErrorGetServiceId */ }
/* Error hook for all tests * * $Req: artf1222 $ */ void ErrorHook(StatusType rc) { #ifdef USEERRORHOOK #ifdef EXPECTSERRORS TaskType from_task; ISRType from_isr; TaskStateType state; if(in_error_hook) { test_failed(OS_HERE); /* Error hook not permitted to be called recursively $Req: artf1112 $ */ } in_error_hook = 1U; SET_TESTEVENT("ErrorHook"); #ifdef OS_EXTENDED_STATUS /* Test for recursive error hook call by making a legal call which generates an error */ GetTaskState(0, &state); #endif /* $Req: artf1140 $ */ GetTaskID(&from_task); from_isr = GetISRID(); if(from_isr == INVALID_ISR) { if(from_task == INVALID_TASK) { SET_TESTEVENT("<No runnable>"); /* Not sure how to get an error hook called if no task or ISR running.. */ } else { /* Must be a task that caused the error hook to run since there is no ISR running */ #ifdef INCLUDE_HANDLE_NAME_MAP SET_TESTEVENT(TaskType2string(from_task)); #else SET_TESTEVENT("<A task>"); #endif /* ErrorHook() should be called with cat2 interrupts locked. * * $Req: artf1110 $ * * Following code will trigger the cat2 ISR here but it should not actually run. Dismiss it immediately. * * Only do this if the error hook is called from outside an ISR because otherwise this would mess up * the only cat2 ISR. In mosts tests the ISR running is logged, and this would cause the test to fail * because there should be no expect ISR log entries at this point. */ testing_trigger_isr(); testing_dismiss_isr(); } } else { /* An ISR must be running; this takes precedence over a task: the error must have * been raised in the ISR since the task can't be running (all ISRs have higher priorities * than all tasks) */ #ifdef INCLUDE_HANDLE_NAME_MAP SET_TESTEVENT(ISRType2string(from_isr)); #else SET_TESTEVENT("<An ISR>"); #endif } /* If E_OS_MISSING end called then the task is still valid and still RUNNING when the error hook called */ if(rc == E_OS_MISSINGEND) { /* $Req: artf1041 $ */ if(from_task == INVALID_TASK) { test_failed(OS_HERE); } else { GetTaskState(from_task, &state); if(state != RUNNING) { test_failed(OS_HERE); } } } /* OSErrorGetServiceId() callable from ErrorHook() * * $Req: artf1114 $ * $Req: artf1228 $ */ SET_TESTEVENT(OSServiceIdType2string(OSErrorGetServiceId(), "<Unknown service ID>")); SET_TESTEVENT(StatusType2string(rc, "<Unknown StatusType code>")); set_error_hook_parameters(OSErrorGetServiceId()); in_error_hook = 0U; #else /* don't expect errors */ test_failed(OS_HERE); #endif #else /* don't use error hook * * $Req: artf1223 $ */ test_failed(OS_HERE); #endif }
/*test case:test the reaction of the system called with an activation of a task*/ static void test_t1_instance(void) { ApplicationType ApplicationType_inst_1, ApplicationType_inst_2; ISRType ISRType_inst_1; ObjectAccessType ObjectAccessType_inst_1; ScheduleTableStatusType ScheduleTableStatusType_inst_1; StatusType result_inst_1, result_inst_2, result_inst_3, result_inst_4, result_inst_5, result_inst_6, result_inst_7, result_inst_8, result_inst_9, result_inst_10, result_inst_11, result_inst_12; TickType TickType_inst_1, TickType_inst_2; SCHEDULING_CHECK_STEP(1); DisableAllInterrupts(); SCHEDULING_CHECK_INIT(2); ApplicationType_inst_1 = GetApplicationID(); SCHEDULING_CHECK_AND_EQUAL_INT(3, app1, ApplicationType_inst_1); SCHEDULING_CHECK_INIT(4); ISRType_inst_1 = GetISRID(); SCHEDULING_CHECK_AND_EQUAL_INT(5, INVALID_ISR, ISRType_inst_1); SCHEDULING_CHECK_INIT(6); ObjectAccessType_inst_1 = CheckObjectAccess(app1, OBJECT_TASK, t1); SCHEDULING_CHECK_AND_EQUAL_INT(7, ACCESS, ObjectAccessType_inst_1); SCHEDULING_CHECK_INIT(8); ApplicationType_inst_2 = CheckObjectOwnership(OBJECT_TASK, t1); SCHEDULING_CHECK_AND_EQUAL_INT(9, app1, ApplicationType_inst_2); SCHEDULING_CHECK_INIT(10); result_inst_1 = StartScheduleTableRel(sched1, 1); SCHEDULING_CHECK_AND_EQUAL_INT(11, E_OS_DISABLEDINT, result_inst_1); SCHEDULING_CHECK_INIT(12); result_inst_2 = StartScheduleTableAbs(sched1, 0); SCHEDULING_CHECK_AND_EQUAL_INT(13, E_OS_DISABLEDINT, result_inst_2); SCHEDULING_CHECK_INIT(14); result_inst_3 = StopScheduleTable(sched1); SCHEDULING_CHECK_AND_EQUAL_INT(15, E_OS_DISABLEDINT, result_inst_3); SCHEDULING_CHECK_INIT(16); result_inst_4 = NextScheduleTable(sched1, sched2); SCHEDULING_CHECK_AND_EQUAL_INT(17, E_OS_DISABLEDINT, result_inst_4); SCHEDULING_CHECK_INIT(18); result_inst_5 = StartScheduleTableSynchron(sched1); SCHEDULING_CHECK_AND_EQUAL_INT(19, E_OS_DISABLEDINT, result_inst_5); SCHEDULING_CHECK_INIT(20); result_inst_6 = SyncScheduleTable(sched1, 0); SCHEDULING_CHECK_AND_EQUAL_INT(21, E_OS_DISABLEDINT, result_inst_6); SCHEDULING_CHECK_INIT(22); result_inst_7 = GetScheduleTableStatus(sched1, &ScheduleTableStatusType_inst_1); SCHEDULING_CHECK_AND_EQUAL_INT(23, E_OS_DISABLEDINT, result_inst_7); SCHEDULING_CHECK_INIT(24); result_inst_8 = SetScheduleTableAsync(sched1); SCHEDULING_CHECK_AND_EQUAL_INT(25, E_OS_DISABLEDINT, result_inst_8); SCHEDULING_CHECK_INIT(26); result_inst_9 = IncrementCounter(Software_Counter1); SCHEDULING_CHECK_AND_EQUAL_INT(27, E_OS_DISABLEDINT, result_inst_9); SCHEDULING_CHECK_INIT(28); result_inst_10 = GetCounterValue(Software_Counter1, &TickType_inst_1); SCHEDULING_CHECK_AND_EQUAL_INT(29, E_OS_DISABLEDINT, result_inst_10); SCHEDULING_CHECK_INIT(30); result_inst_11 = GetElapsedCounterValue(Software_Counter1, &TickType_inst_1, &TickType_inst_2); SCHEDULING_CHECK_AND_EQUAL_INT(31, E_OS_DISABLEDINT, result_inst_11); SCHEDULING_CHECK_INIT(32); result_inst_12 = TerminateApplication(app1, NO_RESTART); SCHEDULING_CHECK_AND_EQUAL_INT(33, E_OS_DISABLEDINT, result_inst_12); SCHEDULING_CHECK_STEP(34); EnableAllInterrupts(); /* Missing : - CallTrustedFunction - CheckISRMemoryAccess - CheckTaskMemoryAccess - GetActiveApplicationMode (OS tests) Ok but not tested : - StartOS (OS tests) - ShutdownOS (OS tests) */ }