完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
|
|
所以是如果我把互斥量的FLAG设置为RT_IPC_FLAG_FIFO,先执行的是首先初始化的线程(本程序中的线程1)是吗?
|
|
|
|
是的,RT_IPC_FLAG_FIFO遵循先进先出的原则。不过个人建议不要用这个方式,除非你的这二个线程是平行线程。
|
|
|
|
我在仿真的时候也遇到了这个问题,一开始也以为是flag的原因,将RT_IPC_FLAG_FIFO改为RT_IPC_FLAG_PRIO之后,通过调试发现效果还是一样的。通过断点调试的方式发现在rt_thread1_startup过后就跳出了初始化函数,开始运行thread1,接着才是rt_thread2_startup,运行thread2,优先级根本没起作用;原因是示例中的线程优先级初始设置为8,shell线程的优先级为20,所以在rt_thread1_startup执行过后跳出了循坏,开始运行线程1,线程1挂起后,执行rt_thread2_startup,运行线程2。如果想要看到抢占优先级的效果,可以把初始的优先级调到20以上。
|
|
|
|
经实际测试,感觉上述答复并不正确。楼主提到“线程2的优先级比线程1的优先级高,却晚执行”,该现象的关键点并非flag 标志设置问题。由于MCU是单核,因此所谓的多线程,在同一时刻还是单线程的。楼主提到的现象的本质是因为线程1先startup,因此线程1先开始执行,当线程1执行到 rt_thread_mdelay(10);语句时,线程1让出CPU资源,然后线程2才开始执行,因为线程2的优先级高,因此后续是执行线程2的代码。
如下两个测试可验证: 1、将RT_IPC_FLAG_FIFO改为RT_IPC_FLAG_PRIO,其它代码不变,可发现任然是线程1先执行。 2、如果将线程1函数中的rt_thread_mdelay(10)语句去掉,即线程1的while()是一个死循环,此时线程1不会让出CPU资源,线程2根本不会开始执行。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
AI模型部署边缘设备的奇妙之旅:边缘端设备的局域网视频流传输方案
1629 浏览 0 评论
1497 浏览 0 评论
AI模型部署边缘设备的奇妙之旅:如何在边缘端部署OpenCV
6734 浏览 0 评论
tms320280021 adc采样波形,为什么adc采样频率上来波形就不好了?
1870 浏览 0 评论
3833 浏览 0 评论
78581 浏览 21 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-29 07:09 , Processed in 0.654149 second(s), Total 77, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号