搜索
bottom↓
回复: 12

rtx 写的真有那么牛!!!???

[复制链接]

出0入0汤圆

发表于 2014-6-2 16:37:39 | 显示全部楼层 |阅读模式
本帖最后由 myxiaonia 于 2014-6-2 20:57 编辑

之前看其手册和坛友讨论,觉得必须好好研究其优越性,这段时间一直在看rtx的源码,情况似乎有些不尽人意


不说之前对membox的alloc和free函数封皮的疑问,现在看到mutex部分,疑问更加大了???

  1. OS_RESULT rt_mut_release (OS_ID mutex)
  2. {
  3. ...
  4.   /* Remove mutex from task mutex owner list. */
  5.   p_mlnk = os_tsk.run->p_mlnk;
  6.   if (p_mlnk == p_MCB) {
  7.     os_tsk.run->p_mlnk = p_MCB->p_mlnk;
  8.   }
  9.   else {
  10.     while (p_mlnk) {
  11.       if (p_mlnk->p_mlnk == p_MCB) {
  12.         p_mlnk->p_mlnk = p_MCB->p_mlnk;
  13.         break;
  14.       }
  15.       p_mlnk = p_mlnk->p_mlnk;
  16.     }
  17.   }

  18.   /* Restore owner task's priority. */
  19.   prio = os_tsk.run->prio_base;
  20.   p_mlnk = os_tsk.run->p_mlnk;
  21.   while (p_mlnk) {
  22.     if (p_mlnk->p_lnk && (p_mlnk->p_lnk->prio > prio)) {
  23.       /* A task with higher priority is waiting for mutex. */
  24.       prio = p_mlnk->p_lnk->prio;
  25.     }
  26.     p_mlnk = p_mlnk->p_mlnk;
  27.   }
  28.   os_tsk.run->prio = prio;
  29.   if (p_MCB->p_lnk != NULL) {
  30. ...                                        //这段代码段已忽略------互斥量释放给其等待任务,这个等待任务获得了这个互斥量
  31.   }
  32.   else {
  33.     /* Check if own priority lowered by priority inversion. */
  34.     if (rt_rdy_prio() > os_tsk.run->prio) {
  35.       rt_put_prio (&os_rdy, os_tsk.run);
  36.       os_tsk.run->state = READY;
  37.       rt_dispatch (NULL);
  38.       os_tsk.run->ret_val = OS_R_OK;
  39.     }
  40.   }

  41. }
复制代码


这个释放互斥量的链表操作一点都不简练,可以使用二级指针嘛,之前看到linus大神批判一个链表删除操作的问题,一模一样;然后是优先级恢复,怎么也应该先判断下释放的互斥量任务列表有没有导致优先级变化嘛;而且这里2个遍历互斥量链表操作,难道就不能合并在一起???优化工作很不到位啊
最后这个检查更是让人觉得笑掉大牙,这个互斥量都没有等待的任务链表,怎么可能会有优先级变化呢,更不要说降低了,实在是太不严谨了!!!!



呼唤wuzhujian大神答疑解惑

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2014-6-2 16:47:17 | 显示全部楼层
以前不懂系统的时候用过这个,后来玩ucos

出0入0汤圆

 楼主| 发表于 2014-6-2 16:51:00 | 显示全部楼层
DWDM 发表于 2014-6-2 16:47
以前不懂系统的时候用过这个,后来玩ucos

可有对着两个系统的研究???网上说ucos2,内核效率绝对杠杠的,只是没有对cm3系列优化过,如果这个rtx评估到最后感觉不好,再去评估下ucos2把,,,,freertos又怎么样呢?

出100入101汤圆

发表于 2014-6-2 17:02:27 | 显示全部楼层
有批评才有进步,学习!

出0入0汤圆

发表于 2014-6-2 17:09:17 | 显示全部楼层
myxiaonia 发表于 2014-6-2 16:51
可有对着两个系统的研究???网上说ucos2,内核效率绝对杠杠的,只是没有对cm3系列优化过,如果这个rtx ...

哈哈,我一直在盯着你的笔记呢?不过话说对RTX一窍不通,没时间去折腾啊,UCOS2和UCOS3都用过,谈不上精通,基本跑着做产品问题是不大了;但依然不太想用,个人不喜欢掌控不住的东西;可能是早年写裸奔写多了的程序洁癖吧

出0入0汤圆

 楼主| 发表于 2014-6-2 17:12:58 | 显示全部楼层
kinsno 发表于 2014-6-2 17:09
哈哈,我一直在盯着你的笔记呢?不过话说对RTX一窍不通,没时间去折腾啊,UCOS2和UCOS3都用过,谈不上精 ...

这不是在深入学习么,嘿嘿

出0入0汤圆

发表于 2014-6-2 18:50:51 | 显示全部楼层
rtx的线程,有可能同时位于2个链表中:
1> 信号量、互斥量、队列等的等待链表;
2> 延时的计时链表。

因为有2个同时存在的双向链表,所以要设计2组指针,分别用于这2个链表的操作。

互斥量的主要应用场合是:保护一段代码互斥的访问。所以,一样有等待线程链表。
信号量的主要应用场合是:保护数据的互斥访问。所以,很多时候,互斥量与信号量可以通用。

但这二者是有区别的。

出0入0汤圆

发表于 2014-6-2 19:08:57 | 显示全部楼层
搬凳子学习。。。。。。。。。

出0入0汤圆

 楼主| 发表于 2014-6-2 20:07:32 | 显示全部楼层
wuzhujian 发表于 2014-6-2 18:50
rtx的线程,有可能同时位于2个链表中:
1> 信号量、互斥量、队列等的等待链表;
2> 延时的计时链表。

确实如此,从TCB结构体中可以看到这2个双向链表的4个指针

之前这个函数的第3个代码 段,很明显这个互斥量没有等待任务,因此当前任务必定不会有优先级变化的疑问,所以这个代码段完全可以去掉,是这样的道理吗?

出0入0汤圆

发表于 2014-6-3 12:02:10 | 显示全部楼层
raw-os的mutex的逻辑严谨性是目前rtos中几乎是最严谨的,mutex的逻辑是内核中最复杂的,因为涉及到优先级反转的重大问题。

出0入0汤圆

发表于 2014-6-4 12:26:40 | 显示全部楼层
顶一个

出0入0汤圆

 楼主| 发表于 2014-6-24 21:29:02 | 显示全部楼层
本帖最后由 myxiaonia 于 2014-6-24 21:30 编辑

这是最后修改的rt_mut_release函数,又修改了当释放互斥量的等待任务调度回来和当前任务运行的情况,原来的思路还是不清啊,只需要当前任务和此调度任务进行互相比较优先级即可,大家看看是不是简洁不少啊
  1. OS_RESULT rt_mut_release (OS_ID mutex) {
  2.   /* Release a mutex object */
  3.   P_MUCB p_MCB = mutex;
  4.   P_TCB  p_TCB;
  5.   P_TCB  prun = os_tsk.run;

  6.   if (p_MCB->level == 0 || p_MCB->owner != prun) {
  7.     /* Unbalanced mutex release or task is not the owner */
  8.     return (OS_R_NOK);
  9.   }
  10.   if (--p_MCB->level != 0) {
  11.     return (OS_R_OK);
  12.   }

  13.   /* Remove mutex from task mutex owner list. */
  14.   {
  15.           P_MUCB *p = &prun->p_mlnk;
  16.           do
  17.           {
  18.                   if (*p == p_MCB) {
  19.                         *p = (*p)->p_mlnk;break;
  20.                   }
  21.                   else
  22.                   {
  23.                           p = &(*p)->p_mlnk;
  24.                   }
  25.           }while(*p);
  26.   }

  27.   if (p_MCB->p_lnk != NULL) {
  28.     /* Restore owner task's priority. */
  29.     if(p_MCB->p_lnk->prio >= prun->prio_base)
  30.     {
  31.           U8 prio = prun->prio_base;
  32.             P_MUCB  p_mlnk = prun->p_mlnk;
  33.             while (p_mlnk != NULL) {
  34.                   if (p_mlnk->p_lnk != NULL && (p_mlnk->p_lnk->prio > prio)) {
  35.                     /* A task with higher priority is waiting for mutex. */
  36.                     prio = p_mlnk->p_lnk->prio;
  37.                   }
  38.                   p_mlnk = p_mlnk->p_mlnk;
  39.             }
  40.             prun->prio = prio;
  41.     }
  42.     /* A task is waiting for mutex. */
  43.     p_TCB = rt_get_first ((P_XCB)p_MCB);
  44.     rt_rmv_dly (p_TCB);
  45.     /* A waiting task becomes the owner of this mutex. */
  46.     p_MCB->level  = 1;
  47.     p_MCB->owner  = p_TCB;
  48.     p_MCB->p_mlnk = p_TCB->p_mlnk;
  49.     p_TCB->p_mlnk = p_MCB;
  50.     p_TCB->ret_val = OS_R_MUT;
  51.         prun->ret_val = OS_R_OK;
  52.     /* Priority inversion, check which task continues. */
  53.     rt_dispatch (p_TCB);
  54.     return (OS_R_OK);
  55. }
复制代码

出0入0汤圆

发表于 2014-6-25 09:52:26 | 显示全部楼层
kinsno 发表于 2014-6-2 17:09
哈哈,我一直在盯着你的笔记呢?不过话说对RTX一窍不通,没时间去折腾啊,UCOS2和UCOS3都用过,谈不上精 ...

我现在也喜欢裸奔
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 03:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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