コード例 #1
0
ファイル: nrk.c プロジェクト: adamselevan/dicio
int8_t nrk_TCB_init (nrk_task_type *Task, NRK_STK *ptos, NRK_STK *pbos, uint16_t stk_size, void *pext, uint16_t opt)
{
	
    //  Already in critical section so no needenter critical section
    if(Task->Type!=IDLE_TASK)
    	Task->task_ID=nrk_task_init_cnt;
    else Task->task_ID=NRK_IDLE_TASK_ID;

    if(nrk_task_init_cnt>=NRK_MAX_TASKS) nrk_kernel_error_add(NRK_EXTRA_TASK,0);
    if(Task->Type!=IDLE_TASK) nrk_task_init_cnt++; 
    if(nrk_task_init_cnt==NRK_IDLE_TASK_ID) nrk_task_init_cnt++;
    //initialize member of TCB structure
    nrk_task_TCB[Task->task_ID].OSTaskStkPtr = ptos;
    nrk_task_TCB[Task->task_ID].task_prio = Task->prio;
    nrk_task_TCB[Task->task_ID].task_state = SUSPENDED;
    
    nrk_task_TCB[Task->task_ID].task_ID = Task->task_ID;
    nrk_task_TCB[Task->task_ID].suspend_flag = 0;
    nrk_task_TCB[Task->task_ID].period= _nrk_time_to_ticks_long( &(Task->period) );
    if(Task->period.secs > 4294967) nrk_kernel_error_add(NRK_PERIOD_OVERFLOW,Task->task_ID);
    nrk_task_TCB[Task->task_ID].next_wakeup= _nrk_time_to_ticks_long( &(Task->offset));
    nrk_task_TCB[Task->task_ID].next_period= nrk_task_TCB[Task->task_ID].period+nrk_task_TCB[Task->task_ID].next_wakeup;
    nrk_task_TCB[Task->task_ID].cpu_reserve= _nrk_time_to_ticks_long(&(Task->cpu_reserve));
    nrk_task_TCB[Task->task_ID].cpu_remaining = nrk_task_TCB[Task->task_ID].cpu_reserve;
    nrk_task_TCB[Task->task_ID].num_periods = 1;
    nrk_task_TCB[Task->task_ID].OSTCBStkBottom = pbos;
    nrk_task_TCB[Task->task_ID].errno= NRK_OK;
 
	
	         

			
    return NRK_OK;

}
コード例 #2
0
ファイル: nrk_task.c プロジェクト: alele89/18748-WSN
int8_t nrk_wait (nrk_time_t t)
{
    uint8_t timer;
    uint32_t nw;

    nrk_stack_check ();

    nrk_int_disable ();
    nrk_cur_task_TCB->suspend_flag = 1;
    nrk_cur_task_TCB->num_periods = 1;
    timer = _nrk_os_timer_get ();

//printf( "t1 %lu %lu\n",t.secs, t.nano_secs/NANOS_PER_MS);

    nw = _nrk_time_to_ticks_long (&t);
// printf( "t2 %u %u\r\n",timer, nw);
    nrk_cur_task_TCB->next_wakeup = nw + timer;
//printf( "wu %u\n",nrk_cur_task_TCB->next_wakeup );
    if (timer < (MAX_SCHED_WAKEUP_TIME - TIME_PAD))
    {
        if ((timer + TIME_PAD) <= _nrk_get_next_wakeup ())
        {
            timer += TIME_PAD;
            _nrk_prev_timer_val = timer;
            _nrk_set_next_wakeup (timer);
        }
    }
    nrk_int_enable ();

    _nrk_wait_for_scheduler ();
    return NRK_OK;
}
コード例 #3
0
ファイル: nrk_reserve.c プロジェクト: ESE519/ISA100.11a
int8_t nrk_reserve_set (uint8_t id, nrk_time_t * period, int16_t access_count,
                        void *errhandler)
{
  nrk_time_t tmp_time;

  if (id >= NRK_MAX_RESERVES)
    return NRK_ERROR;
  if (_nrk_reserve[id].active == -1)
    return NRK_ERROR;

  tmp_time.secs = period->secs;
  tmp_time.nano_secs = period->nano_secs;
  _nrk_reserve[id].period_ticks = _nrk_time_to_ticks_long (tmp_time);
  _nrk_reserve[id].set_access = access_count;
  _nrk_reserve[id].cur_access = 0;

  nrk_time_get (&tmp_time);
  _nrk_reserve[id].cur_time = (uint32_t) _nrk_time_to_ticks_long (tmp_time);
  _nrk_reserve[id].set_time =
    _nrk_reserve[id].cur_time + _nrk_reserve[id].period_ticks;
  _nrk_reserve[id].error = (void *) errhandler;

  return NRK_OK;
}
コード例 #4
0
ファイル: nrk_reserve.c プロジェクト: ESE519/ISA100.11a
void _nrk_reserve_update (uint8_t reserve_id)
{
  nrk_time_t t;

  nrk_int_disable ();
  nrk_time_get (&t);

  _nrk_reserve[reserve_id].cur_time = (int32_t) _nrk_time_to_ticks_long (t);
  if (_nrk_reserve[reserve_id].cur_time >= _nrk_reserve[reserve_id].set_time) {
    // If the reserve is passed its period then replenish it
    _nrk_reserve[reserve_id].set_time =
      _nrk_reserve[reserve_id].cur_time +
      _nrk_reserve[reserve_id].period_ticks;
    _nrk_reserve[reserve_id].cur_access = 0;
  }
  nrk_int_enable ();

}
コード例 #5
0
ファイル: nrk_task.c プロジェクト: alele89/18748-WSN
int8_t nrk_set_next_wakeup (nrk_time_t t)
{
    uint8_t timer;
    uint16_t nw;
    nrk_int_disable ();
    timer = _nrk_os_timer_get ();
    nw = _nrk_time_to_ticks_long(&t);
    if (nw <= TIME_PAD)
        return NRK_ERROR;
    nrk_cur_task_TCB->next_wakeup = nw + timer;
    /*	if(timer<(254-TIME_PAD))
    		if((timer+TIME_PAD)<=_nrk_get_next_wakeup())
    		{
    			timer+=TIME_PAD;
    			_nrk_prev_timer_val=timer;
    			_nrk_set_next_wakeup(timer);
    		}
    */
//      nrk_cur_task_TCB->nw_flag=1;
    nrk_int_enable ();

    return NRK_OK;
}