예제 #1
0
파일: proc.c 프로젝트: gordon-quad/bugurtos
//========================================================================================
// #BGRT_PROC_FLG_PRE_STOP processing with mask clearing.
void _bgrt_proc_free( void )
{
    bgrt_proc_t * proc;
    proc = bgrt_curr_proc();

    BGRT_SPIN_LOCK( proc );

    if( proc->cnt_lock )
    {
        proc->cnt_lock--;
    }

    if( ((bgrt_cnt_t)0) == proc->cnt_lock )
    {
        proc->flags &= ~BGRT_PROC_FLG_LOCK;
    }
    /*
    If a process stop was called
    and a process does not have locked resources,
    then stop a process.
    */
    if(  BGRT_PROC_PRE_STOP_TEST(proc)  )
    {
        _bgrt_proc_stop_ensure( proc );
        proc->flags &= ~BGRT_PROC_FLG_PRE_STOP;
    }

    BGRT_SPIN_FREE( proc );
}
예제 #2
0
파일: proc.c 프로젝트: gordon-quad/bugurtos
//========================================================================================
// Stop a process from ISR
bgrt_st_t _bgrt_proc_stop(bgrt_proc_t * proc)
{
    bgrt_st_t ret = BGRT_ST_ROLL;

    if( !proc )
    {
        proc = bgrt_curr_proc();
    }

    BGRT_SPIN_LOCK( proc );
    //Check flags
    //When BGRT_PROC_FLG_MUTEX or BGRT_PROC_FLG_SEM or both are set we must process BGRT_PROC_FLG_PRE_STOP on common resource release.
    if( proc->flags & (BGRT_PROC_FLG_LOCK_MASK|BGRT_PROC_FLG_PRE_STOP|BGRT_PROC_STATE_WAIT_MASK) )
    {
        proc->flags |= BGRT_PROC_FLG_PRE_STOP;
    }
    else
    {
        _bgrt_proc_stop_ensure( proc );
        ret = BGRT_ST_OK;;
    }

    BGRT_SPIN_FREE( proc );
    return ret;
}
예제 #3
0
파일: proc.c 프로젝트: gordon-quad/bugurtos
//========================================================================================
// Restart a process from some ISR.
bgrt_st_t _bgrt_proc_restart(bgrt_proc_t * proc)
{
    bgrt_st_t ret = BGRT_ST_OK;

    if( !proc )
    {
        return BGRT_ST_ENULL;
    }

    BGRT_SPIN_LOCK( proc );

    if( proc->flags & (BGRT_PROC_FLG_LOCK_MASK|BGRT_PROC_STATE_RESTART_MASK) )
    {
        ret = BGRT_ST_ESTAT;
        goto end;
    }
    proc->flags = ( proc->flags & BGRT_PROC_FLG_RT )?BGRT_PROC_FLG_RT:(bgrt_flag_t)0;

    BGRT_PROC_LRES_INIT( proc );

    proc->timer = proc->time_quant;

    if( proc->sstart )
    {
        proc->spointer = bgrt_proc_stack_init( proc->sstart, (bgrt_code_t)proc->pmain, (void *)proc->arg, (void (*)(void))bgrt_proc_terminate );
    }
    bgrt_sched_proc_run( proc, BGRT_PROC_STATE_READY );
end:
    BGRT_SPIN_FREE( proc );
    return ret;
}
예제 #4
0
파일: proc.c 프로젝트: gordon-quad/bugurtos
//========================================================================================
void _bgrt_proc_self_stop(void)
{
    bgrt_proc_t * proc;
    proc = bgrt_curr_proc();

    BGRT_SPIN_LOCK( proc );

    _bgrt_proc_stop_ensure( proc );

    BGRT_SPIN_FREE( proc );
}
예제 #5
0
파일: proc.c 프로젝트: gordon-quad/bugurtos
//========================================================================================
void _bgrt_proc_lock( void )
{
    bgrt_proc_t * proc;
    proc = bgrt_curr_proc();

    BGRT_SPIN_LOCK( proc );

    proc->flags |= BGRT_PROC_FLG_LOCK;
    proc->cnt_lock++;

    BGRT_SPIN_FREE( proc );
}
예제 #6
0
/*===========================================================================*/
void bgrt_priv_clear_timer(bgrt_tmr_t * t)
{
    BGRT_ASSERT(t, "The #t must not be NULL!");

    BGRT_CRIT_SEC_ENTER(); /* ADLINT:SL:[W0425] several def/expr*/
    BGRT_SPIN_LOCK(&bgrt_kernel.timer);

    *t = bgrt_kernel.timer.val;

    BGRT_SPIN_FREE(&bgrt_kernel.timer);
    BGRT_CRIT_SEC_EXIT();
}
예제 #7
0
/*===========================================================================*/
bgrt_tmr_t bgrt_priv_timer(bgrt_tmr_t t)
{
    bgrt_tmr_t ret;
    BGRT_CRIT_SEC_ENTER(); /* ADLINT:SL:[W0425] several def/expr*/
    BGRT_SPIN_LOCK(&bgrt_kernel.timer);

    ret = (bgrt_tmr_t)bgrt_kernel.timer.val - (bgrt_tmr_t)t; /* ADLINT:SL:[W1052] OVF*/

    BGRT_SPIN_FREE(&bgrt_kernel.timer);
    BGRT_CRIT_SEC_EXIT();

    return ret;
}
예제 #8
0
파일: proc.c 프로젝트: gordon-quad/bugurtos
//========================================================================================
void _bgrt_proc_reset_watchdog( void )
{
    bgrt_proc_t * proc;
    proc = bgrt_curr_proc();

    BGRT_SPIN_LOCK( proc );

    if( proc->flags & BGRT_PROC_FLG_RT )
    {
        proc->timer = proc->time_quant;
    }

    BGRT_SPIN_FREE( proc );
}
예제 #9
0
파일: proc.c 프로젝트: gordon-quad/bugurtos
//========================================================================================
bgrt_prio_t _bgrt_proc_get_prio( bgrt_proc_t * proc )
{
    bgrt_prio_t ret;

    if( !proc )
    {
        proc = bgrt_curr_proc();
    }

    BGRT_SPIN_LOCK( proc );
    ret = proc->base_prio;
    BGRT_SPIN_FREE( proc );

    return ret;
}
예제 #10
0
파일: proc.c 프로젝트: gordon-quad/bugurtos
//========================================================================================
bgrt_st_t _bgrt_proc_init(
    bgrt_proc_t * proc, //A process pointer!
    bgrt_code_t pmain,
    bgrt_code_t sv_hook,
    bgrt_code_t rs_hook,
    void * arg,
    bgrt_stack_t *sstart,
    bgrt_prio_t prio,
    bgrt_tmr_t time_quant,
    bgrt_bool_t is_rt // Is it RT process?
#ifdef BGRT_CONFIG_MP
    ,bgrt_aff_t affinity
#endif // BGRT_CONFIG_MP
)
{
    if( !proc )
    {
        return BGRT_ST_ENULL;
    }

    BGRT_SPIN_INIT( proc );
    BGRT_SPIN_LOCK( proc );

    bgrt_pitem_init( (bgrt_pitem_t *)proc, prio );
    proc->flags = ( is_rt )?(BGRT_PROC_FLG_RT|BGRT_PROC_FLG_RR):(BGRT_PROC_FLG_RR); // Default behavior is round robin scheduling

    BGRT_PROC_LRES_INIT( proc );

    proc->base_prio = prio;
    proc->time_quant = time_quant;
    proc->timer = time_quant;
    proc->sync = (bgrt_sync_t *)0;
    proc->cnt_lock = (bgrt_cnt_t)0;
#ifdef BGRT_CONFIG_MP
    proc->core_id = (bgrt_cpuid_t)0;
    proc->affinity = affinity;
#endif // BGRT_CONFIG_MP
    proc->pmain = pmain;
    proc->sv_hook = sv_hook;
    proc->rs_hook = rs_hook;
    proc->arg = arg;
    proc->sstart = sstart;
    if( sstart )proc->spointer = bgrt_proc_stack_init(sstart, (bgrt_code_t)pmain, (void *)arg, (void (*)(void))bgrt_proc_terminate);

    BGRT_SPIN_FREE( proc );

    return BGRT_ST_OK;
}
예제 #11
0
파일: proc.c 프로젝트: gordon-quad/bugurtos
//========================================================================================
// Run a process? used in ISRs and in #BGRT_SYSCALL_PROC_RUN
bgrt_st_t _bgrt_proc_run(bgrt_proc_t * proc)
{
    bgrt_st_t ret = BGRT_ST_OK;

    if( !proc )
    {
        return BGRT_ST_ENULL;
    }

    BGRT_SPIN_LOCK( proc );

    if( BGRT_PROC_STATE_STOPED != BGRT_PROC_GET_STATE( proc ) )
    {
        ret = BGRT_ST_ROLL;
        goto end;
    }
    bgrt_sched_proc_run( proc, BGRT_PROC_STATE_READY );
end:
    BGRT_SPIN_FREE( proc );
    return ret;
}
예제 #12
0
파일: proc.c 프로젝트: gordon-quad/bugurtos
//========================================================================================
void _bgrt_proc_terminate( void )
{
    bgrt_proc_t * proc;
    proc = bgrt_curr_proc();

    BGRT_SPIN_LOCK( proc );

    _bgrt_proc_stop_ensure( proc );
    // Flags processing!
    // A process is not allowed to return from pmain while being locked!
    if( proc->flags & BGRT_PROC_FLG_LOCK_MASK )
    {
        proc->flags |= BGRT_PROC_STATE_DEAD;
    }
    else
    {
        // A normal process termination.
        proc->flags |= BGRT_PROC_STATE_END;
    }
    proc->flags &= ~BGRT_PROC_FLG_PRE_STOP;

    BGRT_SPIN_FREE( proc );
}