互斥量例程中线程优先级的疑问

发布于 2021-03-22 19:04:28

请问一下,为什么在本例程中,线程2的优先级比线程1的优先级高,却晚执行。

111.png

image.png

image.png

查看更多

关注者
0
被浏览
187
flashman2002
flashman2002 2021-03-22

关键在与你如何创建的互斥量,将互斥量的 flag 标志设置为
RT_IPC_FLAG_PRIO 还是 RT_IPC_FLAG_FIFO,其效果会不同的。

4 个回答
cxhxy12345
cxhxy12345 2021-03-22

是的,给flashman2002点个赞!
在ipc.c文件中有二处位置:
(1)定义

define RT_IPC_FLAG_FIFO 0

define RT_IPC_FLAG_PRIO 1

(2)在rt_ipc_list_suspend函数中
switch (flag){
case RT_IPC_FLAG_FIFO:
rt_list_insert_before(list, &(thread->tlist));
break;
case RT_IPC_FLAG_PRIO:
....

可以看下代码,对信号量在RTT的运用有一个更深入的了解。

pkokoc
pkokoc 2021-03-30

经实际测试,感觉上述答复并不正确。楼主提到“线程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根本不会开始执行。

绝味鸭脖ww
绝味鸭脖ww 2021-04-28

我也刚好遇到了这个问题,如果是按照官方例程的话 thread1优先级为8,thread2优先级为7,tshell优先级为20,所以运行过程中shell运行到thread1启动后会挂起,运行thread1,等thread1挂起后,再运行shell,启动thread2,shell挂起,thread2优先级比thread1高,之后就正常按照线程优先级运行了。
你可以把线程优先级改成25再试试。

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览