硬汉嵌入式论坛

 找回密码
 立即注册
查看: 6093|回复: 14
收起左侧

[FreeRTOS] 咨询下freertos优先级问题

[复制链接]

62

主题

77

回帖

263

积分

高级会员

积分
263
发表于 2015-10-26 16:42:44 | 显示全部楼层 |阅读模式
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY            0xf


#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY    5


#define configKERNEL_INTERRUPT_PRIORITY         ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )

#define configMAX_SYSCALL_INTERRUPT_PRIORITY     ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )

请问下内核优先级和系统调用优先级的意思,到底有什么差别?应用中要注意什么?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2015-10-26 17:15:48 | 显示全部楼层
configLIBRARY_LOWEST_INTERRUPT_PRIORITY
这个是指的SysTick滴答定时器中断和PendSV中断的优先级。
一般情况下都是配置成最低的优先级15。在port.c文件里面进行了配置。
==========================================================
configMAX_SYSCALL_INTERRUPT_PRIORITY  
FreeRTOS中开关中断使用的是寄存器basepri,这个寄存器定义了被屏蔽优先级的阀值,当它被设置
为某个值后,所有优先级号大于等于此值的优先级都被屏蔽,而这个宏定义
configMAX_SYSCALL_INTERRUPT_PRIORITY  就是要赋值给寄存器basepri的。
比如我们给这个宏定义赋值为5(优先级号越小,优先级越高),那么所有大于等于优先级5的中断都会被屏蔽掉。
而小于优先级5的中断,使用FreeRTOS自带的开关中断函数是无法关闭的,他只能关闭小于等于5的,另外切不可
在优先级小于等于5的中断中调用FreeRTOS的API函数,会导致进入这个断言中,从而进入死循环:
#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); }  


=============================================
14_58_4385fe8dd648df9.png   


============================================
不知道我这么说,楼主能不能理解,还有什么问题的话,继续交流。
回复

使用道具 举报

62

主题

77

回帖

263

积分

高级会员

积分
263
 楼主| 发表于 2015-10-26 17:45:51 | 显示全部楼层

回 eric2013 的帖子

eric2013:configLIBRARY_LOWEST_INTERRUPT_PRIORITY
这个是指的SVC中断和PendSV中断的优先级。
一般情况下都是配置成最低的优先级15。在port.c文件里面进行了配置。
==========================================================
configMAX_SYSCALL_INTERRUPT_PRIORITY  
....... (2015-10-26 17:15) 
多谢详细的描述,但是网络上怎么有另外一种相反的描述:“

FreeRTOS 中定义了一个宏 configMAX_SYSCALL_INTERRUPT_PRIORITY

所有用到操作系统功能的中断优先级数字都要大于这个宏定义的值。(也就是优先级比它低,Cortex M3中低优先级对应的数字大)

进入临界区只是屏蔽比 configMAX_SYSCALL_INTERRUPT_PRIORITY优先级低的中断。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2015-10-26 18:02:02 | 显示全部楼层

回 freertos 的帖子

freertos:多谢详细的描述,但是网络上怎么有另外一种相反的描述:“

FreeRTOS 中定义了一个宏 configMAX_SYSCALL_INTERRUPT_PRIORITY

....... (2015-10-26 17:45)
一样的,请体会优先级高低和优先级对应的数值大小含义。

M3和M4内核,优先级高是对应的小数值。优先级低是对应的大数值。刚才我说的例子应该比较清楚。
回复

使用道具 举报

62

主题

77

回帖

263

积分

高级会员

积分
263
 楼主| 发表于 2015-10-26 18:04:10 | 显示全部楼层

回 eric2013 的帖子

eric2013:configLIBRARY_LOWEST_INTERRUPT_PRIORITY
这个是指的SVC中断和PendSV中断的优先级。
一般情况下都是配置成最低的优先级15。在port.c文件里面进行了配置。
==========================================================
configMAX_SYSCALL_INTERRUPT_PRIORITY  
....... (2015-10-26 17:15) 
你好,还有这个代码为什么内核优先级设为F最低?内核优先级不是应该最高才对嘛?因为这个跟系统时钟相关啊
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2015-10-26 18:23:12 | 显示全部楼层

回 freertos 的帖子

freertos:你好,还有这个代码为什么内核优先级设为F最低?内核优先级不是应该最高才对嘛?因为这个跟系统时钟相关啊 (2015-10-26 18:04) 
其实这里内核中断的优先级主要是对PendSV的中断优先级有要求,
PendSV中断主要是实现任务的切换功能。
-----------------------------------
PendSV的优先级必须要设置为最低优先级,因为我们要保证在发生中断嵌套的时候,退出到最后一级中断才可以发生任务切换。也就是PendSV中断的时候。要不任务切换就出问题了。
回复

使用道具 举报

62

主题

77

回帖

263

积分

高级会员

积分
263
 楼主| 发表于 2015-10-26 18:30:28 | 显示全部楼层

回 eric2013 的帖子

eric2013:其实这里内核中断的优先级主要是对PendSV的中断优先级有要求,
PendSV中断主要是实现任务的切换功能。
-----------------------------------
PendSV的优先级必须要设置为最低优先级,因为我们要保证在发生中断嵌套的时候,退出到最后一级中断才可以发生任务切换。也就是PendSV中 .. (2015-10-26 18:23) 
#define configMAX_SYSCALL_INTERRUPT_PRIORITY         127 /* equivalent to 0x7F, or priority 7. */

后面的数值可以自己写,例如stm32如果采用全抢占的方式,就是0~15的抢占优先级,理论上cortex m3的抢占优先级是255个最多,也就是0~0xFF,但各个厂商其实基本上没有做到这么多的,往往只用了其中的几位做抢占级。这个优先级是MSB对齐的,所以在只有0~15(0xF)个优先级的情况下,实际上后面的低4位是无效的,前面的才有效。
例如我这个配置中的优先级7,其实就是0x7F,后面的F没用,前面的7才有用,换成十进制就是127.

那么,这个定义之后后,优先级在7以下的(8,9,10....)中断,就会被FreeRTOS接管,是可以被RTOS屏蔽和推迟执行的(例如你taskENTERCRITICAL()的时候这类中断就被屏蔽了),这个具体的实现和PendSV Handler有关,你移植的时候一定已经把这个通过宏定义或别的方式交给了FreeRTOS的 xPortPendSVHandler接管,深入的我也不是太清楚了。这种级别的中断,可以调用FreeRTOS的ISR API函数,例如xSemaphoreGiveFromISR等。
7以上优先级的中断,是不可被RTOS屏蔽和不会被推迟的,这种中断不是说不可以调用FreeRTOS的API函数(因为我以前没搞懂这个的时候调用过也可以执行),但可能不能保证稳定性。

感觉这种说法又相反了。
回复

使用道具 举报

62

主题

77

回帖

263

积分

高级会员

积分
263
 楼主| 发表于 2015-10-26 18:35:43 | 显示全部楼层
FreeRTOS函数中以“FromISR”结尾的中断都是安全的,但当中断优先级逻辑上(非数值上译者注)高于configMAX_SYSCALL_INTERRUPT_PRIORITY中所设置的中间级别时,即使这些函数也不能被调用。所以,任何使用RTOS API 的中断服务程序都必须在数值上等于或大于configMAX_SYSCALL_INTERRUPT_PRIORITY的设置值。这确保了中断的逻辑优先级等于或小于configMAX_SYSCALL_INTERRUPT_PRIORITY设置。


-----------这个说法好像也是相反的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2015-10-26 19:34:40 | 显示全部楼层

回 freertos 的帖子

freertos:#define configMAX_SYSCALL_INTERRUPT_PRIORITY         127 /* equivalent to 0x7F, or priority 7. */

后面的数值可以自己写,例如stm32如果采用全抢占的方式,就是0~15的抢占优先级,理论上cortex m3的抢占优先级是255个最多,也就是0~0xFF,但各个厂商 .. (2015-10-26 18:30)
对着的,没反。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2015-10-26 19:35:12 | 显示全部楼层

回 freertos 的帖子

freertos:FreeRTOS函数中以“FromISR”结尾的中断都是安全的,但当中断优先级逻辑上(非数值上译者注)高于configMAX_SYSCALL_INTERRUPT_PRIORITY中所设置的中间级别时,即使这些函数也不能被调用。所以,任何使用RTOS API 的中断服务程序都必须在数值上等于或大于configMAX_SYSCALL_INTERR .. (2015-10-26 18:35) 
这个也对着的,没反。
回复

使用道具 举报

62

主题

77

回帖

263

积分

高级会员

积分
263
 楼主| 发表于 2015-10-26 22:12:50 | 显示全部楼层

回 eric2013 的帖子

eric2013:

这个也对着的,没反。
高于configMAX_SYSCALL_INTERRUPT_PRIORITY中所设置的中间级别时,即使这些函数也不能被调用。所以,任何使用RTOS API 的中断服务程序都必须在数值上等于或大于configMAX_SYSCALL_INTERRUPT_PRIORITY的设置值。


QQ图片20151026220851.png


你好,转载的文字描述使用RTOS API的中断服务程序必须在数值大于configMAX_SYSCALL_INTERRUPT_PRIORITY,从freertos中文说明的图示看configMAX_SYSCALL_INTERRUPT_PRIORITY=3,按文字说法,数字大于3才能调用RTOS API,可是图示却是数字小于3调用API。为什么你说没反?不明白。
另外你说的:“另外你说“小于优先级5的中断,使用FreeRTOS自带的开关中断函数是无法关闭的,他只能关闭小于等于5的,另外切不可
在优先级小于等于5的中断中调用FreeRTOS的API函数,会导致进入这个断言中,”


感觉你说的才跟图示描述一样。
回复

使用道具 举报

0

主题

13

回帖

13

积分

新手上路

积分
13
发表于 2015-10-27 08:35:23 | 显示全部楼层

回 freertos 的帖子

freertos:高于configMAX_SYSCALL_INTERRUPT_PRIORITY中所设置的中间级别时,即使这些函数也不能被调用。所以,任何使用RTOS API 的中断服务程序都必须在数值上等于或大于configMAX_SYSCALL_INTERRUPT_PRIORITY的设置值。



....... (2015-10-26 22:12) 
我来插句话。。。
这个图35中所给的例子是假设中断优先级数值越大表示逻辑上优先级越高。
回复

使用道具 举报

0

主题

13

回帖

13

积分

新手上路

积分
13
发表于 2015-10-27 09:09:17 | 显示全部楼层

回 freertos 的帖子

freertos:高于configMAX_SYSCALL_INTERRUPT_PRIORITY中所设置的中间级别时,即使这些函数也不能被调用。所以,任何使用RTOS API 的中断服务程序都必须在数值上等于或大于configMAX_SYSCALL_INTERRUPT_PRIORITY的设置值。



....... (2015-10-26 22:12)
先约定说“大小”是指优先级的数值,而且优先级数值越小,优先级越高
“小于优先级5的中断,使用FreeRTOS自带的开关中断函数是无法关闭的,他只能关闭小于等于5的,另外切不可在优先级小于等于5的中断中调用FreeRTOS的API函数,会导致进入这个断言中,”应该是“小于优先级5的中断,使用FreeRTOS自带的开关中断函数是无法关闭的,他只能关闭大于等于5的,另外切不可在优先级小于5的中断中调用FreeRTOS的API函数,会导致进入这个断言中,”
回复

使用道具 举报

62

主题

77

回帖

263

积分

高级会员

积分
263
 楼主| 发表于 2015-10-27 10:46:20 | 显示全部楼层

回 文刀言身寸 的帖子

文刀言身寸:先约定说“大小”是指优先级的数值,而且优先级数值越小,优先级越高
“小于优先级5的中断,使用FreeRTOS自带的开关中断函数是无法关闭的,他只能关闭小于等于5的,另外切不可在优先级小于等于5的中断中调用FreeRTOS的API函数,会导致进入这个断言中,”应该是“小于优先级5的中 .. (2015-10-27 09:09) 
果然是好人啊。
回复

使用道具 举报

62

主题

77

回帖

263

积分

高级会员

积分
263
 楼主| 发表于 2015-10-27 10:46:56 | 显示全部楼层

回 文刀言身寸 的帖子

文刀言身寸:我来插句话。。。
这个图35中所给的例子是假设中断优先级数值越大表示逻辑上优先级越高。 (2015-10-27 08:35) 
多谢,你理解数据手册比我认真
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-3 20:58 , Processed in 0.337854 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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