예제 #1
0
파일: sched.c 프로젝트: vmm386/vmm386
/* 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();
}
예제 #2
0
/**
 * @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, &current_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;
}