freeRTOS中如果有中断高于系统中断,该如何操作?
freeRTOS中的临界操作,采用的是向basepri寄存器中配置屏蔽的任务优先级实现的,宏定义为configMAX_SYSCALL_INTERRUPT_PRIORITY,进入临界区后,优先级高于configMAX_SYSCALL_INTERRUPT_PRIORITY的中断仍然会响应,等于小于该优先级的中断会被暂时屏蔽。在很多教程中说,建议把一些紧急的事情(事关生命、安全等)的中断配置的优先级可高于configMAX_SYSCALL_INTERRUPT_PRIORITY。那么现在问题来了,如果真的有这么个用法,在这个非常高的优先级中需要给某个任务发送消息(或者信号、邮箱),这是不符合freeRTOS的用法的,因为freeRTOS的应用手册中有明确说明,对于可以在中断中调用的api函数,必须保证优先级不高于configMAX_SYSCALL_INTERRUPT_PRIORITY,违反操作会导致系统调度出现问题。
实际项目中,如果有这样的应用,应该采用什么样的方法呢? 高于freertos掩码屏蔽中断的,在中断中不能使用带ISR的freertos函数就可以了 中断只能调用带FromISR后缀的函数 flash3g 发表于 2020-6-6 23:30
中断只能调用带FromISR后缀的函数
哈,中断里面的系统调用是灾难性的。。
前段时间写riscv的中断api就遇到了这个问题,于是我也是定义了中断内调用的接口,这个问题如果处理不好,从中断里面出来必死。 wye11083 发表于 2020-6-7 11:55
哈,中断里面的系统调用是灾难性的。。
前段时间写riscv的中断api就遇到了这个问题,于是我也是定义了中 ...
{:biggrin:} {:biggrin:} 中断的概念书本说着简单实际一点都不简单,越有经验的人,处理中断就越复杂,要考虑的东西太多 zzh90513 发表于 2020-6-6 23:28
高于freertos掩码屏蔽中断的,在中断中不能使用带ISR的freertos函数就可以了
如果有那么紧急的事情,需要将中断优先级设置的比os中断高,当这个紧急的中断发生时,如何和系统任务进行通信? flash3g 发表于 2020-6-6 23:30
中断只能调用带FromISR后缀的函数
不高于configMAX_SYSCALL_INTERRUPT_PRIORITY的中断是这样,那高于的呢? 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 的中断里面是
不允许调用的。 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的消息队列? wzd5230 发表于 2020-6-7 23:15
感谢,你说的这些我理解也知道。举个不一定恰当的例子,一个数控机床的程序,设置configMAX_SYSCALL_INTE ...
为什么一定要用中断0优先级,改到OS允许的优先级就可以了,中断优先级是相对的 flash3g 发表于 2020-6-7 23:34
为什么一定要用中断0优先级,改到OS允许的优先级就可以了,中断优先级是相对的 ...
或许我认为os中经常出现的临界会影响我对这种极度紧急中断处理的时效性。 wzd5230 发表于 2020-6-8 00:36
或许我认为os中经常出现的临界会影响我对这种极度紧急中断处理的时效性。 ...
即使事关紧急,有这么在乎那十几uS的差别吗?
感觉只有在短路保护时需要如此高实时的响应
但短路保护应该利用MCU的硬件机制,"脱离"OS实现保护
依赖OS执行应用层的处理 wzd5230 发表于 2020-6-8 00:36
或许我认为os中经常出现的临界会影响我对这种极度紧急中断处理的时效性。 ...
中断要求高用MDK的RTX flash3g 发表于 2020-6-8 02:12
中断要求高用MDK的RTX
只是针对freeRTOS对这种应用进行探讨,和RTX没关系。 qq335702318 发表于 2020-6-8 00:57
即使事关紧急,有这么在乎那十几uS的差别吗?
感觉只有在短路保护时需要如此高实时的响应
但短路保护应该 ...
可能我举的例子不够恰当,如您所说,假设就是短路保护这种应用,该如何处理?
因为freeRTOS中使用BASEPRI而不是PRIMASK肯定有他的原因,当使用中高于BASEPRI的中断被启用,并且和某些task有数据交互,采用哪种方式更好? wzd5230 发表于 2020-6-8 09:47
可能我举的例子不够恰当,如您所说,假设就是短路保护这种应用,该如何处理?
因为freeRTOS中使用BASEPR ...
使用不可屏蔽中断 我是这样做的,不一定合适。
在紧急中断中把一定要在中断中处理的事情处理完,后面触发一个软中断,在软中断中调用系统API, 软中断优先级小于设置的最小可屏蔽中断,即可使用系统API。
因为我的紧急中断是定时的,即2个紧急中断会有相隔一定时间,不会发生中断丢失的问题 lusson 发表于 2020-6-8 10:43
我是这样做的,不一定合适。
在紧急中断中把一定要在中断中处理的事情处理完,后面触发一个软中断,在软中 ...
这也是一种方式。
页:
[1]