硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2527|回复: 9
收起左侧

[μCOS-II] 为什么感觉mutex信号量没起作用

[复制链接]

20

主题

110

回帖

170

积分

初级会员

积分
170
发表于 2020-4-21 20:44:29 | 显示全部楼层 |阅读模式
本帖最后由 飛饵 于 2020-4-21 20:46 编辑

刚学了信号了,设计了个任务想看普通二值信号量的优先级反转现象,实际效果和理论一样。然后用了mutex信号量看看解决没,结果还是和原来一样。。怀疑设计二值信号量任务时那个效果根本不是优先级反转造成的。。。

不知道任务这么设计有什么问题???


三个主要任务优先级:Task1(5) > Task2(10) > Task0(15),还有个任务专门查看谁占用了资源
Task1、Task0都使用信号量,其余都没用到。创建互斥信号量给的优先级是4

代码和普通二值信号量一样,只是现在的等待、释放信号量函数换成了mutex的
  1. void TaskPrintf(void *p_arg)
  2. {
  3.         while(1)
  4.         {
  5.                 timecount = OSTimeGet();
  6.                 printf("TaskS running - count:%u time:%ums-----", count, timecount);
  7.                 printf("%s", str);
  8.                
  9.                 OSTimeDly(100); //100ms打印一次 srt 的内容,这样便可查看哪个任务占着资源
  10.         }
  11. }

  12. /*
  13. *----------- 测试任务0 ------------
  14. *
  15. *
  16. *
  17. */
  18. void Task0(void *p_arg)
  19. {
  20.         u8 err;
  21.         
  22.         while(1)
  23.         {
  24.                 count ++;timecount = OSTimeGet();
  25.                 printf("Task0 running - count:%u time:%ums \r\n", count, timecount);
  26.                 OSMutexPend(testmutex, 0, &err); //等待信号量
  27.                 str = "Task0 get the resource! \r\n"; //占有资源。

  28.                 OSTimeDly(2000);               
  29.                 OSMutexPost(testmutex);; //释放信号量
  30.         }
  31. }
  32. /*
  33. *----------- 测试任务1 ------------
  34. *
  35. *
  36. *
  37. */
  38. void Task1(void *p_arg)
  39. {
  40.         u8 err;
  41.         
  42.         while(1)
  43.         {
  44.                 count ++;timecount = OSTimeGet();
  45.                 printf("Task1 running - count:%u time:%ums \r\n", count, timecount);
  46.                 OSMutexPend(testmutex, 0, &err); //申请(等待)信号量
  47.                 str = "Task1 get the resource! \r\n";

  48.                 OSTimeDly(1000);
  49.                 OSMutexPost(testmutex);
  50.         }
  51. }

  52. /*
  53. *----------- 测试任务2 ------------
  54. *
  55. *
  56. *
  57. */
  58. void Task2(void *pdata)
  59. {
  60.         while(1)
  61.         {
  62.                 count ++;timecount = OSTimeGet();
  63.                 printf("Task2 running - count:%u time:%ums \r\n", count, timecount);
  64.                
  65.                 OSTimeDly(500);
  66.         }
  67. }
复制代码


回复

使用道具 举报

3

主题

337

回帖

346

积分

高级会员

积分
346
发表于 2020-4-21 21:38:37 | 显示全部楼层
ucos-2的mutex要指定一个优先级,此优先级要比所有调用osmutexpend的线程优先级都高才有效。
回复

使用道具 举报

20

主题

110

回帖

170

积分

初级会员

积分
170
 楼主| 发表于 2020-4-21 23:04:58 | 显示全部楼层
glory 发表于 2020-4-21 21:38
ucos-2的mutex要指定一个优先级,此优先级要比所有调用osmutexpend的线程优先级都高才有效。

mutex已经指定了优先级是4,比所有任务优先级都高了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106934
QQ
发表于 2020-4-22 00:50:37 | 显示全部楼层
1、在pend函数里面提升优先级的地方打个断点,看看执行到了没。
2、看下printf函数底层的串口打印是用的阻塞方式不,不要用DMA,串口中断,FIFO之类的操作先。


这两点没什么问题了,得分析下你的测试程序了。

回复

使用道具 举报

3

主题

337

回帖

346

积分

高级会员

积分
346
发表于 2020-4-22 08:06:30 | 显示全部楼层
想起来了,你对mutex的作用有误解。mutex的作用是这样的:
假设优先级从高到底排列:mutex,A线程,B线程,C线程;

若C线程获得了mutex,而高优先级的B线程获得执行时间也来pend该mutex,那么系统就会使C线程到达mutex的优先级别赶紧以期待它释放mutex。
而你的代码中,此时的C线程正在delay,根本没法结束;所以B线程不得不等待C线程delay结束!这就是说获得mutex之后不要delay!

评分

参与人数 1金币 +10 收起 理由
飛饵 + 10 很给力!

查看全部评分

回复

使用道具 举报

20

主题

110

回帖

170

积分

初级会员

积分
170
 楼主| 发表于 2020-4-22 13:28:40 | 显示全部楼层
eric2013 发表于 2020-4-22 00:50
1、在pend函数里面提升优先级的地方打个断点,看看执行到了没。
2、看下printf函数底层的串口打印是用的阻 ...

不太清楚具体在哪提升了优先级,是在
ptcb->OSTCBPrio = pip;                         /* Change owner task prio to PIP            */
里吗?这里执行了的。堆栈窗口里看到 pip 和 mprio 值也是正确的。
printf是阻塞的。
回复

使用道具 举报

20

主题

110

回帖

170

积分

初级会员

积分
170
 楼主| 发表于 2020-4-22 14:02:37 | 显示全部楼层
glory 发表于 2020-4-22 08:06
想起来了,你对mutex的作用有误解。mutex的作用是这样的:
假设优先级从高到底排列:mutex,A线程,B线程 ...

就是说mutex量只是让占用mutex的任务尽快结束,不是直接防止等待mutex的任务被低优任务抢占?
那这样的话,之前二值信号量任务那个现象也不是优先级反转现象吧?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106934
QQ
发表于 2020-4-22 14:42:33 | 显示全部楼层
飛饵 发表于 2020-4-22 13:28
不太清楚具体在哪提升了优先级,是在
ptcb->OSTCBPrio = pip;                         /* Change owner ...

那就是程序使用错误,没有采用正确的姿势调用互斥信号量。

根据uCOS-II API手册说明,明确禁止在互斥信号操作期间有任何挂起任务的操作。

评分

参与人数 1金币 +10 收起 理由
飛饵 + 10 很给力!

查看全部评分

回复

使用道具 举报

3

主题

337

回帖

346

积分

高级会员

积分
346
发表于 2020-4-22 17:39:23 | 显示全部楼层
飛饵 发表于 2020-4-22 14:02
就是说mutex量只是让占用mutex的任务尽快结束,不是直接防止等待mutex的任务被低优任务抢占?
那这样的 ...

请看硬汉给你找到的官方权威答案,文档不跟你讲道理,只跟你讲规则
回复

使用道具 举报

20

主题

110

回帖

170

积分

初级会员

积分
170
 楼主| 发表于 2020-4-22 19:00:19 | 显示全部楼层
glory 发表于 2020-4-22 17:39
请看硬汉给你找到的官方权威答案,文档不跟你讲道理,只跟你讲规则

谢谢,重写了程序,能明显看到现象了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-10 20:21 , Processed in 0.244507 second(s), 30 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表