/* Suspend the current task immediately, note that this *may not* be called from an interrupt handler. */ void suspend_current_task(void) { forbid(); suspend_task(current_task); schedule(); permit(); }
/** * @brief * This function sleeps for given number of seconds * @param secs * Number of secs to sleep */ void sw_sleep(u32 secs) { timeval_t time; time.tval.nsec = 0; time.tval.sec = secs; # ifndef CONFIG_EMULATE_FIQ int current_context; struct timer_event *tevent; current_context = get_current_task_id(); #ifdef TIMER_DBG sw_printf("SW: sleep sec 0x%08x nsec 0x%08x \n",time.tval.sec,time.tval.nsec); #endif tevent = timer_event_create(&wake_up_from_sleep, ¤t_context); if(!tevent){ sw_printf("SW: Out of memory : Cannot Perform Sleep\n"); return; } timer_event_start(tevent, &time); suspend_task(current_context, TASK_STATE_WAIT); schedule(); # else u32 clockcycles = timeval_to_clockcycles(&time); #ifdef TIMER_DBG sw_printf("SW: clockcycles 0x%08x \n",clockcycles); #endif enable_timer(); while(1){ u32 curr_val = read_sleep_timer(); if(curr_val > clockcycles){ break; } } disable_timer(); # endif return; }