EXPORT StatusType SignalCounter(CounterType counter) { AlarmType alarm; BEGIN_CRITICAL_SECTION(); /* here I see the difference between arccore and nxtOSEK. in nxtOSEK, max allowed value allowed for counter and alarm are both the MaxAllowedValue*2, as it has implemented the TicksPerBase. So the method used by nxtOSEK is preferred. */ knl_ccb_value[counter] = knl_add_ticks(knl_ccb_value[counter],1,knl_ccb_max[counter]*2); alarm = knl_ccb_head[counter]; while(INVALID_ALARM != alarm) { if(knl_diff_tick(knl_ccb_value[counter],knl_acb_value[alarm],knl_ccb_max[counter]*2) > knl_ccb_max[counter]) { break; } else { AlarmType next = knl_acb_next[alarm]; knl_acb_action[alarm](); knl_alarm_remove(alarm); if(0 != knl_acb_period[alarm]) { knl_acb_value[alarm] = knl_add_ticks(knl_ccb_value[counter], \ knl_acb_period[alarm], \ knl_ccb_max[counter]*2); knl_alarm_insert(alarm); } else { knl_acb_value[alarm] = ALARM_STOPPED; } alarm = next; } } END_CRITICAL_SECTION(); return E_OK; }
/* |------------------+-----------------------------------------------------------------| */ StatusType SetRelAlarm ( AlarmType AlarmID , TickType Increment ,TickType Cycle ) { StatusType ercd = E_OK; CounterType counter; OS_EXT_VALIDATE((AlarmID < cfgOS_ALARM_NUM),E_OS_ID); OS_STD_VALIDATE((ALARM_STOPPED == knl_acb_value[AlarmID]),E_OS_STATE); counter = knl_acb_counter[AlarmID]; OS_EXT_VALIDATE((knl_ccb_max[counter] >= Increment),E_OS_VALUE); OS_EXT_VALIDATE((knl_ccb_max[counter] >= Cycle),E_OS_VALUE); OS_EXT_VALIDATE(((0u == Cycle)||(knl_ccb_min[counter] <= Cycle)),E_OS_VALUE); BEGIN_DISABLE_INTERRUPT(); knl_acb_value[AlarmID] = knl_add_ticks(knl_ccb_value[counter],Increment,knl_ccb_max[counter]*2); knl_acb_period[AlarmID] = Cycle; knl_alarm_insert(AlarmID); END_DISABLE_INTERRUPT(); OS_VALIDATE_ERROR_EXIT() OsErrorProcess3(SetRelAlarm,almid,AlarmID,incr,Increment,cycle,Cycle); return ercd; }
/* |------------------+-----------------------------------------------------------------| */ StatusType SetRelAlarm ( AlarmType AlarmID , TickType Increment ,TickType Cycle ) { StatusType ercd = E_OK; ALMCB *almcb; CCB *ccb; CounterType cntid; TickType max; OS_CHECK_EXT((AlarmID < cfgOSEK_ALARM_NUM),E_OS_ID); almcb = &knl_almcb_table[AlarmID]; OS_CHECK((isQueEmpty(&almcb->almque)),E_OS_STATE); cntid = knl_galm_table[AlarmID].owner; max = knl_almbase_table[cntid].maxallowedvalue; OS_CHECK_EXT((max >= Increment),E_OS_VALUE); OS_CHECK_EXT((max >= Cycle),E_OS_VALUE); OS_CHECK_EXT(((knl_almbase_table[cntid].mincycle <= Cycle) || (0 == Cycle)),E_OS_VALUE); ccb = &knl_ccb_table[cntid]; BEGIN_DISABLE_INTERRUPT; almcb->time = knl_add_ticks(ccb->curvalue,Increment,max*2); almcb->cycle = Cycle; knl_alm_insert(almcb,ccb); END_DISABLE_INTERRUPT; Error_Exit: #if(cfgOS_ERROR_HOOK == STD_ON) if(E_OK != ercd) { BEGIN_CRITICAL_SECTION; _errorhook_svcid = OSServiceId_SetRelAlarm; _errorhook_par1.almid = AlarmID; _errorhook_par2.incr = Increment; _errorhook_par3.cycle = Cycle; CallErrorHook(ercd); END_CRITICAL_SECTION; } #endif /* cfgOS_ERROR_HOOK */ return ercd; }