RTX 零中断延迟 疑问?
RTX 零中断延迟是如何实现的?教程讲到没有使用到关闭中断。之前学习UCOS2,的确内核大量使用到 CPU_CRITICAL_ENTER()与CPU_CRITICAL_EXIT()来操作CPSR 开关中断。以达到处理 临界区的问题。RTX难道内核没有使用到全局变量?没有临界区的问题?
RTX的零中断延迟有两个关键点。
一个是任务级API函数通过SVC软中断调用,这样就无需做开关中断操作了,还有一个是需要互斥的地方使用CM内核指令 LDREX 和 STREX 不是很明白,比如UCOS2中任务级API函数 ,我们调用 不是 跟RTX4一样吗? UCOS2也用了 SVC 与 pendsv中断。
比如 OSCtxSw
//触发PendSV
LDR R0, =NVIC_INT_CTRL
LDR R1, =NVIC_PENDSVSET
STR R1,
//函数返回
BX LR 清风徐来 发表于 2020-7-22 10:18
不是很明白,比如UCOS2中任务级API函数 ,我们调用 不是 跟RTX4一样吗? UCOS2也用了 SVC 与 pendsv中断 ...
不一样,uCOS没有用到SVC软中断,像FreeRTOS用过也是仅仅任务启动的时候调用一下。
RTX与他们不同,RTX的API是直接触发SVC中断,在中断里面调用的,有效的隔离了内核和应用代码。 好的,有点明白了 本帖最后由 myxiaonia 于 2020-7-22 15:56 编辑
我再补充一点,rtx对于中断内执行的api函数,使用一种类似邮箱的做法,将调用暂存,启用pendsv,之后立刻退出当前中断。所有中断调用都会攒到pendsv里统一执行,用这种办法保证用户中断只会最低限度阻塞
这种做法充分利用了cortexm在多个中断之间切换可以减少一些自动出入栈
当然arm9的rtx就不是这种做法了,在那里更像普通rtos的做法,主要是arm9的中断机制看上去比较弱,不过依然有他自己的特色,有一部分api同样用到了swi软中断
rtx这种做法,事实上表明在调用系统api上,中断优先级实际上是无效的,而这也是符合rtos的意愿的,它最终会保证应该执行的那个任务会被执行 myxiaonia 发表于 2020-7-22 16:15
rtx这种做法,事实上表明在调用系统api上,中断优先级实际上是无效的,而这也是符合rtos的意愿的,它最终会 ...
请教下,rtx这种做法,会导致svc中断时间区间内的中断优先级无效,那么这时候其他中断来了也不是一样要等待?那岂不是没有消除中断延迟?? wkler 发表于 2020-8-24 17:52
请教下,rtx这种做法,会导致svc中断时间区间内的中断优先级无效,那么这时候其他中断来了也不是一样要等 ...
首先SVC,Systick,PendSV的中断优先级默认都是最低的两个,其它中断优先级都可以抢占。对中断延迟无影响。
然后这个涉及到RTX的ISR FIFO机制。
你中断里面没有调用到RTX API的无影响,如果调用到RTX API的,各个中断的消息都会整到ISR FIFO统一处理,就是这么个东西。 wkler 发表于 2020-8-24 17:52
请教下,rtx这种做法,会导致svc中断时间区间内的中断优先级无效,那么这时候其他中断来了也不是一样要等 ...
不是svc中断,是isr开头的系统调用,本质上是没有中断优先级的,而且这也是符合rtos实际的
你想,rtos本身相当于一种用户级别的中断机制,只需要中断用户级别的代码,自己的调用还能打断自己这还不乱套了
rtx的0中断延迟,主要是指中断里发生的事情保证在中断里完成并且不关中断,但是调用isr代表的真正系统调用顺序可能与实际中断嵌套过程不一致,但这个和rtos提供的功能并不冲突 这个ISR FIFO有点像ucos iii的中断延迟发布的感觉
页:
[1]