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. 车牌识别LPR(六)-- 字符分割

    第六篇:字符分割 在知道了车牌字符的规律之后,可以根据车牌的特点对字符进行分割.一般最容易想到的方法就是根据车牌投影.像素统计特征对车牌图像进行字符分割的方法.是一种最常用的.最基本的.最简单的车牌字 ...

  2. WCF-学习笔记概述之计算服务(1)

    关于WCF的介绍,在此不再赘述,其他地方应有尽有.直接开始实例,第一个实例以一个简单的计算服务为例,本人是学习了蒋金楠的<WCF全面解析>. 1.构建解决方案 Interface:用于定义 ...

  3. BZOJ 3123 森林(函数式线段树)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=3123 题意: 思路:总的来说,查询区间第K小利用函数式线段树的减法操作.对于两棵树的合并 ...

  4. poj 3101 Astronomy (java 分数的最小公倍数 gcd)

    题目链接 要用大数,看了别人的博客,用java写的. 题意:求n个运动周期不完全相同的天体在一条直线上的周期. 分析:两个星球周期为a,b.则相差半周的长度为a*b/(2*abs(a-b)),对于n个 ...

  5. 使用 google gson 转换Timestamp为JSON字符串

    package com.test.base; import java.lang.reflect.Type; import java.sql.Timestamp; import java.text.Da ...

  6. maven常用构建命令

    mvn -v 查看maven版本 compile   编译项目 install   将项目加入到本地仓库中 clean   删除target test    测试 package     打包

  7. IIS与ASP.NET中的队列

    一.IIS:应用程序池队列(Application pool queue,位于HTTP.SYS) 这是请求到达IIS后遇到的第一个队列,http.sys收到请求后会将请求放入对应的应用程序池队列,这样 ...

  8. UVa 10294 (Pólya计数) Arif in Dhaka (First Love Part 2)

    Burnside定理:若一个着色方案s经过置换f后不变,称s为f的不动点,将置换f的不动点的数目记作C(f).等价类的数目等于所有C(f)的平均值. 一个项链,一个手镯,区别在于一个能翻转一个不能,用 ...

  9. js判断浏览器类型和内核

    function judge() { var sUserAgent = navigator.userAgent.toLocaleLowerCase(); var isLinux = (String(n ...

  10. LICEcap 简洁易用的动画屏幕录制软件

    LICEcap 简洁易用的动画屏幕录制软件 LICEcap 捕捉屏幕的区域并保存为gif动画(便于网络发布)或lcf格式(见下). LICEcap 直观易用,功能灵活,支持 Windows 和 OSX ...