完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
调式发现,虽然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个回答
|
|
切换到第一个线程时才打开中断,另调度器都没启动要TICK做什么。
|
|
|
|
|
|
|
|
第一个进程是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下整个流程,谢谢。 |
|
|
|
线程第一次运行时,它的上下文就是开启中断状态的。
|
|
|
|
|
|
|
|
明白了!
线程第一次运行,它的默认上下文环境就是开启中断的,那么当这个线程被恢复时,那么系统中断不就立刻被打开了么 <<问题的关键是: 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 已经被打开了,所以说进程一进去就可以执行。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
583 浏览 0 评论
AI模型部署边缘设备的奇妙之旅:如何在边缘端部署OpenCV
2207 浏览 0 评论
tms320280021 adc采样波形,为什么adc采样频率上来波形就不好了?
1227 浏览 0 评论
1776 浏览 0 评论
1462 浏览 0 评论
74794 浏览 21 评论
浏览过的版块 |
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 15:24 , Processed in 0.816563 second(s), Total 80, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号