当前位置:首页 > 嵌入式 > 嵌入式软件

small rtos5l是一款专门为80c5l系列单片机设计的实时操作系统(实际上应该称其为实时内核),大部分代码用c语言编写,易于移植,十分适合于资源紧张的8位机。同时,它也是学习嵌入式操作系统原理极好的入门材料。本人就是在学习完smallrtos5l的基础上进一步学习了著名的uc/0s-ii,受益颇多。   1 问题描述   在将smau rtos51应用于实验室某项目时,发现了一个奇怪的问题。简单说来,就是一个以无条件方式申请消息的任务竟然在没有取到消息的情况下,以指示“等待超时”的代码返回了。   在这里,首先解释一下任务申请消息的两种方式:无条件方式和超时方式。所谓五条件方式是指任务申请消息时,如果暂时没有消息可取,则任务将一直等待消息,直至取到为止;而超时方式是指任务等待消息是有时间限制的,超过所设定的最大时间,即便没有取到消息,函数也可以正常返回,只是返回值不是消息,而是“超时代码”(此方式可以防止任务因取不到消息而被永久性挂起)。可见,如果任务以无条件方式申请消息,那么函数若能够返回,则说明任务一定是取到消息了,而返回值又怎么可能是“等待超
时”呢?经过仔细分析smallrts5l的源代码,找到了问题产生的根源。   假定有任务idx以超时方式调用osqpend()函数申请消息。osqpend()函数首先会把idx放到此消息队列的等待任务表中,然后再去判断队列中是否有消息。最佳情况是队列中确实有消息,则osqpend()再把idx从此消息队列的等待任务表中删除,接着osqpend()返回,任务取到消息。   此刻,假定消息队列中设有消息。那么,osqpend()就会调用osclearsigna1(osrunningtaskid())和os-sched()这两个系统函数,迫使idx进入休眠态,同时调度器调度下一个最高优先级的就绪任务来运行。假定任务idy被选中,且idy在运行中通过调用osqintpost()函数向此消息队列发送了一则消息。则osintpost()将把所有等待这个消息队列的任务中优先级最高的那个任务唤醒,并且把它从该消息队列的等待任务表中删除,假定它就是idx。  当任务idy进入休眠态后,操作系统才会调度idx来运行。于是idx从上次被强迫休眠的地方开始运行,即从osqpend()函数中紧接着ossched()的那条指令开始执行。具体来说,osqpend()将首先查看idx是否满足超时条件(用来判断任务是因为等待超时被唤醒的还是因为确实取到消息而被唤醒的),若超时时限尚未到达,osqpend()再接着检查消息队列中是否已经有了消息。根据上面的假定,可以知道任务idx确实是因为取到消息而被唤醒的。于是,osqpend()把idx从此消息队列的等待任务表中删除,osqpend()正常返回。这样,任务idx取到消息,接着运行。   以上都没有什么问题,但是,有一种情况被忽略了,而正是这种情况的出现导致了任务idx被长时间挂起,就算队列中有消息存在,idx也无法被唤醒,只能等到其超时为止。   为讨论方便,不妨仍按上述假定情况来分析。当任务idx被唤醒且idy进入休眠状态后,系统必将调度下一个优先级最高的就绪任务来运行。在前面,认为这个任务就是idx,然而此时,假定它是另一个比idx优先级更高的任务idz(因为有可能是中断把idz唤醒的,所以中断退出时,操作系统强制idy进入休眠态,转而调度idz运行)。非常巧合的是,idz在运行的过程中向同一个消息队列也申请了消息。由于之前idy已经向消息队列发送过一条消息,则idz将正常取到此条消息。于是,消息队列中的消息数减为o(buf[0]==0)。在任务idz进入休 眠后,任务idx被操作系统调入cpu运行。同样,函数osqpend()首先查看idx是否等待超时。如果没有超时再检查消息队列中是否存在消息。注意到先前已经假定消息被任务idz给取走了,所以检查的结果当然是队列中不存在消息。idx就只好再次进入休眠,函数ossched()调度别的任务运行。   于是问题出现了。idx是因为暂时取不到消息而被挂起的,但此时这个消息队列的等待任务表中已经投有idx的踪影了,它之前就已被那个发送消息的idy在osqintpost()函数中给删除了。   结果,即使后面有任务再次向队列中发送消息,idx也取不到了,因为消息发送函数osqintpost()已经无法从消息队列的等待任务表中找到idx了,它将被长时间挂起,直至超时。也就是说,任务idx明明可以取到消息的,却取不到,最后只能以指示其等待超时的代码返回。   这还是一种相对来说不太严重的错误,无非就是任务没取到消息,以超时返回而已.如果任务idx以无条件方式申请消息,而又恰恰发生了上面的情况,会有什么样的后果呢?由于osqpend()函数自身的特性,所谓五条件等待就是把超时时间设为0。结果任务idx被唤醒后,osqpend()必然会检测到其已超时,然后又会检测到队列中没有消息,所以就必然以“超时代码”返回。结果就发生了文章开头所说的一幕;一个必须在取到消息后才能返回的任务,居然在没有取到消息的情况下以指示其等待超

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

摘要:真空系统是冻干机的重要组成部分之一,冻干过程中,制品中的水分只有在一定的真空状态下才能进行升华,达到干燥的目的。真空系统的运行效果将直接影响冻干制剂产品的质量和生产周期。鉴于此,对冻干机真空系统常见故障的原因与解决...

关键字: 常见故障 原因分析 解决方法

摘要:分析了影响铅碳储能电站收益的多种因素,并提出了解决方法,达到了大幅提高铅碳储能电站收益的目的。

关键字: 铅碳储能电站 影响因素 解决方法

摘要:针对某水电站机组下导油槽存在的甩油及油雾外溢现象,技术人员对机组运行过程中存在的技术问题进行了分析,并提出了解决方法。

关键字: 下导油槽密封盖 原因分析 解决方法

摘要:小岩头水电站装机容量3×43.33MW,采用混流式机组,投产后发现3台调速器存在不同程度的非周期性抽动问题,影响了机组的稳定运行,经反复检测、试验后找到了导致出现该问题的原因,通过增加调速器机械柜柜体接地线后,调速...

关键字: 水轮发电机组 调速器抽动 解决方法

摘要:分析了影响铅碳储能电站收益的多种因素,并提出了解决方法,达到了大幅提高铅碳储能电站收益的目的。

关键字: 收益 影响因素 解决方法

摘要:针对某水电站机组下导油槽存在的甩油及油雾外溢现象,技术人员对机组运行过程中存在的技术问题进行了分析,并提出了解决方法。

关键字: 油雾外溢 原因分析 解决方法

摘要:小岩头水电站装机容量3×43.33Mw,采用混流式机组,投产后发现3台调速器存在不同程度的非周期性抽动问题,影响了机组的稳定运行,经反复检测、试验后找到了导致出现该问题的原因,通过增加调速器机械柜柜体接地线后,调速...

关键字: 水轮发电机组 调速器抽动 解决方法

摘 要:基于高速发展的物联网信息技术,通过智能控制制造和质量管理的物联网技术,给出了向自动化、智能化和物联化靠拢的电子元器件制造业进行智能、精细控制和质量监督检测、数据汇总的解决方法。

关键字: 物联网 电子元器件制造业 质量管理 解决方法

  本文主要搭建一个多生理参数测量系统的数据处理平台,在FPGA中嵌入一个32位Nios II软核处理器,用于控制数据的传输、存储及显示。主要完成了此数据处理平台硬件系统的定制及编写相应程序,以控制数

关键字: NIOS ii 生理

据9月9日消息,索尼Xperia 5 Ⅱ将于9月17日正式发布。 该机现已通过FCC认证,FCC文件显示索尼Xperia 5 Ⅱ配备的充电器型号为Sony UCH32,支持18W快充。

关键字: xperia 5 1 ii
关闭
关闭