嵌入式技术论坛
直播中

刘勇

7年用户 1292经验值
私信 关注
[问答]

请问一下rtthread在何时开启了timer4的tick呢

调式发现,虽然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?
我没说清楚,问题是,PWM Timer4中断开启,并启动了,但直到rt_system_scheduler_start()
中断才可以进到中断vector_irq中,这是为什么。请高手指点,谢谢。

回帖(6)

建立建利12

2022-4-12 15:44:06
切换到第一个线程时才打开中断,另调度器都没启动要TICK做什么。
举报

刘勇

2022-4-12 15:44:28
当然知道,第一个线程不起来要tick没什么必要,但是,没有找到开启中断的代码
在rtthread-0.4.0,所以才困惑!你知道那段代码开启?
举报

刘勇

2022-4-12 15:44:50
第一个进程是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下整个流程,谢谢。
举报

建立建利12

2022-4-12 15:45:39
线程第一次运行时,它的上下文就是开启中断状态的。
举报

刘勇

2022-4-12 15:45:52
代码里也是这样的,打开IRQ_DEBUG,一直到rt_system_scheduler_start();
才有中断的debug输出,所以很困惑。
举报

刘勇

2022-4-12 15:46:41
明白了!

线程第一次运行,它的默认上下文环境就是开启中断的,那么当这个线程被恢复时,那么系统中断不就立刻被打开了么

<<问题的关键是:

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 已经被打开了,所以说进程一进去就可以执行。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分