Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
DIY综合交流区
[RealTouch例程]线程优先级反转之优先级继承算法
发布于 2012-09-01 15:48:25 浏览:10285
订阅该版
实验目的 ? 本实验的主要设计目的是帮助读者了解线程优先级反转的一种解决方法。 硬件说明 本实验使用RT-Thread官方的Realtouch开发板作为实验平台。涉及到的硬件主要为 ? 串口3,作为rt_kprintf输出,需要连接JTAG扩展板 具体请参见《Realtouch开发板使用手册》 实验原理及程序结构 实验设计 优先级继承是指将占有共享资源的的低优先级线程的优先级临时提高到等待该共享资源的所有线程中,优先级最高的那个线程的优先级,当高优先级线程由于等待共享资源被阻塞时,拥有共享资源的线程的优先级会被自动提升,从而避免出现优先级反转问题。 在 RT-Thread 的 mutex 设计中已经实现了优先级继承这种算法,因此,使用 mutex 即可以使用优先级继承的算法解决优先级反转问题。 源程序说明 本实验对应1_kernel_thread_prioinherit 系统依赖 在rtconfig.h中需要开启 ``` #define RT_USING_HEAP``` 此项可选,开启此项可以创建动态线程和动态信号量,如果使用静态线程和静态信号量,则此项不是必要的 ``` #define RT_USING_CONSOLE``` 此项必须,本实验使用rt_kprintf向串口打印按键信息,因此需要开启此项 主程序说明 如上节一样,还是定义了三个线程,t1,t2,worker,建立过程也完全相同,所以不再赘述。 下面的代码是三个线程的入口程序: ```static void thread1_entry(void* parameter) { rt_err_t result; result = rt_mutex_take(mutex, RT_WAITING_FOREVER); result = rt_mutex_take(mutex, RT_WAITING_FOREVER); rt_kprintf("thread1: got mutex "); if (result != RT_EOK) { return; } for(t1_count = 0; t1_count < 5;t1_count ++) { rt_kprintf("thread1:count: %d ", t1_count); } rt_kprintf("thread1: released mutex "); rt_mutex_release(mutex); rt_mutex_release(mutex); } ``` ```static void thread2_entry(void* parameter) { rt_err_t result; rt_thread_delay(5); result = rt_mutex_take(mutex, RT_WAITING_FOREVER); rt_kprintf("thread2: got mutex "); for(t2_count = 0; t2_count < 5;t2_count ++) { rt_kprintf("thread2: count: %d ", t2_count); } } static void worker_thread_entry(void* parameter) { rt_thread_delay(5); for(worker_count = 0; worker_count < 5; worker_count++) { rt_kprintf("worker:count: %d ", worker_count); rt_thread_delay(5); } } ``` 编译调试及观察输出信息 编译请参见《RT-Thread配置开发环境指南》完成编译烧录,参考《Realtouch开发板使用手册》完成硬件连接,连接扩展板上的串口和jlink。 运行后可以看到如下信息: ``` | / - RT - Thread Operating System / | 1.1.0 build Aug 11 2012 2006 - 2012 Copyright by rt-thread team thread1: got mutex thread1:count: 0 thread1:count: 1 thread1:count: 2 thread1:count: 3 thread1:count: 4 thread1: released mutex thread2: got mutex thread2: count: 0 thread2: count: 1 thread2: count: 2 thread2: count: 3 thread2: count: 4 worker:count: 0 worker:count: 1 worker:count: 2 worker:count: 3 worker:count: 4 ….``` 结果分析 在上一节已经分析过由于信号量可能引入的优先级反转问题,在RT-Thread中实现的是优先级继承算法。优先级继承通过在线程A被阻塞期间提升线程C的优先级到线程A的优先级别从而解决优先级翻转引起的问题。如图1-1所示 [attachment=-2] 图1-1 根据打印结果,我们可以看到thread2和worker线程虽然优先级比thread1要高,但是这两个线程均在进程开始出就执行了延时函数,于是轮到 thread1 执行,然后 thread1获得互斥量,thread2延时结束后,虽然它的优先级高于thread1,但是它所需的互斥量被thread1占有了,它无法获得所需的互斥量以便继续运行。在此时,系统的优先级继承算法也会起作用,将thread1的优先级提升到与thread2一致,验证方法是在thread1 release互斥量之前插入tid2->currentpriority 是否等于 tid1->currentpriority的判断语句,当然此时的结果是相等的。当 thread1 优先级被提升到和 thread2 一样后,worker 线程优先级因为低于 thread1 的优先级而不再能够抢占 thread1, 从而保证避免优先级反转现象发生。 所以说,优先级反转的问题可以通过优先级继承来解决,在RT-Thread 的 mutex 中实现了优先级继承算法。 [attachment=-1] [attach]0[/attach] ![jicheng.png](https://oss-club.rt-thread.org/uploads/88_2a7eec75781ea01e12aee7fdf92e28ba.png) 下载附件 [实验1_7线程优先级反转之优先级继承.pdf](https://oss-club.rt-thread.org/uploads/88_4f6334652d0cdd66175201642db09a90.pdf) 下载附件 [1_kernel_thread_priority_inheritance.zip](https://oss-club.rt-thread.org/uploads/88_74ea881f1c05b8a75f119c4c1dd1ca06.zip) ![QQ图片20131112094138.jpg](https://oss-club.rt-thread.org/uploads/5952_0d61a052357499975128061351b32565.jpg)
查看更多
11
个回答
默认排序
按发布时间排序
lujun723
2012-10-09
这家伙很懒,什么也没写!
感觉用了信号量,共享信号量的线程们,谁抢到了谁优先级最高,只是别让不共享此信号量的线程钻了空子,优先级反转在共享信号量的线程之间基本是个伪命题,仅存在于不共享信号量的线程之间而已
duxiaoshi
2013-02-22
这家伙很懒,什么也没写!
我测试了一下 [https://github.com/RT-Thread/realtouch-stm32f4/blob/master/software/examples/examples/1_kernel_thread_prioinherit/applications/application.c](https://github.com/RT-Thread/realtouch- ... lication.c) 代码 打印了t1的current_priority, 为什么还是7? 但是当我在thread1_entry 函数中修改了如下代码,加入了延时 >``` > for(t1_count = 0; t1_count < 5;t1_count ++) > { > rt_kprintf("thread1:count: %d >", t1_count); > rt_thread_delay(5); > } >``` --- t1的current_priority会变为5
fengchao989
2013-10-08
这家伙很懒,什么也没写!
>感觉用了信号量,共享信号量的线程们,谁抢到了谁优先级最高,只是别让不共享此信号量的线程钻了空子,优先级反转在共享信号量的线程之间基本是个伪命题,仅存在于不共享信号量的线程之间而已 --- 我也是这个感觉。
fengchao989
2013-10-08
这家伙很懒,什么也没写!
为什么要两次 ``` result = rt_mutex_take(mutex, RT_WAITING_FOREVER); result = rt_mutex_take(mutex, RT_WAITING_FOREVER); ``` 以及两次 ``` rt_mutex_release(mutex); rt_mutex_release(mutex); ``` 一次不行吗?
zpehome
2013-10-30
这家伙很懒,什么也没写!
``` result = rt_mutex_take(mutex, RT_WAITING_FOREVER); result = rt_mutex_take(mutex, RT_WAITING_FOREVER); ``` 这个为什么是两次,谁能解释下?
shaolin
2013-10-30
这家伙很懒,什么也没写!
>result = rt_mutex_take(mutex, RT_WAITING_FOREVER); >result = rt_mutex_take(mutex, RT_WAITING_FOREVER); >这个为什么是两次,谁能解释下? --- 连续使用两次 rt_mutex_take,这样的写法应该是有问题的。
bernard
2013-10-30
这家伙很懒,什么也没写!
>result = rt_mutex_take(mutex, RT_WAITING_FOREVER); >result = rt_mutex_take(mutex, RT_WAITING_FOREVER); >这个为什么是两次,谁能解释下? --- 为了模拟循环持有mutex的情况。mutex和semaphore是有区别的,那么同一线程可以多次持有mutex对象。而semaphore,如果value已经是0了,再去持有semaphore会把线程给挂起。这部分需要结合编程指南仔细体会、理解
rootxie
2013-11-04
这家伙很懒,什么也没写!
连续获得2次还是未能理解。 另外任务2貌似没有释放,实际应用也可以吗?
婷影伊人
2013-11-12
这家伙很懒,什么也没写!
这个例程测试结果是这样的:[attach]2071[/attach] 没达到预期效果
andywyt
2013-12-19
这家伙很懒,什么也没写!
非常感谢,学习了~~~~~~~
撰写答案
登录
注册新账号
关注者
0
被浏览
10.3k
关于作者
shaolin
这家伙很懒,什么也没写!
提问
115
回答
444
被采纳
0
关注TA
发私信
相关问题
1
[项目]搞个开源的硬件项目
2
硬件计划贴,及时更新,欢迎提意见
3
软件计划贴,及时更新,欢迎提意见::WMA,MOUNT,LWIP等问题急需解决.
4
MMS协议
5
定点的wma解压库-libwma
6
QQ群记录 [20090821]
7
STM32网络收音机PCB报名征集
8
第一版调试记录
9
第二版硬件讨论
10
RADIO项目相关模块规格--欢迎大家自己做板时规格与此兼容,减少重复劳动
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
ulog
C++_cpp
at_device
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
8
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
3
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部