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; }
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; }
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; }
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 (); }
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; }