关于cortex m3的中断疑问

[复制链接]
4550|12
手机看帖
扫描二维码
随时随地手机跟帖
trochili|  楼主 | 2013-1-27 22:52 | 显示全部楼层 |阅读模式
在常见的os 任务切换时,最后基本都是
.....
开启使能中断
弹出新任务的上下文

请教一下,在这两步骤之间,会不会发生其他的中断?
如果想验证的话,怎么才能造成这样的情景?
aozima| | 2013-1-28 00:29 | 显示全部楼层
既然是
关于cortex m3的

那么
开启使能中断

是为了触发pendsv中断

而在 pendsv中
弹出新任务的上下文

时还是会关闭中断的,只有几十个指令周期,所以并没有什么问题。

使用特权

评论回复
trochili|  楼主 | 2013-1-28 00:52 | 显示全部楼层

问题在这里,以前有人问过。
https://bbs.21ic.com/icview-168360-1-1.html
问题2
pendsv在运行时,假如被其他isr抢占,而在isr中又造了一个pensv请求,那么最终这两个pensv是按照咬尾还是单独的两次来处理

使用特权

评论回复
yyql008| | 2013-1-28 09:00 | 显示全部楼层
本帖最后由 yyql008 于 2013-1-28 12:30 编辑

会产生咬尾的,只能高优先级中断抢占低优先级的...

使用特权

评论回复
airwill| | 2013-1-28 09:44 | 显示全部楼层
在这两步骤之间,会不会发生其他的中断?      当然会. 系统应该不能受中断的影响. 这一点是肯定的.
如果想验证的话,怎么才能造成这样的情景?    Cortex-M3 的内核中断那么多, 应该是很容易实现的.

使用特权

评论回复
trochili|  楼主 | 2013-1-28 18:16 | 显示全部楼层
本帖最后由 trochili 于 2013-1-29 23:04 编辑
yyql008 发表于 2013-1-28 09:00
会产生咬尾的,只能高优先级中断抢占低优先级的...

按字面意思,应该低优先级中断会咬尾高优先级中断。

还有,同优先级先后到达的两次中断,在处理第一个中断后,是把第二次的忽略还是再次处理一次呢?

使用特权

评论回复
trochili|  楼主 | 2013-1-29 18:11 | 显示全部楼层
这段代码是ucosii在stm32上的移植,   
LDR R0,[R2]; R0 is new process SP
    LDM     R0, {R4-R11}  ; 从新的进程堆栈中恢复 r4-11
    ADDS    R0, R0, #0x20
    MSR     PSP, R0; Load PSP with new process SP
    ORR     LR, LR, #0x04; Ensure exception return uses process stack
    CPSIE   I
    BX      LR  

如果在这两行之间产生了中断,而在isr中又把即将运行的新任务挂起的话,那么系统是不是混乱了?
因为新任务状态为挂起,而它却在运行。

使用特权

评论回复
yyql008| | 2013-1-29 19:23 | 显示全部楼层
不会的啊.......
假设先执行PendSV_Handler1,运行到了下面两句之间
   CPSIE   I
    BX      LR  
发生了定时中断ISR,如果ISR要进行任务切换(有这种情况),ISR希望希望进入PendSV_Handler2进行任务切换(这里标记为2),
两个都是PendSV_Handler中断,会咬尾的.则就执行ISR的最后一句BX LR了.不执行PendSV_Handler1的BX LR......,所以新任务是挂起状态,没有矛盾.

使用特权

评论回复
trochili|  楼主 | 2013-1-29 23:08 | 显示全部楼层
本帖最后由 trochili 于 2013-1-30 00:38 编辑
yyql008 发表于 2013-1-29 19:23
不会的啊.......
假设先执行PendSV_Handler1,运行到了下面两句之间
   CPSIE   I

谢谢。


使用特权

评论回复
trochili|  楼主 | 2013-1-30 00:39 | 显示全部楼层
谢谢各位,这下搞明白了。我总结了一下。

; 从新线程栈中弹出 r4-11
    LDM     R0, {R4-R11}

;psp指向中断自动压栈后的栈顶
    ADDS    R0, R0, #0x20
    MSR     PSP, R0

    ; 上电后,处理器处于线程+特权模式+msp。
    ; 对于第一次active任务,当引发pendsv中断后,处理器进入handler模式。使用msp,
    ; 返回时,在这里准备使用psp,从psp中弹出r0...这些寄存器,所以需要修改LR,强制使用psp。
    ORR     LR, LR, #0x04
    CPSIE   I
   
    ;在这里有可能发生中断,而此时新的当前线程的上下文并没有完全恢复。和线程被中断的情景相似:
    ;硬件自动保存部分寄存器到线程栈中,其他寄存器还游离在处理器上下文中。
    ;假如在此时产生的中断ISR中调用那些会将当前线程从就绪队列中移出的API,或者唤醒了更高优先级的线程,
    ;那么会导致一次新的PensSv请求被挂起。当下面的语句启动异常返回流程时,会发生前后两个PendSV咬尾中断。
    ;按照uCM3PendSVHandler的流程,当前线程的上下文中那些游离的寄存器会再次被保存到线程栈中,即不继续
    ;弹栈,也就是说一次线程上下文切换被强制取消了。

    ; 启动异常返回流程,弹出r0、r1、r2、r3寄存器,切换到任务。
    BX      LR
    ; 返回后,处理器使用线程+特权模式+psp。线程就在这种环境下运行。

使用特权

评论回复
trochili|  楼主 | 2013-1-30 01:17 | 显示全部楼层
相关的新问题

在m3的某个isr里,如何快速查询到是否有其他中断处于pending(优先级导致)或者active(中断嵌套导致)状态?
这个功能很重要。

使用特权

评论回复
yyql008| | 2013-1-30 08:40 | 显示全部楼层
;在这里有可能发生中断,而此时新的当前线程的上下文并没有完全恢复。和线程被中断的情景相似:
    ;硬件自动保存部分寄存器到线程栈中,其他寄存器还游离在处理器上下文中。
------------------------------------------------------
;在这里有可能发生中断,硬件自动保存部分寄存器到线程栈中不会发生的......
因为咬尾了,新的高优先级中断ISR,不会保存寄存器(进入中断,硬件自动入栈的寄存器)的....,咬尾就是这个意思啊..

但为什么堆栈没有乱? 运行到CPSIE   I之后,PSP的确修改了,主要是运行了以下几个指令:
LDM     R0, {R4-R11}                                        ;// 出栈 R4 - R11
    ADDS    R0, R0, #0x20                                       ;// 调整PSP
    MSR     PSP, R0

但堆栈没有乱,因为在新的ISR中,又要把 {R4-R11} 重新入栈,PSP又重新指向新的栈顶了,最后把PSP保存到改任务控制块的OSTCBStkPtr中.



使用特权

评论回复
trochili|  楼主 | 2013-1-30 12:48 | 显示全部楼层
yyql008 发表于 2013-1-30 08:40
;在这里有可能发生中断,而此时新的当前线程的上下文并没有完全恢复。和线程被中断的情景相似:
    ;硬件 ...

我觉得这里不是咬尾,是中断嵌套。因为在pendsv返回之前,只要开了中断,就有可能要响应更高优先级的中断。而这时候,新的当前线程的上下文,一部分已经弹出栈了,另一部分还在等待返回是自动弹出,我们把这个看作是一种情景。
其他情景下,一个正常的任务被中断,那么一部分上下文是由硬件自动入栈的,一部分需要软件完成。

这两个情景的上下文都是一样的: r0-r3...在栈中,其他的还在处理器上,游离。

不知道这样理解对不对。


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:飞鸟嵌入式实时内核 www.trochili.com

5

主题

43

帖子

0

粉丝