Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
/* |------------------+-----------------------------------------------------------------| */
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;
}
Exemplo n.º 3
0
/* |------------------+-----------------------------------------------------------------| */
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;
}