http://www.amobbs.com/archiver/tid-4939669.html

——————————————————————————————————————————————————————————

发现UC/OS-III源码有一处不明白!会不会是BUG.高手过来看看!

费话不多说,上源码!

void  OS_IntQTask (void *p_arg)
{
    while (DEF_ON) {
        done = DEF_FALSE;
        while (done == DEF_FALSE) {
            if (OSIntQNbrEntries == (OS_OBJ_QTY)0u) {
               //////////////////////////////////////////////////////////////////////////////////////////////////////
               // 此处如果发生了中断,并且在中断中调用了OSSemPost
               // OSSemPost 会使用这个任务进入就绪状态,但当返回到这个任务时
               // 这个任务执行下面的代码,又自己移除了!!!!!!!
               // 我想应该在查看OSIntQNbrEntries 变量前关中断,因为这个变量的访问和下面
               // 的操作应该是一个临界段的代码。
               //////////////////////////////////////////////////////////////////////////////////////////////////////
                CPU_CRITICAL_ENTER();
                OSRdyList.NbrEntries = (OS_OBJ_QTY)0u;   /* Remove from ready list                                 */
                OSRdyList.HeadPtr    = (OS_TCB   *)0;
                OSRdyList.TailPtr    = (OS_TCB   *)0;
                OS_PrioRemove(0u);                          /* Remove from the priority table                         */
                CPU_CRITICAL_EXIT();
                OSSched();
                done = DEF_TRUE;                            /* No more entries in the queue, we are done              */
            } else {
                ts_start = OS_TS_GET();
                OS_IntQRePost();
                ts_end   = OS_TS_GET() - ts_start;          /* Measure execution time of tick task                    */
                if (ts_end > OSIntQTaskTimeMax) {
                    OSIntQTaskTimeMax = ts_end;
                }
                CPU_CRITICAL_ENTER();
                OSIntQNbrEntries--;
                CPU_CRITICAL_EXIT();
            }
        }
    }
}

clingos 发表于 2011-8-6 09:42:15

自己顶起来!

clingos 发表于 2011-8-6 09:43:29

希望喜欢OS的朋友一起来读读源码!
现在觉得有好多地方觉得不合适!

linfeng5945
发表于 2011-8-6 16:08:40

我记得,if那里应该不会产生中断把?
因为在进行调试的时候,if下面第一条指令,好像才可以设置断点。
不知道我说的对不对,楼主可以试一下

9509238
发表于 2011-8-6 17:17:48

分析得好!的确是一处bug,有楼主这个认真劲,别研究有版权争议的ucosiii了,来加入rt-thread吧!

SailJune
发表于 2011-8-6 17:24:00

说实话,我觉得ucos-ii用于一般的嵌入式开发,绰绰有余;
  3我觉得主要是时间片的添加,同一优先级多个任务,没啥必要我感觉。

clingos
发表于 2011-8-8 08:34:16

回复【4楼】9509238  
-----------------------------------------------------------------------

呵呵,RT-THREAD是个好东西,也在闲暇时间看过,有机会一定会仔细看看!

只不过相对UCOS来说,我是从它开始接触嵌入OS的,有一种说不出的感觉!

唉,都是邵贝贝惹的祸!

clingos
发表于 2011-8-8 08:38:58

回复【5楼】SailJune  
-----------------------------------------------------------------------

我和你的看法正好相反,我觉得支持时间片和同一优先级多个任务非常好,
当有多个任务时,我觉得优先级的分配比较麻烦!

ljt8015
发表于 2011-8-8 08:41:03

ucosiii 除了时间片调度  好像没有增加别的功能啊!~

clingos
发表于 2011-8-8 09:05:41

呵呵,是的!但是目前UCOS-III的各种服务差不多挺健全的,
嵌入OS该有的基本上都有了!
不过我觉得UCOS-III在实现以上功能方面没有什么新颖之处,
目前我觉得在TICK处理这块的方法还不错,值得借荐!

但是也正是这个TICK的让我觉得有点火,如果OS_TICK的数据
类型为32位的,而OS内部的所有超时处理都直接使用OSTickCtr加
上Dly的这种方法,如果系统的时钟频率为1000HZ那么这个系统运行
差不多49天后就会溢出,延时的一些服务就会出错!而UCOS-III却是
说可以使用64位的数据类型,但是查了下long long 好像是C99标准新
加的!

其它的OS也有同样的问题,但处理的方法不相同,个人觉得最好的一种
处理方法是FREERTOS,它使用了两个指针,一个正常的TICK列表指针,
一个溢出的TICK列表指针,当溢出时就放入溢出列表中,最后当然TICK
计数溢出时,此时交换下两个列表即可。而并没有依赖数据的长度!

也许是我还没有理解UCOS-III的真正用意,高手勿拍!

ljt8015
发表于 2011-8-8 09:19:19

驱动程序框架,ucos怎么一直都不增加呢!~

ffxz
发表于 2011-8-8 09:20:03

回复【9楼】clingos  
呵呵,是的!但是目前ucos-iii的各种服务差不多挺健全的,
嵌入os该有的基本上都有了!
不过我觉得ucos-iii在实现以上功能方面没有什么新颖之处,
目前我觉得在tick处理这块的方法还不错,值得借荐!
但是也正是这个tick的让我觉得有点火,如果os_tick的数据
类型为32位的,而os内部的所有超时处理都直接使用ostickctr加
上dly的这种方法,如果系统的时钟频率为1000hz那么这个系统运行
差不多49天后就会溢出,延时的一些服务就会出错!而ucos-iii却是
说可以使用64位的数据类型,但是查了下long long 好像是c99标准新
加的!
其它的os也有同样的问题,但处理的方法不相同,个人觉得最好的一种
处理方法是freertos,它使用了两个指针,一个正常的tick列表指针,
一个溢出的tick列表指针,当溢出时就放入溢出列表中,最后当然tick
计数溢出......
-----------------------------------------------------------------------

看RT-Thread的实现

clingos
发表于 2011-8-9 10:39:52

各位帮忙看看如何理解这段!

Any time delay (or timeout) on µC/OS-III is computed as a delta of the current time (OSTickCtr) and requested delay.
Therefore, as long as the input delay does not overflow the delta, it should be no artifact on the system.
In fact, the only potential function that could cause such overflow of the delta is OSTimeDlyHMSM().
To prevent that, enable OS_CFG_ARG_CHK_EN which is going to check for the appropriate range of the parameters,
since OS_OPT_TIME_HMSM_STRICT is the default option.

hiberhe
发表于 2011-8-14 10:16:33

标记一下,等看III代码时好注意

xrwgy
发表于 2011-8-15 17:07:37

回复【楼主位】clingos
-----------------------------------------------------------------------
自己读了一下代码,楼主说的有道理,确实是bug。

jeffeggs
发表于 2011-8-17 22:41:09

标记下慢慢分析

aprogramer
发表于 2011-9-17 20:45:45

Any time delay (or timeout) on µC/OS-III is computed as a delta of the current time (OSTickCtr) and requested delay.
UCOS中,任何的时间延迟或者超时  都是基于请求的延迟与当前时间(OSTickCtr)的delta计算得来的。

Therefore, as long as the input delay does not overflow the delta, it should be no artifact on the system.  
因此,只要输入的延迟没有令delta溢出,it should be no artifact on the system(系统中应该就没有与事实不符的错误)

In fact, the only potential function that could cause such overflow of the delta is OSTimeDlyHMSM().  
事实上,唯一可能引起delta溢出的潜在的函数是 OSTimeDlyHMSM().

To prevent that, enable OS_CFG_ARG_CHK_EN which is going to check for the appropriate range of the parameters,  
since OS_OPT_TIME_HMSM_STRICT is the default option.
为了阻止它发生,可以使能 OS_CFG_ARG_CHK_EN ,它会对参数的大小范围是否合适进行检查,因为OS_OPT_TIME_HMSM_STRICT 是默认的选项。

wwomee
发表于 2013-4-1 10:51:12

仔细想了下,确实存在.但是影响很小,不会导致严重问题,因为其实最坏的影响也就是."在那时候触发中断提交的内容在下一个时基执行!"

本人最近在学些ucos-iii源码,由于权限不够不能加楼主为好友,
希望楼主家我QQ316645339 讨教下ucos-iii的问题!
谢谢!

发现UC/OS-III源码有一处不明白!会不会是BUG.高手过来看看!的更多相关文章

  1. uc/os iii移植到STM32F4---IAR开发环境

    也许是先入为主的原因,时钟用不惯Keil环境,大多数的教程都是拿keil写的,尝试将官方的uc/os iii 移植到IAR环境. 1.首先尝试从官网上下载的官方移植的代码,编译通过,但是执行会报堆栈溢 ...

  2. uC/OS - III 移植 IAR平台

    关于移植uC/OS-III 网上已经有很多教程了此处只是做个记录 首先下载源码然后解压得到下面的文件: 然后在模版工程里新建各种文件夹: 最后全部都添加进工程: OK了,编译一下,惊呆了,竟然 0错误 ...

  3. 建议收藏!利用Spring解决循环依赖,深入源码给你讲明白!

    前置知识 只有单例模式下的bean会通过三级缓存提前暴露来解决循环依赖的问题.而非单例的bean每次获取都会重新创建,并不会放入三级缓存,所以多实例的bean循环依赖问题不能解决. 首先需要明白处于各 ...

  4. Go:创建新进程(os.StartProcess源码解读)

    关于如何使用go语言实现新进程的创建和进程间通信,我在网上找了不少的资料,但是始终未能发现让自己满意的答案,因此我打算自己来分析这部分源代码,然后善加利用,并且分享给大家,期望大家能从中获得启发. 首 ...

  5. [源码解析] 深度学习分布式训练框架 horovod (14) --- 弹性训练发现节点 & State

    [源码解析] 深度学习分布式训练框架 horovod (14) --- 弹性训练发现节点 & State 目录 [源码解析] 深度学习分布式训练框架 horovod (14) --- 弹性训练 ...

  6. Android HandlerThread使用介绍以及源码解析

    摘要: 版权声明:本文出自汪磊的博客,转载请务必注明出处. 一.HandlerThread的介绍及使用举例              HandlerThread是什么鬼?其本质就是一个线程,但是Han ...

  7. cJSON库源码分析

    本文采用以下协议进行授权: 自由转载-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 ,转载请注明作者及出处. cJSON是一个超轻巧,携带方便,单文件,简单的可以作为A ...

  8. 鸿蒙内核源码分析(静态链接篇) | 完整小项目看透静态链接过程 | 百篇博客分析OpenHarmony源码 | v54.01

    百篇博客系列篇.本篇为: v54.xx 鸿蒙内核源码分析(静态链接篇) | 完整小项目看透静态链接过程 | 51.c.h.o 下图是一个可执行文件编译,链接的过程. 本篇将通过一个完整的小工程来阐述E ...

  9. Spring:源码解读Spring IOC原理

    Spring IOC设计原理解析:本文乃学习整理参考而来 一. 什么是Ioc/DI? 二. Spring IOC体系结构 (1) BeanFactory (2) BeanDefinition 三. I ...

随机推荐

  1. UML与数据流图

    Ref: <数​据​库​设​计​理​论​及​应​用​(​3​)​—​—​需​求​分​析​及​数​据>http://wenku.baidu.com/link?url=hbhJFytMKT8A ...

  2. linux中proc文件系统 -- ldd3读书笔记

    1./proc 文件系统概述 /proc 文件系统是由软件创建,被内核用来向外界报告信息的一个文件系统./proc 下面的每一个文件都和一个内核函数相关联,当文件的被读取时,与之对应的内核函数用于产生 ...

  3. NDK(21)JNI的5大正确性缺陷及优化技巧(注意是正确性缺陷)

    转自 : http://www.ibm.com/developerworks/cn/java/j-jni/index.html JNI 编程缺陷可以分为两类: 性能:代码能执行所设计的功能,但运行缓慢 ...

  4. ASP.NET中如何删除最近打开的项目和文件的记录

    ASP.NTET中总是保留最近打开的项目和文件的记录,甚至是已删除的它也不删.下面介绍几种删除的方法: 第一种:建立一个bat文件,以后双击即可清除,内置代码如下: @echo off@REG Del ...

  5. 1651. Shortest Subchain(bfs)

    1651 终于A了 看这题容易想到最短路 看到错的很多 还特意注意了好几处 后来发现 必须按给出的顺序出边 想了想 这不就是BFS 然后就是各种细节 i->i+1ori->j(a[i]== ...

  6. 简单分析什么是SQL注入漏洞

    现在很多人在入侵的过程中基本都是通过SQL注入来完成的,但是有多少人知道为什么会有这样的注入漏洞呢?有的会随口说着对于字符的过滤不严造成的.但是事实是这样吗?我们学这些,不仅要知其然,更要知其所以然! ...

  7. qq互联(connect.qq.com)取用户信息的方法

    <?php //应用的APPID$app_id = "YOUR_APP_ID";//应用的APPKEY$app_secret = "YOUR_APP_KEY&quo ...

  8. apache开源项目--subversion

    Subversion exists to be universally recognized and adopted as an open-source, centralized version co ...

  9. noip2001提高组题解

    今天继续感动滚粗.第一次提交170分,不能多说. 第一题:一元三次方程 明明是寒假讲分治的时候做过的题居然还是WA而且只拿了60分,说明知识掌握实在不够牢固. 寒假做的是保留4位小数,原题只保留2位, ...

  10. DirectDraw 直接显示RGB图象的最简单实现

      来自:   #include "DDraw.h" class CDDraw { public: void CleanUp(); void DrawDIB(BITMAPINFOH ...