OpenEdv-开源电子网

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

Freertos同优先级任务无法切换的问题

[复制链接]

1

主题

2

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2019-9-29
在线时间
26 小时
发表于 2019-12-12 20:55:18 | 显示全部楼层 |阅读模式
10金钱
根据学习freertos同优先级的任务执行是根据时间片来的,相当于任务A和任务B交替执行,即使没有延时,也就是任务A和任务B都没有进入过阻塞态,按理说也应该是交替执行但为何两个任务
一个狂跑,另一个进不去,在任务A, B中加上临界区函数后,两个任务才可以交替执行,我是根据用printf打印来观察的







,宏配置也没有问题,请问各位大神,这是什么原因呢

最佳答案

查看完整内容[请看2#楼]

有没有试过直接用自己写的串口输出字符串呢,printf调用的时间会有点长,不建议采用太复杂的方法来debug,要确认两个同优先级任务有没有轮流切换,更简单的方法就是用两个u32的全局变量分别在两个任务里面不断实现+1,在暂停仿真的时候就能看到两个变量到底有没有变化了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11922
金钱
11922
注册时间
2015-11-5
在线时间
2086 小时
发表于 2019-12-12 20:55:19 | 显示全部楼层
瀚小xi 发表于 2019-12-14 18:51
主要是利用printf来观察同优先级任务的交替运行,加临界区后是可以两个任务可以交替打印,但是不清楚为何 ...

有没有试过直接用自己写的串口输出字符串呢,printf调用的时间会有点长,不建议采用太复杂的方法来debug,要确认两个同优先级任务有没有轮流切换,更简单的方法就是用两个u32的全局变量分别在两个任务里面不断实现+1,在暂停仿真的时候就能看到两个变量到底有没有变化了
拿来长岛冰茶换我半晚安睡
回复

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11922
金钱
11922
注册时间
2015-11-5
在线时间
2086 小时
发表于 2019-12-14 13:59:11 | 显示全部楼层
在printf的地方加临界区?
回复

使用道具 举报

1

主题

2

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2019-9-29
在线时间
26 小时
 楼主| 发表于 2019-12-14 18:51:29 | 显示全部楼层
FreeRTOS 发表于 2019-12-14 13:59
在printf的地方加临界区?

主要是利用printf来观察同优先级任务的交替运行,加临界区后是可以两个任务可以交替打印,但是不清楚为何不加就不行了,今天换了其他的方法进行验证,任务A设置一个不断累加的变量,通过队列发给任务B,任务B接收后再printf打印出来,任务A,B同优先级而且没加延时,发现打印出来的数字是在累加的,也就是任务是交替运行的,所以现在怀疑是不是printf出问题了,造成不能两个任务同时打印
回复

使用道具 举报

26

主题

355

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1770
金钱
1770
注册时间
2017-4-1
在线时间
432 小时
发表于 2019-12-15 14:40:54 | 显示全部楼层
本帖最后由 陈皮皮 于 2019-12-15 14:45 编辑

同优先级不释放时间片应该是轮询不到另外同优先级的任务才对。但是不知道为什楼主加了临界保护就可以了..
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2019-12-19
在线时间
2 小时
发表于 2019-12-19 15:54:50 | 显示全部楼层
在这个系统中,是没有时间片运行的,只有高优先级抢占低优先级的运行,如果没有使能抢占式,那就只能是任务释放后,系统再按优先级排序运行。
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2020-2-1
在线时间
17 小时
发表于 2020-2-16 15:18:07 | 显示全部楼层
选了抢占式运行,任务都是同级别的话,每个任务都必须有阻塞,就是没有阻塞的话就每个任务最后加一个1ms延时,人为阻塞一下,就可以了
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2020-2-1
在线时间
17 小时
发表于 2020-2-16 15:20:51 | 显示全部楼层
你用cubeide配置的时候,可以看,你配置的每一个任务,里面都有一个默认的小延时,你写一个点灯任务,然后注释掉延时,灯就永远都不会亮。。。
回复

使用道具 举报

2

主题

474

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6077
金钱
6077
注册时间
2018-6-27
在线时间
524 小时
发表于 2020-12-1 10:17:39 | 显示全部楼层
学习学习,学习学习。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 17:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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