搜索
bottom↓
回复: 17

freeRTOS中如果有中断高于系统中断,该如何操作?

[复制链接]
(26739710)

出0入0汤圆

发表于 2020-6-6 21:30:50 来自手机 | 显示全部楼层 |阅读模式
freeRTOS中的临界操作,采用的是向basepri寄存器中配置屏蔽的任务优先级实现的,宏定义为configMAX_SYSCALL_INTERRUPT_PRIORITY,进入临界区后,优先级高于configMAX_SYSCALL_INTERRUPT_PRIORITY的中断仍然会响应,等于小于该优先级的中断会被暂时屏蔽。
    在很多教程中说,建议把一些紧急的事情(事关生命、安全等)的中断配置的优先级可高于configMAX_SYSCALL_INTERRUPT_PRIORITY。那么现在问题来了,如果真的有这么个用法,在这个非常高的优先级中需要给某个任务发送消息(或者信号、邮箱),这是不符合freeRTOS的用法的,因为freeRTOS的应用手册中有明确说明,对于可以在中断中调用的api函数,必须保证优先级不高于configMAX_SYSCALL_INTERRUPT_PRIORITY,违反操作会导致系统调度出现问题。
    实际项目中,如果有这样的应用,应该采用什么样的方法呢?
(26732671)

出0入0汤圆

发表于 2020-6-6 23:28:09 | 显示全部楼层
高于freertos掩码屏蔽中断的,在中断中不能使用带ISR的freertos函数就可以了
(26732530)

出0入0汤圆

发表于 2020-6-6 23:30:30 | 显示全部楼层
中断只能调用带FromISR后缀的函数
(26687820)

出0入20汤圆

发表于 2020-6-7 11:55:40 来自手机 | 显示全部楼层
flash3g 发表于 2020-6-6 23:30
中断只能调用带FromISR后缀的函数

哈,中断里面的系统调用是灾难性的。。

前段时间写riscv的中断api就遇到了这个问题,于是我也是定义了中断内调用的接口,这个问题如果处理不好,从中断里面出来必死。
(26666786)

出0入0汤圆

发表于 2020-6-7 17:46:14 | 显示全部楼层
wye11083 发表于 2020-6-7 11:55
哈,中断里面的系统调用是灾难性的。。

前段时间写riscv的中断api就遇到了这个问题,于是我也是定义了中 ...

中断的概念书本说着简单实际一点都不简单,越有经验的人,处理中断就越复杂,要考虑的东西太多
(26666659)

出0入0汤圆

 楼主| 发表于 2020-6-7 17:48:21 来自手机 | 显示全部楼层
zzh90513 发表于 2020-6-6 23:28
高于freertos掩码屏蔽中断的,在中断中不能使用带ISR的freertos函数就可以了

如果有那么紧急的事情,需要将中断优先级设置的比os中断高,当这个紧急的中断发生时,如何和系统任务进行通信?
(26666592)

出0入0汤圆

 楼主| 发表于 2020-6-7 17:49:28 来自手机 | 显示全部楼层
flash3g 发表于 2020-6-6 23:30
中断只能调用带FromISR后缀的函数

不高于configMAX_SYSCALL_INTERRUPT_PRIORITY的中断是这样,那高于的呢?
(26659690)

出0入0汤圆

发表于 2020-6-7 19:44:30 | 显示全部楼层
wzd5230 发表于 2020-6-7 17:49
不高于configMAX_SYSCALL_INTERRUPT_PRIORITY的中断是这样,那高于的呢?

参考《安富莱_STM32-V6开发板_FreeRTOS教程(V1.0)》

#define configMAX_PRIORITIES ( 6 )
定义可供用户使用的最大优先级数,如果这个定义的是 6,那么用户可以使用的优先级号是 0,1,2,3,4,5
不包含 6,对于这一点,初学者要特别的注意

configMAX_SYSCALL_INTERRUPT_PRIORITY
宏定义 configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 的数值经过 4bit 偏移后得到一
个 8bit 的优先级数值,即宏定义 configMAX_SYSCALL_INTERRUPT_PRIORITY 的数值。 这个数值
是赋值给寄存器 basepri 使用的,8bit 的数值才可以实际赋值给相应中断的优先级寄存器。
这里的宏定义数值赋给寄存器 basepri 后就可以实现全局的开关中断操作了。 比如:我们这里配
置宏定义 configLIBRARY_LOWEST_INTERRUPT_PRIORITY 是 0x01,经过 4bit 偏移后就是 0x10,
即 16。 调用了 FreeRTOS 的关中断后,所有优先级数值大于等于 16 的中断都会被关闭。优先级数值
小于 16 的中断不会被关闭,对寄存器 basepri 寄存器赋值 0,那么被关闭的中断会被打开。

configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 0x01
定义受 FreeRTOS 管理的最高优先级中断。简单的说就是允许用户在这个中断服务程序里面调用
FreeRTOS 的 API 的最高优先级。为了进一步说明这个宏定义的的作用,解释如下:
 使用 CM 内核的 MCU,官方强烈建议将 NVIC 的优先级分组配置为全抢占式优先级,全部配置
为抢占式优先级的好处就是方便管理。
 对于 STM32 来说,设置 NVIC 的优先级分组为 4 时,
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4)就是全部配置为抢占式优先级。 又因为
STM32 的优先级设置仅使用 CM 内核 8bit 中的高 4bit,即只能区分 2^4 = 16 种优先级。因此
当优先级分组设置为 4 的时候可供用户选择抢占式优先级为 0 到 15,共 16 个优先级,配置为 0
表示最高优先级,配置为 15 表示最低优先级,不存在子优先级。
 这里配置 configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 为 0x01 表示用户可以在抢
占式优先级为 1 到 15 的中断里面调用 FreeRTOS 的 API 函数,抢占式优先级为 0 的中断里面是
不允许调用的。
(26647056)

出0入0汤圆

 楼主| 发表于 2020-6-7 23:15:04 来自手机 | 显示全部楼层
flash3g 发表于 2020-6-7 19:44
参考《安富莱_STM32-V6开发板_FreeRTOS教程(V1.0)》

#define configMAX_PRIORITIES ( 6 )

感谢,你说的这些我理解也知道。举个不一定恰当的例子,一个数控机床的程序,设置configMAX_SYSCALL_INTERRUPT_PRIORITY为1,但是中断优先级为0的某个中断为检测到伤人事件,一旦这个中断触发,即使在os临界区也会立即响应中断,做紧急停机处理,但是处理完毕后机床显示屏任务需要获取刚优先级为0的中断中获取到的一些消息,现在os自带的消息机制肯定是没法用了,那这个消息应该如何发给显示屏任务?或者就像裸机那样的采用全局变量?单独创建非os的消息队列?
(26645882)

出0入0汤圆

发表于 2020-6-7 23:34:38 | 显示全部楼层
wzd5230 发表于 2020-6-7 23:15
感谢,你说的这些我理解也知道。举个不一定恰当的例子,一个数控机床的程序,设置configMAX_SYSCALL_INTE ...

为什么一定要用中断0优先级,改到OS允许的优先级就可以了,中断优先级是相对的
(26642185)

出0入0汤圆

 楼主| 发表于 2020-6-8 00:36:15 来自手机 | 显示全部楼层
flash3g 发表于 2020-6-7 23:34
为什么一定要用中断0优先级,改到OS允许的优先级就可以了,中断优先级是相对的 ...

或许我认为os中经常出现的临界会影响我对这种极度紧急中断处理的时效性。
(26640935)

出0入0汤圆

发表于 2020-6-8 00:57:05 | 显示全部楼层
wzd5230 发表于 2020-6-8 00:36
或许我认为os中经常出现的临界会影响我对这种极度紧急中断处理的时效性。 ...

即使事关紧急,有这么在乎那十几uS的差别吗?
感觉只有在短路保护时需要如此高实时的响应
但短路保护应该利用MCU的硬件机制,"脱离"OS实现保护
依赖OS执行应用层的处理
(26636392)

出0入0汤圆

发表于 2020-6-8 02:12:48 | 显示全部楼层
wzd5230 发表于 2020-6-8 00:36
或许我认为os中经常出现的临界会影响我对这种极度紧急中断处理的时效性。 ...

中断要求高用MDK的RTX
(26609284)

出0入0汤圆

 楼主| 发表于 2020-6-8 09:44:36 | 显示全部楼层
flash3g 发表于 2020-6-8 02:12
中断要求高用MDK的RTX

只是针对freeRTOS对这种应用进行探讨,和RTX没关系。
(26609125)

出0入0汤圆

 楼主| 发表于 2020-6-8 09:47:15 | 显示全部楼层
qq335702318 发表于 2020-6-8 00:57
即使事关紧急,有这么在乎那十几uS的差别吗?
感觉只有在短路保护时需要如此高实时的响应
但短路保护应该 ...

可能我举的例子不够恰当,如您所说,假设就是短路保护这种应用,该如何处理?

因为freeRTOS中使用BASEPRI而不是PRIMASK肯定有他的原因,当使用中高于BASEPRI的中断被启用,并且和某些task有数据交互,采用哪种方式更好?
(26606152)

出0入0汤圆

发表于 2020-6-8 10:36:48 | 显示全部楼层
wzd5230 发表于 2020-6-8 09:47
可能我举的例子不够恰当,如您所说,假设就是短路保护这种应用,该如何处理?

因为freeRTOS中使用BASEPR ...

使用不可屏蔽中断
(26605760)

出0入50汤圆

发表于 2020-6-8 10:43:20 | 显示全部楼层
我是这样做的,不一定合适。
在紧急中断中把一定要在中断中处理的事情处理完,后面触发一个软中断,在软中断中调用系统API, 软中断优先级小于设置的最小可屏蔽中断,即可使用系统API。
因为我的紧急中断是定时的,即2个紧急中断会有相隔一定时间,不会发生中断丢失的问题
(26599066)

出0入0汤圆

 楼主| 发表于 2020-6-8 12:34:54 | 显示全部楼层
lusson 发表于 2020-6-8 10:43
我是这样做的,不一定合适。
在紧急中断中把一定要在中断中处理的事情处理完,后面触发一个软中断,在软中 ...

这也是一种方式。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 ( 公安交互式论坛备案:44190002001997 粤ICP备09047143号 )

GMT+8, 2021-4-12 09:12

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表