eric2013 发表于 2023-10-11 12:03:09

第9期ThreadX视频教程:自制个微秒分辨率任务调度实现方案(2023-10-11)

说明:
1、一般应用,我们都会将任务RTOS系统时钟节拍(心跳)设置为1ms,但如果直接把RTOS的系统时钟节拍设置为1us,系统负担非常大,而且很多RTOS也做不到100MHz主频下,1us切换一次任务,导致RTOS没有时间处理应用任务
2、这个机制主要是用来替换大家的程序里面不支持任务切换的DelayUS微秒延迟的API,让其也支持释放CPU权限来支持任务调度, 延迟时间到后,还可以根据自己的优先级情况返回执行。当前将RTOS本身的延迟API,比如tx_thread_sleep替换为新作的API实现也是没问题的
3、RTOS的通信组件,信号量,消息队列,事件标志等不需要微秒分辨率的延迟,因为紧急的中断调用这些通信API,会让就绪的最高优先级的等待通信任务立即得到执行。
4、这种方式还有有个优势,可以更好的降低CPU利用率。

视频教程:

https://www.bilibili.com/video/BV1Yh4y1z7k3/

https://www.bilibili.com/video/BV1Yh4y1z7k3/

实现方法:

需要的,做替换,不需要的不用替换。


任务信息统计:


配套例子
程序中将任务的延迟和DS18B20的微秒延迟都改成新作的API osDeleyUS实现

链接:https://pan.baidu.com/s/1QxnwR5hbAugZ83zldSqyUg提取码:7q3i


eric2013 发表于 2023-10-11 12:16:20

制作完毕。

hpdell 发表于 2023-10-11 12:20:00

eric2013 发表于 2023-10-11 12:16
制作完毕。

这么牛x 哈

不知道这样做长期工作稳定不 ?

eric2013 发表于 2023-10-11 12:21:19

hpdell 发表于 2023-10-11 12:20
这么牛x 哈

不知道这样做长期工作稳定不 ?

还行,有时间你也测评下试试效果。

frankff 发表于 2023-10-11 13:23:12

感谢老师的分享

浴火重生 发表于 2023-10-11 13:26:59

这个方式值得借鉴,rtos下面使用DMA方式的SPI、操作SD卡等,在文件系统也是死等判断完成标志和状态,这种是不是也可优化下,既能够相对快的状态完成又能调度出去执行别的任务

hpdell 发表于 2023-10-11 16:16:00

浴火重生 发表于 2023-10-11 13:26
这个方式值得借鉴,rtos下面使用DMA方式的SPI、操作SD卡等,在文件系统也是死等判断完成标志和状态,这种是 ...

这个可以有,

hpdell 发表于 2023-10-11 16:16:51

eric2013 发表于 2023-10-11 12:21
还行,有时间你也测评下试试效果。

好的, 我目前就是 guix 界面切换没有搞定啊, 就是基于某种特定条件下 就启动界面切换的

eric2013 发表于 2023-10-11 16:44:20

浴火重生 发表于 2023-10-11 13:26
这个方式值得借鉴,rtos下面使用DMA方式的SPI、操作SD卡等,在文件系统也是死等判断完成标志和状态,这种是 ...

不用,DMA在RTOS下直接放在低优先级任务里面慢慢刷即可。

【深入探讨】DMA到底能不能起到加速程序执行的作用,DMA死等操作是否合理,多个DMA数据流同时刷是否处理过来
https://www.armbbs.cn/forum.php?mod=viewthread&tid=109765&fromuid=58
(出处: 硬汉嵌入式论坛)

eric2013 发表于 2023-10-11 16:45:17

hpdell 发表于 2023-10-11 16:16
好的, 我目前就是 guix 界面切换没有搞定啊, 就是基于某种特定条件下 就启动界面切换的

在你的那个帖子里面回复你了,这个我们有专门做过一个例子。

weinizhongqing 发表于 2023-10-15 21:10:24

老师,有这个章节的图片原图吗?想下载一下慢慢看。

eric2013 发表于 2023-10-16 07:15:44

weinizhongqing 发表于 2023-10-15 21:10
老师,有这个章节的图片原图吗?想下载一下慢慢看。

这个截图是从例子里面截图的,一楼末尾的百度云网盘有下载。

nos001 发表于 2023-12-10 15:30:21

这个只是任务定时器的分辨率吗?
不知道怎么实现抢占,没有强制就绪函数。
用了个笨办法实现抢占,将需要在中断后立即执行的线程设为最高优先,在中断里将线程的睡眠定时器剩余的ticks清零。

nos001 发表于 2023-12-10 16:01:20

试试回帖
不知道如何在中断里将指定的线程就绪。

eric2013 发表于 2023-12-11 07:32:12

nos001 发表于 2023-12-10 15:30
这个只是任务定时器的分辨率吗?
不知道怎么实现抢占,没有强制就绪函数。
用了个笨办法实现抢占,将需要 ...

没太理解你的意思。

nos001 发表于 2023-12-11 19:11:05

eric2013 发表于 2023-12-11 07:32
没太理解你的意思。

水平太低,刚刚试用ThreadX,各种概念模糊不清,线程只会照着例程简单使用sleep,见笑了。
上帖的想法是,串口接收空闲中断发生后,立即使指定的线程进入执行状态;由于源码没读懂,不知道使用什么方法,于是采用了笨办法,将线程睡眠定时器的剩余ticks清零,达到最快切换到指定线程的目的。
现在读了下threadx指南,原来使用消息队列就可以了。
页: [1]
查看完整版本: 第9期ThreadX视频教程:自制个微秒分辨率任务调度实现方案(2023-10-11)