0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

单片机资源少但是不能拒绝RTOS

5RJg_mcuworld 来源:smallrtos源码 陈明计 作者:smallrtos源码 陈明 2018-03-19 15:10 次阅读

对于搞单片机的特别用8051系列工程师来说,谈到单片机的RTOS,很多时候会问一句:“为什么要用RTOS?单片机就这一点资源,使用RTOS能保证效率吗?”

对于这个问题,我会反问:“你用单片机的目的是什么?是为了用单片机的C编程,单片机的汇编编程甚至于用单片机的二进制指令编程?”上个世纪80年代,工程师用二进制指令给Z80编程,现在还有谁在用?现在还有人死抱着汇编不放,但越来越多的人工程师使用C编程(我起初也是使用汇编的),为什么?因为我们的目的是在有限的时间甚至是不充足的时间内把项目保质保量的完成!使用什么工具和方法是次要的(如果你的项目以成本放在第一位,则另当别论,这时,也是要考虑开发时间的)。时间就是金钱啊,一个产品在单片机上增加些许成本是可以接受的。况且,使用8051系列单片机时,单片机资源也常有富余,CPU一般情况也只是空转,这就为它使用RTOS创造了条件。

那么,使用RTOS的好处呢?我举一个例子吧。假设我们编一个串行通讯程序,通讯协议如下:

数据包长度为NBYTE,起始字节为STARTBYTE1,STARTBYTE2,最后一个字节为检验和,中间字节不可能出现连续出现STARTBYTE1,STARTBYTE2。

第一种方法,在中断中处理协议:

unsigned char Buf[NBYTE-2];bit GetRight=0;

void comm(void) interrupt 4//"串行口中断"{

static unsigned char Sum,Flag=0,i;

unsigned char temp;

if(RI==1)

{

RI=0;

temp=SBUF;

switch(Flag)

{

case 0:

if(temp==STARTBYTE1)

{

Flag=1;

}

break;

case 1:

if(temp==STARTBYTE2)

{

Sum=STARTBYTE1+STARTBYTE2;

i=0;

Flag=2;

break;

}

if(temp==STARTBYTE1) break;

Flag=0;

break;

case 2:

if(temp==STARTBYTE1)

{

Flag=3;

break;

}

Sum+=temp;

if((i>=(NBYTE-3))&&Sum==0)

{

GetRight=1;

Flag=0;

break;

}

Buf[i++]=temp;

break;

case 3:

if(temp==STARTBYTE2)

{

Sum=STARTBYTE1+STARTBYTE2;

Flag=2;

i=0;

break;

}

Sum+=STARTBYTE1;

if((i>=(NBYTE-3))&&Sum==0)

{

GetRight=1;

Flag=0;

break;

}

Buf[i++]=STARTBYTE1;

if(temp==STARTBYTE1)

{

break;

}

Sum+=temp;

if((i>=(NBYTE-3))&&Sum==0)

{

GetRight=1;

Flag=0;

break;

}

Buf[i++]=temp;

Flag=2;

break;

}

}}

第二种方法,使用队列中断函数:

void comm(void) interrupt 4//"串行口中断"{

if(RI==1)

{

RI=0;

SBUF 入队;

}}

主程序不断调用的函数:

unsigned char Buf[NBYTE-2];

unsigned char ReadSerial(unsigned char *cp){

unsigned char i;

unsigned char temp,Sum;

temp=队列中数据个数;

if(temp<(NBYTE)) return 0;

出队 temp;

if(temp!=STARTBYTE1) return 0;

temp=队列首字节;

if(temp!=STARTBYTE2) return 0;

出队 temp;

sum=STARTBYTE1+STARTBYTE2;

for(i=0;i

{

temp=队列首字节;

if(temp==STARTBYTE1)

{

temp=队列次首字节;

if(temp==STARTBYTE2) return 0;

}

出队 temp;

*cp++=temp;

Sum+=temp;

}

temp=队列首字节;

Sum+=temp;

if(Sum!=0) return 0;

出队 temp;

return 1;}

第三种方法,使用RTOS中断函数:

void comm(void) interrupt 4//"串行口中断"{

OS_INT_ENTER();

if(RI==1)

{

RI=0;

OSIntSendSignal(RECIVE_TASK_ID);

}

OSIntExit();}

ID为RECIVE_TASK_ID的任务

void Recuve(void){

unsigned char temp,temp1,Sum,i;

OSWait(K_SIG,0);

temp=SBUF;

while(1)

{

while(1)

{

OSWait(K_SIG,0);

temp1=SBUF;

if((temp==STARTBYTE1)&&(temp1==STARTBYTE2)) break;

temp=temp1;

}

Sum=STARTBYTE1+STARTBYTE2;

OSWait(K_SIG,0);

temp=SBUF;

for(i=0;i

{

OSWait(K_SIG,0);

temp1=SBUF;

if((temp==STARTBYTE1)&&(temp1==STARTBYTE2))

{

OSWait(K_SIG,0);

temp=SBUF;

i=-1;

Sum=STARTBYTE1+STARTBYTE2;

continue;

}

Buf[i]=temp;

Sum+=temp;

temp=temp1;

}

Sum+=temp1;

if(Sum==0) OSSendSignal(命令解释任务 ID);

}}

以下为这几种方法的比较:

可读性和编程容易性方面,第三钟方法最好(如果允许使用goto语句,程序更加简单易读),第二种次之(因为要编队列程序),第一种最差。如果协议更加复杂,这方面更加明显。程序简单易读,自然出错机会小了。

RAM占用方面,第三种方法较少,第二种最多(因为队列占用大量空间),第一种最少。

中断执行时间方面,第三种方法最长,第二种最短,第一种较长。

从功能方面,第三种方法最强,它还可以进行超时处理(虽然例子程序没有),其它方法均不行。

如果数据来的太快,命令处理程序来不及处理,三种方法处理方式不太一样,第一种和第三种方法类似:丢弃以前数据,第二种则是丢弃后到的数据。而且,第二种方法必须等命令处理程序完成后才处理下一个数据包,而第一种和第三种方只需命令处理程序将数据收取后就可处理下一个数据包。也就是说,第一种和第三种与命令处理程序并行处理,第二种方法为串行处理。

现在,一般情况下,开发的效率第一,执行的效率(包括执行时间和资源占用)第二。在这种情况下,降低些许效率换取开发的效率的较大提高,何乐而不为?何况,单个模块的执行的效率高不等于整个程序执行效率高。例如,如果程序需要等待一段时间,一般用程序延时或定时器延时。无论何种方法,CPU不再处理其它工作,效率很低。而用RTOS,等待的时候CPU可以处理其它工作,效率得到提高。

以下摘自《uC/OS-II--源码公开的实时嵌入式操作系统

“实时内核也称为实时操作系统或RTOS。使用它使得实时应用程序的设计和扩展变得容易。不需要大的改动就可以增加新的功能。通过应用程序分割为若干独立的任务,RTOS使得应用程序的设计过程大为简化。使用可剥夺性的内核时,所有时间要求苛刻的事件都得到了尽可能快捷、有效的处理。通过有效的服务;如信号量、邮箱、队列、延时、超时等;RTOS使得资源得到更好的利用。

“如果应用项目对额外的需求可以承受,应该考虑使用实时内核。这些额外的需求是:内核的价格,额外ROM/RAM开销,2至4百分点的CPU额外负担。

“还有没提到的一个因素是使用实时内核增加的价格成本。在一些应用中,价格就是一切,以至于对使用RTOS连想都不敢想。”

总而言之,适用的就是最好的,不要拒绝RTOS,在它适用的情况下,它工作得很好。(来源:smallrtos源码 陈明计


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    5997

    文章

    43948

    浏览量

    620544
  • RTOS
    +关注

    关注

    20

    文章

    773

    浏览量

    118773
  • 汇编
    +关注

    关注

    2

    文章

    214

    浏览量

    25732

原文标题:单片机就那点资源,为啥还要用RTOS?

文章出处:【微信号:mcuworld,微信公众号:嵌入式资讯精选】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    利用Small RTOS51的肠营养液输液系统研究

    的嵌入式操作系统为数不多。其中,Keil自带的RTX51没有源代码,使用起来很不方便;uC/OSII虽然有源代码,也有移植成的例子,但是,它对于51 系列单片机系统的资源占用过大,需要外扩RAM,而且
    发表于 11-30 09:48

    单片机系统入门讨论-RTOS

    对于一个完全没有接触过单片机系统的人,想要学习系统,应该怎样入门呢?各位有没有什么高见?还望不吝赐教!目前,我想学习RTOS,学会了之后在学习UCOS.大家有什么什么学习心得,和资料就不要藏着了,大家一起学习学习呗!
    发表于 06-21 12:21

    AVR单片机RTOS_AVRX应用

    AVR单片机RTOS_AVRX应用
    发表于 03-24 15:34

    单片机资源这么小,还要用RTOS干啥子?

    转自《嵌入式咨询精选》对于搞单片机的特别用8051系列工程师来说,谈到单片机RTOS,很多时候会问一句:“为什么要用RTOS?单片机就这一
    发表于 03-02 15:21

    在51单片机上跑RTOS有没有意义?精选资料分享

    最近看见我的一个技术交流群在讨论一个问题:在51单片机上跑RTOS有没有意义?今天就来围绕51和RTOS展开讲讲。1关于51单片机及性能和资源
    发表于 07-20 07:54

    单片机的内部资源

    要想学习单片机,需从它的内部资源和外部硬件的了解入手。1.单片机的内部资源1.1(1)Flash——程序储存空间,早期单片机是OTPROM。
    发表于 07-21 06:18

    单片机模块化设计的相关资料分享

    [导读] 为什么写本文?做公号两月,遇到一些初学单片机的同学,刚刚入手做单片机开发,还没有涉及到使用RTOS,且刚入手直接上RTOS可能会有些难度,有的使用的相对较老
    发表于 12-06 08:16

    单片机为什么要用RTOS

    对于搞单片机的特别用8051系列工程师来说,谈到单片机RTOS,很多时候会问一句:“为什么要用RTOS?单片机就这一点
    发表于 12-09 08:29

    单片机模块化设计资料分享

    [导读] 为什么写本文?做公号两月,遇到一些初学单片机的同学,刚刚入手做单片机开发,还没有涉及到使用RTOS,且刚入手直接上RTOS可能会有些难度,有的使用的相对较老
    发表于 02-14 06:37

    开源RTOS在STM32单片机中的应用

    开源RTOS在STM32单片机中的应用
    发表于 09-25 09:50 20次下载
    开源<b class='flag-5'>RTOS</b>在STM32<b class='flag-5'>单片机</b>中的应用

    单片机资源这么少为什么还要用RTOS

    对于搞单片机的特别用8051系列工程师来说,谈到单片机RTOS,很多时候会问一句:“为什么要用RTOS单片机就这一点
    发表于 07-11 17:39 1次下载
    <b class='flag-5'>单片机</b><b class='flag-5'>资源</b>这么少为什么还要用<b class='flag-5'>RTOS</b>

    51单片机上跑RTOS会有意义吗?

    最近看见我的一个技术交流群在讨论一个问题:在51单片机上跑RTOS有没有意义? 今天就来围绕51和RTOS展开讲讲。 1关于51单片机及性能和资源
    的头像 发表于 05-27 17:34 2080次阅读

    单片机:内部资源

    1.1 单片机的内部资源在这里我所讲到的单片机内部资源,和传统单片机书籍讲单片机内部结构不同,我
    发表于 11-18 10:21 39次下载
    <b class='flag-5'>单片机</b>:内部<b class='flag-5'>资源</b>

    单片机就那点资源,为啥还要用RTOS

    对于搞单片机的特别用8051系列工程师来说,谈到单片机RTOS,很多时候会问一句:“为什么要用RTOS?单片机就这一点
    发表于 11-26 14:36 1次下载
    <b class='flag-5'>单片机</b>就那点<b class='flag-5'>资源</b>,为啥还要用<b class='flag-5'>RTOS</b>?

    51单片机可以移植RTOS吗?

    说起RTOS移植,我们首先会想到32位单片机
    发表于 05-23 17:09 1411次阅读