OpenEdv-开源电子网

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

FreeRTOS使任务执行指定时间后停止后删除

[复制链接]

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2019-3-4
在线时间
15 小时
发表于 2019-5-17 12:21:51 | 显示全部楼层 |阅读模式
1金钱
怎么使任务精确执行指定的时间,比如200ms后停止运行,请问嵌友们这个如何具体实现,挺着急的,谢谢!

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

使用道具 举报

4

主题

41

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5027
金钱
5027
注册时间
2017-2-16
在线时间
811 小时
发表于 2019-5-19 10:45:57 | 显示全部楼层
设置软件定时器任务优先级为最高,开启抢占调度,不要开启时间片调度。创建一个优先级比软件定时器任务的优先级低一级,再在这个任务中创建软件定时器,定时周期为200ms(这个要准的话,一个tick的时间必须能被200ms整除),并开启当前软件定时器,在软件定时的回调函数中执行挂起(或是删除)优先级比软件定时器任务的优先级低一级的这个任务。之后这个比软件定时器任务低一个优先级的任务就开始跑要执行的代码。这样也不能保证这个任务就是跑了200ms,只是很接近200ms(因为中断要花时间、软件定时器回调函数要花时间、还有开始运行软件定时器时可能不是在一个tick的开头,有可能在tick的中间或是末尾,这样软件定时器误差就在一个tick之内)。
回复

使用道具 举报

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2019-3-4
在线时间
15 小时
 楼主| 发表于 2019-5-19 10:57:58 | 显示全部楼层
HSL 发表于 2019-5-19 10:45
设置软件定时器任务优先级为最高,开启抢占调度,不要开启时间片调度。创建一个优先级比软件定时器任务的优 ...

谢谢,其实我想在时间片调度的方式下实现某个任务执行指定时间后停止,就是该任务真正占用CPU的执行时间如200ms 后停止,这个怎么实现啊,谢谢!
回复

使用道具 举报

4

主题

41

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5027
金钱
5027
注册时间
2017-2-16
在线时间
811 小时
发表于 2019-5-19 11:23:51 | 显示全部楼层
zengsanhuo 发表于 2019-5-19 10:57
谢谢,其实我想在时间片调度的方式下实现某个任务执行指定时间后停止,就是该任务真正占用CPU的执行时间 ...

这个你可以参考RT-Thread,RT-Thread在创建线程的时候就可以指定该线程的运行时间片。
回复

使用道具 举报

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2019-3-4
在线时间
15 小时
 楼主| 发表于 2019-5-19 11:27:52 | 显示全部楼层
HSL 发表于 2019-5-19 11:23
这个你可以参考RT-Thread,RT-Thread在创建线程的时候就可以指定该线程的运行时间片。

现在就是刚接触FreeRTOS不久,其他都不熟,而且弄得是毕设,很烦,目前就是想完成这个毕设吧,自己想的有一个需求要让任务在时间片下执行指定时间。似乎FreeRTOS没有一样。
回复

使用道具 举报

4

主题

41

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5027
金钱
5027
注册时间
2017-2-16
在线时间
811 小时
发表于 2019-5-19 11:32:55 | 显示全部楼层
zengsanhuo 发表于 2019-5-19 11:27
现在就是刚接触FreeRTOS不久,其他都不熟,而且弄得是毕设,很烦,目前就是想完成这个毕设吧,自己想的有 ...

用时间片是不能准确定时任务的运行时间,只能是接近。你的毕设要实现的功能是什么?可以考虑软件设计上的调整。
回复

使用道具 举报

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2019-3-4
在线时间
15 小时
 楼主| 发表于 2019-5-20 09:15:17 | 显示全部楼层
HSL 发表于 2019-5-19 11:32
用时间片是不能准确定时任务的运行时间,只能是接近。你的毕设要实现的功能是什么?可以考虑软件设计上的 ...

毕设弄得是调度算法的优化,我想的是在时间片上,任务最后几个时间片是继续执行,而不发生切换,所以想获得任务执行时间,当剩余执行时间少于几个时间片时,直接运行完成并删除。这个目前不知道咋弄,
回复

使用道具 举报

4

主题

41

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5027
金钱
5027
注册时间
2017-2-16
在线时间
811 小时
发表于 2019-5-20 23:25:09 | 显示全部楼层
zengsanhuo 发表于 2019-5-20 09:15
毕设弄得是调度算法的优化,我想的是在时间片上,任务最后几个时间片是继续执行,而不发生切换,所以想获 ...

修改使得FreeRTOS支持时间片可修改(注:只是简单测试可用,可能还有其他未知的问题,只是提供一个参考思路)

FreeRTOS-Simulator-TimeSlice.zip

2.55 MB, 下载次数: 2

回复

使用道具 举报

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2019-3-4
在线时间
15 小时
 楼主| 发表于 2019-5-21 12:50:51 | 显示全部楼层
HSL 发表于 2019-5-20 23:25
修改使得FreeRTOS支持时间片可修改(注:只是简单测试可用,可能还有其他未知的问题,只是提供一个参考思 ...

谢谢,按照你的代码进行了修改,比之前的可读性好多了,不过在xPortSysTickHandler中断处理函数中删除任务vTaskDelete(NULL);的时候,总会报Error:..\FreeRTOS\portable\RVDS\ARM_CM3\port.c,378的错误,378行为 configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 );不清楚啥原因,我在其中用了printf函数,具体不知道了。 QQ图片20190521124418.png QQ图片20190521124944.png ,不过还是挺感谢你的!
回复

使用道具 举报

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2019-3-4
在线时间
15 小时
 楼主| 发表于 2019-5-21 12:55:38 | 显示全部楼层
HSL 发表于 2019-5-20 23:25
修改使得FreeRTOS支持时间片可修改(注:只是简单测试可用,可能还有其他未知的问题,只是提供一个参考思 ...

之前我是通过在当前任务中比较剩余时间<1时,就在其中删除本身。
回复

使用道具 举报

4

主题

41

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5027
金钱
5027
注册时间
2017-2-16
在线时间
811 小时
发表于 2019-5-21 13:39:22 | 显示全部楼层
zengsanhuo 发表于 2019-5-21 12:50
谢谢,按照你的代码进行了修改,比之前的可读性好多了,不过在xPortSysTickHandler中断处理函数中删除任 ...

那楼主后面就自己加油了!
回复

使用道具 举报

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2019-3-4
在线时间
15 小时
 楼主| 发表于 2019-5-21 14:07:48 | 显示全部楼层
HSL 发表于 2019-5-21 13:39
那楼主后面就自己加油了!

OK,好的,还是挺感谢你的,至少比之前的代码可读性好多了,加油!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 03:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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