OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7508|回复: 9

FreeRTOS内核优先级的疑惑

[复制链接]

7

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2013-9-12
在线时间
3 小时
发表于 2016-5-9 22:51:56 | 显示全部楼层 |阅读模式
1金钱
问题一、为什么一般FreeRTOS内核的优先级推荐设置比较低的优先级?

    如果内核优先级比较低,则任务切换会受到中断函数执行的影响,Task的实时性如何保证?

当然,可以通过高优先级的定时器产生定时中断来执行相应的代码,根据能否调用API,分两种情况。
第一种,能调用API,这类中断优先级不可以太高(必须可以被操作系统屏蔽),响应会受到任务切换的影响,但是由于临界区代码非常短,可以接受。
第二种,不能调用API,优先级随便,高优先级的中断不受操作系统任务调度的影响,因为即使操作系统当前在临界区,该类中断依然可以正常执行。

问题二、如下两个任务
{
xTaskCreate(task1, "task1", 0x200, NULL, 4, NULL);
xTaskCreate(task2, "task2", 0x200, NULL, 5, NULL);

}
task1和task2都是无限死循环切换一个GPIO状态,按照道理,task2应该会将task1“饿死”,但是事实上却没有,可能是什么原因?

同时,下面一种就会出现task2将task1“饿死”
{
xTaskCreate(task1, "task1", 0x200, NULL, 3, NULL);
xTaskCreate(task2, "task2", 0x200, NULL, 4, NULL);

}

码字码到一半的时候,灵光一闪,问题二的原因想想其实不难,
#define configMAX_PRIORITIES                ( 5 )





正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

117

主题

598

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
1694
金钱
1694
注册时间
2012-5-10
在线时间
437 小时
发表于 2016-5-10 08:47:12 | 显示全部楼层
我用freertos这么久了从来没怎么使用过优先级,只有一个看门狗是1,其他的全是2,任务内容设计不好,才是最大的问题
如有技术问题,微信扫头像交流,STM32,JAVA,服务器
回复

使用道具 举报

5

主题

158

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
200
金钱
200
注册时间
2016-5-29
在线时间
5 小时
发表于 2016-5-31 19:01:37 | 显示全部楼层
路过帮顶
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2016-2-26
在线时间
6 小时
发表于 2017-2-6 16:17:55 | 显示全部楼层
xsx127 发表于 2016-5-10 08:47
我用freertos这么久了从来没怎么使用过优先级,只有一个看门狗是1,其他的全是2,任务内容设计不好,才是最 ...

有个问题就是,我创建两个任务,一个优先级高一个优先级低,然后运行,高优先级运行完不会自动运行低优先级的。一直运行高优先级的
回复

使用道具 举报

20

主题

89

帖子

2

精华

高级会员

Rank: 4

积分
576
金钱
576
注册时间
2014-8-3
在线时间
18 小时
发表于 2017-2-6 17:43:57 | 显示全部楼层
376262974 发表于 2017-2-6 16:17
有个问题就是,我创建两个任务,一个优先级高一个优先级低,然后运行,高优先级运行完不会自动运行低优先 ...

你要是在高优先级的任务里不在适当位置进行任务调度的话,当然会一直占用着CPU不会去执行低优先级的任务。可以在适当的位置加入vTaskDelay等。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2017-2-6 18:09:44 | 显示全部楼层
帮顶
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2016-2-26
在线时间
6 小时
发表于 2017-2-7 09:08:31 | 显示全部楼层
Edwardwei 发表于 2017-2-6 17:43
你要是在高优先级的任务里不在适当位置进行任务调度的话,当然会一直占用着CPU不会去执行低优先级的任务 ...

也就是说,他不会自动让出CPU使用权。
比如说扫地和拖地,扫地优先级高就一直扫,不会扫完自动去拖
如果同等优先级,就边扫边拖
回复

使用道具 举报

20

主题

89

帖子

2

精华

高级会员

Rank: 4

积分
576
金钱
576
注册时间
2014-8-3
在线时间
18 小时
发表于 2017-2-8 22:12:46 | 显示全部楼层
376262974 发表于 2017-2-7 09:08
也就是说,他不会自动让出CPU使用权。
比如说扫地和拖地,扫地优先级高就一直扫,不会扫完自动去拖
如 ...

一个任务就是一个死循环,所以那个扫地没有扫完一说,要么你在任务的代码里把事情完成后调用delete删掉任务,或者用suspend挂起任务。要么你加入适当的delay,这些都会引发任务调度,让低优先级待命任务可以获取CPU使用权。加入delay的话,在延时结束后,这个扫地任务会再扫一次。
回复

使用道具 举报

20

主题

89

帖子

2

精华

高级会员

Rank: 4

积分
576
金钱
576
注册时间
2014-8-3
在线时间
18 小时
发表于 2017-2-8 22:14:18 | 显示全部楼层
376262974 发表于 2017-2-7 09:08
也就是说,他不会自动让出CPU使用权。
比如说扫地和拖地,扫地优先级高就一直扫,不会扫完自动去拖
如 ...

FreeRTOS里同等优先级的会分时运行, 也就是说如果扫地和拖地会分别运行一个Tick,轮流着来。如果uCOS的话,就不会有同等优先级了。
回复

使用道具 举报

30

主题

73

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2016-6-5
在线时间
85 小时
发表于 2017-8-26 00:28:19 | 显示全部楼层
同问  解决了吗
1,task1和task2都是无限死循环切换一个GPIO状态,按照道理,task2应该会将task1“饿死”,但是事实上却没有,可能是什么原因?
2,同时,下面一种就会出现task2将task1“饿死”
{
xTaskCreate(task1, "task1", 0x200, NULL, 3, NULL);
xTaskCreate(task2, "task2", 0x200, NULL, 4, NULL);

}
@原子哥
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 23:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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