完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
RT-Thread Nano 通过 keil 添加的 3.1.5版本经测试发现在不主动释放CPU的情况下别的线程不会被调度,具体测试如下:
线程A:默认的 main线程,优先级默认,对时间要求不高用来运行耗时任务,在主循环中通过 print函数观察线程运行; 线程B:实时线程,优先级为 0,用来运行对时间有严格要求的线程,在主循环中通过 print函数观察线程运行; 测试1:在线程 A主循环中主动调用 rt_thread_mdelay 函数让渡 CPU,在线程 B主循环中不调用 rt_thread_mdelay函数让渡 CPU,结果:只有线程 B运行; 测试2:在线程 A主循环中不调用 rt_thread_mdelay 函数让渡 CPU,在线程 B主循环中主动调用 rt_thread_mdelay函数让渡 CPU,结果:只有线程 A、B都运行; 测试3:线程 A、B都不主动调用 rt_thread_mdelay 函数让渡 CPU,结果:只有线程 B运行; 测试中一直到线程 B的优先级下调到与线程 A优先级相同,线程 A 才能在线程 B不主动让渡 CPU的情况下被调度执行,所以关于线程调度这块我有点不是很明白,就是线程主动让渡 CPU通常都是在主循环的末尾或者需要延时的时候,那么假如线程 B需要严格控制 1ms周期运行,任务需要消耗 0.5ms,而线程 A运行的是庞大的计算比如 2ms才能算完,那么在计算的中途显然是不好去控制线程 A主动让渡 CPU的,而且线程 A也不知道线程 B什么时候需要 CPU,那么就只能依赖系统的强制切换时间片了,可是在线程 A没有主动释放 CPU的情况下如何让线程 B运行呢?就是 B如何抢占 A已经获得的 CPU从而保证自身固定 且严格1ms的运行周期??? |
|
相关推荐
1个回答
|
|
RT-Thread是基于优先级抢占式的RTOS,运行处于就绪态的最高优先级线程。
在优先级为最高的前提下,多个就绪线程优先级相同,时间片轮转。 根据你的描述,B优先级 > A优先级。 测试1解释:B高于A,B不放弃CPU,A永远不会得以运行,因为B永远就绪。 测试2解释:B高于A,B主动放弃CPU,A运行,因为B Suspend,A就绪,此时A是就绪态的最高优先级线程;不停发生Tick中断,直到B延时时间到,B就绪,抢占A的CPU,B运行,因为A就绪且运行中,被Tick中断打断了,然后在Tick中设置B就绪,在AB均就绪条件下,B优先级更高,B运行。 测试3解释:B高于A,B永远运行,A永远不会运行,因为启动时,B就绪且优先级最高。 你的问题Solution: Solution1 - B优先级最高,使用rt_thread_delay_until函数作为绝对延时,包含线程具体任务时间,符合你的需求。但B严格1ms,对于线程来说,有些严苛了,建议用Solution2。 Solution2 - B优先级最高,用HWTimer,每隔1ms发出Event/Sem,B线程永远等待Event/Sem,收到后运行。 只需要保证B优先级高于A,线程A的2ms运算不会影响到B。A线程的计算是在B完成0.5ms计算后,在0.5~1ms的间隔中进行的。 A也不怕被打断,因为有线程栈。 CPU此时得到充分应用。A,B均没事情干的时候,tidle任务介入,CPU空转。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
753 浏览 0 评论
AI模型部署边缘设备的奇妙之旅:如何在边缘端部署OpenCV
2714 浏览 0 评论
tms320280021 adc采样波形,为什么adc采样频率上来波形就不好了?
1368 浏览 0 评论
1955 浏览 0 评论
1523 浏览 0 评论
74933 浏览 21 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 18:28 , Processed in 0.686182 second(s), Total 69, Slave 53 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号