调整代码,以支持cpu usage

This commit is contained in:
fenghuijie 2021-07-05 18:33:22 +08:00
parent e933c1f610
commit 0015af02e4
7 changed files with 39 additions and 1 deletions

View File

@ -663,6 +663,10 @@ struct rt_thread
rt_ubase_t init_tick; /**< thread's initialized tick */ rt_ubase_t init_tick; /**< thread's initialized tick */
rt_ubase_t remaining_tick; /**< remaining tick */ rt_ubase_t remaining_tick; /**< remaining tick */
#ifdef RT_USING_CPU_USAGE
rt_uint64_t duration_tick; /**< cpu usage tick */
#endif
struct rt_timer thread_timer; /**< built-in thread timer */ struct rt_timer thread_timer; /**< built-in thread timer */
void (*cleanup)(struct rt_thread *tid); /**< cleanup function when thread exit */ void (*cleanup)(struct rt_thread *tid); /**< cleanup function when thread exit */

View File

@ -186,6 +186,7 @@ rt_uint16_t rt_critical_level(void);
#ifdef RT_USING_HOOK #ifdef RT_USING_HOOK
void rt_scheduler_sethook(void (*hook)(rt_thread_t from, rt_thread_t to)); void rt_scheduler_sethook(void (*hook)(rt_thread_t from, rt_thread_t to));
void rt_scheduler_switch_sethook(void (*hook)(struct rt_thread *tid));
#endif #endif
#ifdef RT_USING_SMP #ifdef RT_USING_SMP

View File

@ -27,6 +27,20 @@ struct rt_irq_desc isr_table[MAX_HANDLERS];
rt_uint32_t rt_interrupt_from_thread = 0; rt_uint32_t rt_interrupt_from_thread = 0;
rt_uint32_t rt_interrupt_to_thread = 0; rt_uint32_t rt_interrupt_to_thread = 0;
rt_uint32_t rt_thread_switch_interrupt_flag = 0; rt_uint32_t rt_thread_switch_interrupt_flag = 0;
#ifdef RT_USING_HOOK
static void (*rt_interrupt_switch_hook)(void);
void rt_interrupt_switch_sethook(void (*hook)(void))
{
rt_interrupt_switch_hook = hook;
}
#endif
void rt_interrupt_hook(void)
{
RT_OBJECT_HOOK_CALL(rt_interrupt_switch_hook, ());
}
#endif #endif
const unsigned int VECTOR_BASE = 0x00; const unsigned int VECTOR_BASE = 0x00;

View File

@ -341,6 +341,8 @@ rt_hw_context_switch_interrupt_do:
ldr r6, [r6] ldr r6, [r6]
ldr sp, [r6] @ get new task's stack pointer ldr sp, [r6] @ get new task's stack pointer
bl rt_interrupt_hook
#ifdef RT_USING_FPU #ifdef RT_USING_FPU
/* fpu context */ /* fpu context */
ldmfd sp!, {r6} ldmfd sp!, {r6}

View File

@ -89,8 +89,8 @@ void rt_interrupt_leave(void)
rt_interrupt_nest)); rt_interrupt_nest));
level = rt_hw_interrupt_disable(); level = rt_hw_interrupt_disable();
rt_interrupt_nest --;
RT_OBJECT_HOOK_CALL(rt_interrupt_leave_hook,()); RT_OBJECT_HOOK_CALL(rt_interrupt_leave_hook,());
rt_interrupt_nest --;
rt_hw_interrupt_enable(level); rt_hw_interrupt_enable(level);
} }
RTM_EXPORT(rt_interrupt_leave); RTM_EXPORT(rt_interrupt_leave);

View File

@ -49,6 +49,7 @@ rt_uint8_t rt_current_priority;
#ifdef RT_USING_HOOK #ifdef RT_USING_HOOK
static void (*rt_scheduler_hook)(struct rt_thread *from, struct rt_thread *to); static void (*rt_scheduler_hook)(struct rt_thread *from, struct rt_thread *to);
static void (*rt_scheduler_switch_hook)(struct rt_thread *tid);
/** /**
* @addtogroup Hook * @addtogroup Hook
@ -68,6 +69,12 @@ rt_scheduler_sethook(void (*hook)(struct rt_thread *from, struct rt_thread *to))
rt_scheduler_hook = hook; rt_scheduler_hook = hook;
} }
void
rt_scheduler_switch_sethook(void (*hook)(struct rt_thread *tid))
{
rt_scheduler_switch_hook = hook;
}
/**@}*/ /**@}*/
#endif /* RT_USING_HOOK */ #endif /* RT_USING_HOOK */
@ -364,6 +371,8 @@ void rt_schedule(void)
_rt_scheduler_stack_check(to_thread); _rt_scheduler_stack_check(to_thread);
#endif /* RT_USING_OVERFLOW_CHECK */ #endif /* RT_USING_OVERFLOW_CHECK */
RT_OBJECT_HOOK_CALL(rt_scheduler_switch_hook, (current_thread));
rt_hw_context_switch((rt_ubase_t)&current_thread->sp, rt_hw_context_switch((rt_ubase_t)&current_thread->sp,
(rt_ubase_t)&to_thread->sp, to_thread); (rt_ubase_t)&to_thread->sp, to_thread);
} }
@ -473,6 +482,8 @@ void rt_schedule(void)
{ {
extern void rt_thread_handle_sig(rt_bool_t clean_state); extern void rt_thread_handle_sig(rt_bool_t clean_state);
RT_OBJECT_HOOK_CALL(rt_scheduler_switch_hook, (from_thread));
rt_hw_context_switch((rt_ubase_t)&from_thread->sp, rt_hw_context_switch((rt_ubase_t)&from_thread->sp,
(rt_ubase_t)&to_thread->sp); (rt_ubase_t)&to_thread->sp);
@ -609,6 +620,8 @@ void rt_scheduler_do_irq_switch(void *context)
current_thread->cpus_lock_nest--; current_thread->cpus_lock_nest--;
current_thread->scheduler_lock_nest--; current_thread->scheduler_lock_nest--;
RT_OBJECT_HOOK_CALL(rt_scheduler_switch_hook, (current_thread));
rt_hw_context_switch_interrupt(context, (rt_ubase_t)&current_thread->sp, rt_hw_context_switch_interrupt(context, (rt_ubase_t)&current_thread->sp,
(rt_ubase_t)&to_thread->sp, to_thread); (rt_ubase_t)&to_thread->sp, to_thread);
} }

View File

@ -228,6 +228,10 @@ static rt_err_t _rt_thread_init(struct rt_thread *thread,
thread->lwp = RT_NULL; thread->lwp = RT_NULL;
#endif /* RT_USING_LWP */ #endif /* RT_USING_LWP */
#ifdef RT_USING_CPU_USAGE
thread->duration_tick = 0;
#endif
RT_OBJECT_HOOK_CALL(rt_thread_inited_hook, (thread)); RT_OBJECT_HOOK_CALL(rt_thread_inited_hook, (thread));
return RT_EOK; return RT_EOK;