rtthread mini2440 tick怎么启动的?

发布于 2011-03-30 14:53:56
调式发现,虽然pwm timer4的clock 开启, interrupt umask,timer4 start bit也设置了
但是一直到
rtthread_startup()
------------------> rt_system_scheduler_start()
|
| ---> rt_hw_context_switch_to((rt_uint32_t)&to_thread->sp);
|
|-> static void rt_thread_timer_entry(void* parameter)
|
|-> rt_sem_take(&timer_sem,RT_WAITING_FOREVER);
这事PWM Timer4的中断才可以进入到中断例程里,但是又不知道是那里开启了中断?
问题是ARM的中断在start_gcc.S中就全部disable了,然后使用 rt_hw_interrupt_enable(temp);开启阿,
在 sem_take中没有找到什么特别的设置。
那么rtthread在何时开启了tick?

查看更多

关注者
0
被浏览
7.5k
10 个回答
visitor83
visitor83 2011-04-01
我没说清楚,问题是,PWM Timer4中断开启,并启动了,但直到rt_system_scheduler_start()
中断才可以进到中断vector_irq中,这是为什么。请高手指点,谢谢。
aozima
aozima 2011-04-01
拒绝白嫖,拒绝键盘侠!
切换到第一个线程时才打开中断,另调度器都没启动要TICK做什么。
visitor83
visitor83 2011-04-01
当然知道,第一个线程不起来要tick没什么必要,但是,没有找到开启中断的代码
在rtthread-0.4.0,所以才困惑!你知道那段代码开启?
visitor83
visitor83 2011-04-01
第一个进程是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下整个流程,谢谢。
bernard
bernard 2011-04-01
切换到第一个线程时才打开中断,另调度器都没启动要TICK做什么。


线程第一次运行时,它的上下文就是开启中断状态的。
visitor83
visitor83 2011-04-01
楼主正解,代码里也是这样的,打开IRQ_DEBUG,一直到rt_system_scheduler_start();
才有中断的debug输出,所以很困惑。
visitor83
visitor83 2011-04-02
明白了!
线程第一次运行,它的默认上下文环境就是开启中断的,那么当这个线程被恢复时,那么系统中断不就立刻被打开了么
<<问题的关键是:
1。每一个进程都有自己的空间互不干扰。 进程被os恢复时,等于从进程的第一条指令开始执行,与其他什么乱七八糟的没什么关系。
2。 ARM Mode 的切换, rtthread 启动后一直是处于svc mode下,CPSR的F, I bit一直都是1,所以arm920t core的irq, fiq全部都是disable的。即使Interrupt register打开也没有用。
3。 第一次切换进程时的恢复上下文的设置。
	stk 	 = (rt_uint32_t*)stack_addr;
*(stk) = (rt_uint32_t)tentry; /* entry point */
*(--stk) = (rt_uint32_t)texit; /* lr */
*(--stk) = 0; /* r12 */
*(--stk) = 0; /* r11 */
*(--stk) = 0; /* r10 */
*(--stk) = 0; /* r9 */
*(--stk) = 0; /* r8 */
*(--stk) = 0; /* r7 */
*(--stk) = 0; /* r6 */
*(--stk) = 0; /* r5 */
*(--stk) = 0; /* r4 */
*(--stk) = 0; /* r3 */
*(--stk) = 0; /* r2 */
*(--stk) = 0; /* r1 */
*(--stk) = (rt_uint32_t)parameter; /* r0 : argument */
*(--stk) = SVCMODE; /* cpsr */
*(--stk) = SVCMODE; /* spsr */

下面的SVCMODE = 0x13,那么其实CPSR register中F, I bit 已经被打开了,所以说进程一进去就可以执行。
visitor83
visitor83 2011-04-02
忘了,感谢bernard的指教。上述有什么不对,还请各位指点!
bernard
bernard 2011-04-02
[s:175] 终于明白了啊,这个是很多人说不理解的。有时间你更新到本站的wiki中吧,由学习者来更新是最恰当的,这样就知道学习者碰到了什么问题,然后RT-Thread又是如何解决的。

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览