tkggsai2008 发表于 2018-7-17 17:42:05

FreeRTOS中任务切换过程中遇到中断会怎么样

最近在移植freeRTOS,发现一个问题,freeRTOS为了保证实时性,是通过basepri来屏蔽优先级高的中断,
那如果FreeRTOS中任务切换过程中遇到中断会怎么样?
比如在压栈中刚好中断,会不会有问题?

WM_CH 发表于 2018-7-17 20:29:44

优先级再高,也得等人家保存现场之后,再去你执行高优先级的中断吧。我猜的 (逃

sokou 发表于 2018-7-17 21:54:59

压栈的时候应该是关闭所有中断。完成后再打开总的中断开关。

tkggsai2008 发表于 2018-7-18 09:28:16

查了一下资料,参考cortex-m3

在《Cortex-M3 Devices Generic User Guide.pdf》中介绍了异常入栈和出栈的情况,详见2.3 Exception model。Cortex-M3内核的寄存器如下。

异常发生时,入栈的寄存器是R0~R3+R12+PC+LR+SP。为啥袒护R0‐R3以及R12呢, R4‐R11就是下等公民?(摘自《Cortex-M3权威指南 》第9章)
原来,在ARM上,有一套的C函数调用标准约定(《 C/C++ rocedure Call Standard for the ARM Architecture》,AAPCS, Ref5)。个中原因就在它上面:它使得中断服务例程能用C语言编写,编译器优先使用被入栈的寄存器来保存中间结果(当然,如果程序过大也可能要用到R4‐R11,此时编译器负责生成代码来push它们。但是, ISR应该短小精悍,不要让系统如此操心——译者注)。如果读者再仔细看,会发现R0‐R3, R12是最后被压进去的。这里也有一番良苦用心:为的是可以更容易地使用SP基址来索引寻址,( 以及为了LDM等多重加载指令,因为LDM必须加载地址连续的一串数据)。参数的传递也是受益者:使之可以方便地通过压入栈的R0‐R3取出( 主要为系统软件所利用,多见于SVC与PendSV中的参数传递)。
这就是说,C编译器中断(异常)服务函数封装的这样的需求:当R0~R3+R12不够用时会使用R4‐R11,在使用R4‐R11之前会进行入栈保护;在使用完之后进行出栈恢复现场。

看来c语言和汇编在中断服务函数中是不一样的

laoshuhunya 发表于 2018-9-9 19:51:19

这是RTOS最核心的问题之一,如何处理这个问题是评价一个RTOS实时响应性能的关键。一个RTOS性能的好坏,从它的“任务(线程)切换程序”就能看出大概。
严格来说,把内核关中断的OS称之为RTOS是名不符实的。都关中断了,还有啥实时性可言。
嵌套向量、入栈出栈抢占、未尾连锁……ARM 费尽心机千辛万苦把 Cortex-M 的中断响应等待时间缩短到引以为豪的6个周期,就是为了适合嵌入式系统的实时快速响应要求,你们把中断说关就关,这对得起ARM吗,对得起自己良心吗{:titter:}
页: [1]
查看完整版本: FreeRTOS中任务切换过程中遇到中断会怎么样