RTOS中很经典的问题。就是在使用共享资源的时候,优先级低的进程在优先级高的进程之前执行的问题。这里模拟这种情况。

下面的实验模拟了优先级反转的情况:

先定义三个线程:

//优先级反转实验
rt_sem_t sem;
rt_uint32_t t1_count = 0,t2_count = 0,worker_count = 0;
rt_thread_t t1,t2,worker ;void pri1_entry(void *parameter)
{rt_err_t result;while(1){result = rt_sem_take(sem,RT_WAITING_FOREVER);for(t1_count =0;t1_count<10;t1_count++){rt_kprintf("pri1 take semphone\r\n");rt_thread_delay(RT_TICK_PER_SECOND);}rt_kprintf("pri1 release semphone\r\n");rt_sem_release(sem);}
}void pri2_entry(void *parameter)
{//rt_uint32_t t2_count = 0;
    rt_err_t result;while(1){result = rt_sem_take(sem,RT_WAITING_FOREVER);rt_kprintf("pri2 take semphone\r\n");if(result != RT_EOK){return;}rt_kprintf("pri2 release semphone\r\n");rt_sem_release(sem);rt_thread_delay(5);result = rt_sem_take(sem,RT_WAITING_FOREVER);t2_count ++;rt_kprintf("pri2 :got semphone,count:%d\r\n",t2_count);result = rt_sem_release(sem);}}void worker_entry(void *parameter)
{rt_thread_delay(5);for(worker_count = 0;worker_count<10;worker_count++){rt_kprintf("worker:  count: %d\n", worker_count);}rt_thread_delay(RT_TICK_PER_SECOND);}

启动三个线程:

//信号量/优先级反转实验
    t1 = rt_thread_create("pri1",pri1_entry, RT_NULL,512, 8, 10);if (t1 != RT_NULL)rt_thread_startup(t1);t2 = rt_thread_create("pri2",pri2_entry, RT_NULL,512, 6, 10);if (t2 != RT_NULL)rt_thread_startup(t2);worker = rt_thread_create("worker",worker_entry, RT_NULL,512, 7, 10);if (worker != RT_NULL)rt_thread_startup(worker);
sem = rt_sem_create("sem_t",1,RT_IPC_FLAG_PRIO);

三个线程的优先级分别是:pri1:8 pri2:6 worker:7

程序开始运行时,上进程均处于就绪状态。此时pri2进程优先级最高开始执行,它先申请信号量之后释放。此时进程pri1和worker都处于就绪状态,worker进程进入后先休眠。进程pri1开始执行。

进程pri1申请信号量,开始输出。此后,进程pri2就绪但它申请信号量的时候发现信号量被使用了,于是就开始等待信号量。进程worker就绪后,抢占pri1的开始执行。

于是就出现了高优先级进程pri2处于等待状态,而低优先级进程worker处于执行状态这种情况。

Pr1占用sem时候,pri2处于等待sem状态,worker就绪了,worker抢占pri1的CPU执行。造成了worker的优先级没有pri2高,却在pri2之前执行。

通过串口输出的结果可以看得更清楚些:


\ | /
- RT -     Thread Operating System
/ | \     2.0.0 build Aug 29 2014
2006 - 2013 Copyright by rt-thread team
pri2 take semphone
pri2 release semphone
pri1 take semphone
finsh>>worker:  count: 0
worker:  count: 1
worker:  count: 2
worker:  count: 3
worker:  count: 4
worker:  count: 5
worker:  count: 6
worker:  count: 7
worker:  count: 8
worker:  count: 9
pri1 take semphone
pri1 take semphone
pri1 take semphone
pri1 take semphone
pri1 take semphone
pri1 take semphone
pri1 take semphone
pri1 take semphone
pri1 take semphone
pri1 release semphone
pri2 :got semphone,count:1
pri2 take semphone

优先级反转实验,使用信号量实现【RT-Thread学习笔记 5】相关推荐

  1. (实验38)单片机,STM32F4学习笔记,代码讲解【SD卡实验】【正点原子】【原创】

    文章目录 其它文章链接,独家吐血整理 实验现象 主程序 SD卡驱动程序 代码讲解 其它文章链接,独家吐血整理 (实验3)单片机,STM32F4学习笔记,代码讲解[按键输入实验][正点原子][原创] ( ...

  2. (实验39)单片机,STM32F4学习笔记,代码讲解【FATFS实验】【正点原子】【原创】

    文章目录 其它文章链接,独家吐血整理 实验现象 主程序 FATFS初始化程序 代码讲解 其它文章链接,独家吐血整理 (实验3)单片机,STM32F4学习笔记,代码讲解[按键输入实验][正点原子][原创 ...

  3. (实验55)单片机,STM32F4学习笔记,代码讲解【网络通信实验】【正点原子】【原创】

    文章目录 其它文章链接,独家吐血整理 实验现象 主程序 LWIP初始化程序 代码讲解 其它文章链接,独家吐血整理 (实验3)单片机,STM32F4学习笔记,代码讲解[按键输入实验][正点原子][原创] ...

  4. (实验37)单片机,STM32F4学习笔记,代码讲解【内存管理实验】【正点原子】【原创】

    文章目录 其它文章链接,独家吐血整理 实验现象 主程序 内存池初始化程序 代码讲解 其它文章链接,独家吐血整理 (实验3)单片机,STM32F4学习笔记,代码讲解[按键输入实验][正点原子][原创] ...

  5. (实验4)单片机,STM32F4学习笔记,代码讲解【串口实验】【正点原子】【原创】

    文章目录 其它文章链接,独家吐血整理 实验现象 主程序 串口中断程序 代码讲解 其它文章链接,独家吐血整理 (实验3)单片机,STM32F4学习笔记,代码讲解[按键输入实验][正点原子][原创] (实 ...

  6. (实验6,实验7)单片机,STM32F4学习笔记,代码讲解【看门狗实验】【正点原子】【原创】

    文章目录 其它文章链接,独家吐血整理 实验现象(实验六) 主程序(实验六) 独立看门狗初始化程序(实验六) 代码讲解(实验六) 实验现象(实验七) 主程序(实验七) 窗口看门狗初始化程序(实验七) 代 ...

  7. (实验50)单片机,STM32F4学习笔记,代码讲解【串口IAP实验】【正点原子】【原创】

    文章目录 ❤2023重新理解记录 其它文章链接,独家吐血整理 实验现象 主程序 IAP初始化程序 代码讲解 文章目录 ❤2023重新理解记录 其它文章链接,独家吐血整理 实验现象 主程序 IAP初始化 ...

  8. (实验12)单片机,STM32F4学习笔记,代码讲解【OLED显示实验】【正点原子】【原创】

    文章目录 其它文章链接,独家吐血整理 实验现象 主程序 OLED初始化程序 代码讲解 其它文章链接,独家吐血整理 (实验3)单片机,STM32F4学习笔记,代码讲解[按键输入实验][正点原子][原创] ...

  9. (实验15)单片机,STM32F4学习笔记,代码讲解【RTC实时时钟实验】【正点原子】【原创】

    文章目录 其它文章链接,独家吐血整理 实验现象 主程序 RTC初始化程序 代码讲解 其它文章链接,独家吐血整理 (实验3)单片机,STM32F4学习笔记,代码讲解[按键输入实验][正点原子][原创] ...

最新文章

  1. (C++)堆排序的3个关键函数
  2. 泛型(派生子类,泛型通配符,类型擦除)
  3. ios java aes128_iOS AES128加密解密的两种模式(CBC和ECB)
  4. 学校为什么要单位接收函_温江会计培训学校:为什么要学习会计实操
  5. php abstract
  6. 【PAT乙级】1020 月饼 (25 分)
  7. linux各个服务器的软件自启动
  8. frestadmin多样式响应式后台HTML模板
  9. nlp-tutorial代码注释3-3,双向RNN简介
  10. VC++显示文件或文件夹属性
  11. 使用jdbc连接数据库的步骤
  12. “一夜成名”需要多久?他花了20年!
  13. 学习matlab(十八)——小波分析
  14. 微信数据解密-dat查看
  15. mysql设置id起点_mysql自增ID起始值修改方法
  16. c++ 因数分解(递归)
  17. MAX6675 K型热电偶读温度
  18. 895计算机专业基础,北京工业大学2020年考研895计算机学科专业基础考试大纲
  19. 关于安装Ubuntu20.04重启后反复进入bios界面
  20. Django + Pytest搭建在线自动化测试平台

热门文章

  1. dxf转nc代码软件_Window绝赞的6款软件,效率加班党必备,快到惊人!
  2. 开源项目选择许可证License
  3. Linux创建anaconda-navigator快捷图标并固定在dock上
  4. 浪潮2012年服务器型号,服务器_2012年服务器产品介绍.pdf
  5. python函数对变量的作用_Python 包、模块、函数、变量作用域
  6. 在html页面中使用模板继承,HTML静态模板的继承
  7. android studio学习----通过github的URL怎么导入新的工程
  8. spine 2.1.27 Pro 叠加方式(Blending)
  9. #pragma onece
  10. pearson, kendall 和spearman三种相关分析方法的区别