//======================================================================================== // #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 ); }
//======================================================================================== // 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; }
//======================================================================================== // 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; }
//======================================================================================== 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 ); }
//======================================================================================== 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 ); }
/*===========================================================================*/ 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(); }
/*===========================================================================*/ 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; }
//======================================================================================== 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 ); }
//======================================================================================== 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; }
//======================================================================================== 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; }
//======================================================================================== // 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; }
//======================================================================================== 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 ); }