第一个进程是idle
void rt_thread_idle_init()
{
/* init thread */
rt_thread_init(&idle,
"tidle",
rt_thread_idle_entry, RT_NULL,
&rt_thread_stack[0], sizeof(rt_thread_stack),
RT_THREAD_PRIORITY_MAX - 1, 32);
/* startup */
rt_thread_startup(&idle);
}
然后进入到
rt_system_scheduler_start();先查找优先级最高的进程,idle,在进入上下文切换的汇编代码。
/*
* void rt_hw_context_switch_to(rt_uint32 to);
* r0 --> to
*/
.globl rt_hw_context_switch_to
rt_hw_context_switch_to:
ldr sp, [r0] @ get new task stack pointer
ldmfd sp!, {r4} @ pop new task spsr
msr spsr_cxsf, r4
ldmfd sp!, {r4} @ pop new task cpsr
msr cpsr_cxsf, r4
ldmfd sp!, {r0-r12, lr, pc} @ pop new task r0-r12, lr & pc
将保存的新进程的stack pop出去,并将pc指针定位到新的进程开始执行,你知道在那里开启中断,
不胜感谢,计划rtthread移植到新的平台下,所以拿2440先study下整个流程,谢谢。
第一个进程是idle
void rt_thread_idle_init()
{
/* init thread */
rt_thread_init(&idle,
"tidle",
rt_thread_idle_entry, RT_NULL,
&rt_thread_stack[0], sizeof(rt_thread_stack),
RT_THREAD_PRIORITY_MAX - 1, 32);
/* startup */
rt_thread_startup(&idle);
}
然后进入到
rt_system_scheduler_start();先查找优先级最高的进程,idle,在进入上下文切换的汇编代码。
/*
* void rt_hw_context_switch_to(rt_uint32 to);
* r0 --> to
*/
.globl rt_hw_context_switch_to
rt_hw_context_switch_to:
ldr sp, [r0] @ get new task stack pointer
ldmfd sp!, {r4} @ pop new task spsr
msr spsr_cxsf, r4
ldmfd sp!, {r4} @ pop new task cpsr
msr cpsr_cxsf, r4
ldmfd sp!, {r0-r12, lr, pc} @ pop new task r0-r12, lr & pc
将保存的新进程的stack pop出去,并将pc指针定位到新的进程开始执行,你知道在那里开启中断,
不胜感谢,计划rtthread移植到新的平台下,所以拿2440先study下整个流程,谢谢。
举报