void krhino_stack_ovf_check(void) { cpu_stack_t *stack_start; uint8_t i; stack_start = g_active_task[cpu_cur_get()]->task_stack_base; for (i = 0; i < RHINO_CONFIG_STK_CHK_WORDS; i++) { if (*stack_start++ != RHINO_TASK_STACK_OVF_MAGIC) { k_err_proc(RHINO_TASK_STACK_OVF); } } if ((cpu_stack_t *)(g_active_task[cpu_cur_get()]->task_stack) < stack_start) { k_err_proc(RHINO_TASK_STACK_OVF); } }
kstat_t krhino_intrpt_enter(void) { CPSR_ALLOC(); #if (RHINO_CONFIG_INTRPT_STACK_OVF_CHECK > 0) krhino_intrpt_stack_ovf_check(); #endif RHINO_CPU_INTRPT_DISABLE(); if (g_intrpt_nested_level[cpu_cur_get()] >= RHINO_CONFIG_INTRPT_MAX_NESTED_LEVEL) { k_err_proc(RHINO_INTRPT_NESTED_LEVEL_OVERFLOW); RHINO_CPU_INTRPT_ENABLE(); return RHINO_INTRPT_NESTED_LEVEL_OVERFLOW; } g_intrpt_nested_level[cpu_cur_get()]++; RHINO_CPU_INTRPT_ENABLE(); return RHINO_SUCCESS; }
void krhino_intrpt_exit(void) { CPSR_ALLOC(); uint8_t cur_cpu_num; #if (RHINO_CONFIG_INTRPT_STACK_OVF_CHECK > 0) krhino_intrpt_stack_ovf_check(); #endif RHINO_CPU_INTRPT_DISABLE(); cur_cpu_num = cpu_cur_get(); if (g_intrpt_nested_level[cur_cpu_num] == 0u) { RHINO_CPU_INTRPT_ENABLE(); k_err_proc(RHINO_INV_INTRPT_NESTED_LEVEL); } g_intrpt_nested_level[cur_cpu_num]--; if (g_intrpt_nested_level[cur_cpu_num] > 0u) { RHINO_CPU_INTRPT_ENABLE(); return; } if (g_sched_lock[cur_cpu_num] > 0u) { RHINO_CPU_INTRPT_ENABLE(); return; } preferred_cpu_ready_task_get(&g_ready_queue, cur_cpu_num); if (g_preferred_ready_task[cur_cpu_num] == g_active_task[cur_cpu_num]) { RHINO_CPU_INTRPT_ENABLE(); return; } TRACE_INTRPT_TASK_SWITCH(g_active_task[cur_cpu_num], g_preferred_ready_task[cur_cpu_num]); #if (RHINO_CONFIG_CPU_NUM > 1) g_active_task[cur_cpu_num]->cur_exc = 0; #endif cpu_intrpt_switch(); RHINO_CPU_INTRPT_ENABLE(); }
void krhino_task_sched_stats_get(void) { lr_timer_t cur_time; lr_timer_t exec_time; #if (RHINO_CONFIG_DISABLE_INTRPT_STATS > 0) hr_timer_t intrpt_disable_time; if (g_cur_intrpt_disable_max_time > g_sys_measure_waste) { intrpt_disable_time = g_cur_intrpt_disable_max_time - g_sys_measure_waste; } else { intrpt_disable_time = 0; } if (g_active_task[cpu_cur_get()]->task_intrpt_disable_time_max < intrpt_disable_time) { g_active_task[cpu_cur_get()]->task_intrpt_disable_time_max = intrpt_disable_time; } g_cur_intrpt_disable_max_time = 0; #endif #if (RHINO_CONFIG_DISABLE_SCHED_STATS > 0) if (g_active_task[cpu_cur_get()]->task_sched_disable_time_max < g_cur_sched_disable_max_time) { g_active_task[cpu_cur_get()]->task_sched_disable_time_max = g_cur_sched_disable_max_time; } g_cur_sched_disable_max_time = 0; #endif /* Keep track of new task and total system context switch times */ g_preferred_ready_task[cpu_cur_get()]->task_ctx_switch_times++; g_sys_ctx_switch_times++; cur_time = (lr_timer_t)LR_COUNT_GET(); exec_time = cur_time - g_active_task[cpu_cur_get()]->task_time_start; g_active_task[cpu_cur_get()]->task_time_total_run += (sys_time_t)exec_time; g_preferred_ready_task[cpu_cur_get()]->task_time_start = cur_time; }