欢迎光临~铭华绝缘材料网

绝缘材料批发020-86210356 Mobile180-2712-1262
联系我们
服务热线
020-86210356
手机:18027121262
传真:020-86210356
邮箱:88336037@qq.com
广州市白云区 齐富路威利商务中心7楼706号
当前位置:主页 > 新闻资讯 > 公司新闻 >
Small RT耐压绝缘测试OS51中的一个典型问题及其解
浏览: 发布日期:2017-09-07


本页文章链接: http://www.ming-hua.com/FR4/xinwenzixun/gongsixinwen/12647.html
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取到消息,接着运行。


上一篇:台绝缘端子湾企业1亿美元投资推动大陆半导体封
下一篇:利用GM6801实现智能快速充绝缘件电器设计