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

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

3天内不再提示

通过实例的3种方法来告诉你使用RTOS的好处

电子工程师时间 2018-01-19 15:07 次阅读

本文标为随想曲,是说明这不是一篇结构严谨的文章,而是想到哪写到哪,希望读者能喜欢这种风格。以下为本文正文:

对于搞单片机的特别用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

第三种方法,使用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

以下为这几种方法的比较可读性和编程容易性方面,第三钟方法最好(如果允许使用goto语句,程序更加简单易读),第二种次之(因为要编队列程序),第一种最差。如果协议更加复杂,这方面更加明显。程序简单易读,自然出错机会小了。RAM占用方面,第三种方法较少,第二种最多(因为队列占用大量空间),第一种最少。中断执行时间方面,第三种方法最长,第二种最短,第一种较长。从功能方面,第三种方法最强,它还可以进行超时处理(虽然例子程序没有),其它方法均不行。如果数据来的太快,命令处理程序来不及处理,三种方法处理方式不太一样,第一种和第三种方法类似:丢弃以前数据,第二种则是丢弃后到的数据。而且,第二种方法必须等命令处理程序完成后才处理下一个数据包,而第一种和第三种方只需命令处理程序将数据收取后就可处理下一个数据包。也就是说,第一种和第三种与命令处理程序并行处理,第二种方法为串行处理。现在,一般情况下,开发的效率第一,执行的效率(包括执行时间和资源占用)第二。在这种情况下,降低些许效率换取开发的效率的较大提高,何乐而不为?何况,单个模块的执行的效率高不等于整个程序执行效率高。例如,如果程序需要等待一段时间,一般用程序延时或定时器延时。无论何种方法,CPU不再处理其它工作,效率很低。而用RTOS,等待的时候CPU可以处理其它工作,效率得到提高。以下摘自《uC/OS-II--源码公开的实时嵌入式操作系统
通过实例的3种方法来告诉你使用RTOS的好处

“实时内核也称为实时操作系统或RTOS。使用它使得实时应用程序的设计和扩展变得容易。不需要大的改动就可以增加新的功能。通过应用程序分割为若干独立的任务,RTOS使得应用程序的设计过程大为简化。使用可剥夺性的内核时,所有时间要求苛刻的事件都得到了尽可能快捷、有效的处理。通过有效的服务;如信号量、邮箱、队列、延时、超时等;RTOS使得资源得到更好的利用。“如果应用项目对额外的需求可以承受,应该考虑使用实时内核。这些额外的需求是:内核的价格,额外ROM/RAM开销,2至4百分点的CPU额外负担。“还有没提到的一个因素是使用实时内核增加的价格成本。在一些应用中,价格就是一切,以至于对使用RTOS连想都不敢想。”

总而言之,适用的就是最好的,不要拒绝RTOS,在它适用的情况下,它工作得很好。

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

    关注

    5997

    文章

    43948

    浏览量

    620544
  • RTOS
    +关注

    关注

    20

    文章

    773

    浏览量

    118773
  • c编程
    +关注

    关注

    0

    文章

    94

    浏览量

    29300

原文标题:一个实例简单明了告诉你为什么要用RTOS

文章出处:【微信号:eedesigner,微信公众号:电子工程师时间】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    【labview我告诉】用好控件的小技巧

    文本。 好了,真的有点像意识流的写法,但我真诚希望这些要点将是各位希望通过使用Picture 控件实现很美观的 LabVIEW 界面的开収者们。在我开始这个项目乊前,有人曾经告诉过我,
    发表于 12-20 10:15

    5种方法如何提高开关电源效率?

    箝位电路为代表的边缘谐振(Edge ResONance)降低开关损耗。(3通过延展开关元件的导通时间以抑制峰值电流的方法来减少固定损耗。(4)在低电压大电流的场合
    发表于 12-18 10:50

    如何学习RTOS

    还是会非常枯燥,且并不能从全局掌握整个RTOS的构成和实现。现在,我们采用一全新的方法来教大家学习一款RTOS,即不是单纯的讲里面的API如何使用,也不是单纯的拿里面的源码一句句来讲
    发表于 11-22 13:45

    是否有一种方法来确定GPIF接口在等待GPIF主机的数据时干还是空

    我用GPIF作为一个32位奴隶FIFO与2位寻址。我想知道是否有一种方法来确定GPIF接口在等待GPIF主机的数据时“干”还是空。 以上来自于百度翻译 以下为原文I am using
    发表于 05-27 14:25

    是否有一种方法来设置FX2的USB描述符

    你好,是否有一种方法来设置FX2的USB描述符,以便在我将它插入到PC的一个端口并加载驱动程序之后,如果将其插入另一个端口,则驱动程序自动加载而不需要任何用户干预。一位客户告诉我,如果USB设备在
    发表于 05-28 08:24

    有没有一种方法来配置MPLAX X从RAM运行应用程序?

    有没有一种方法来配置MPLAX X从RAM运行应用程序,而不是从Flash运行?
    发表于 09-12 06:33

    请问有另一种方法来测量RTD传感器而不使用IDAC吗?

    嗨,有没有另一种方法来测量RTD传感器而不使用IDAC?TKS。
    发表于 10-11 09:33

    labview与三菱PLC通过OPC通信,通常采用什么具体方法来握手

    如题所示,labview与三菱PLC通过OPC通信,通常采用什么具体方法来握手?比如,我想着可以通过OPC读取三菱PLC的内部变量如SM400,这个值是常1的,然后做个判断,如果该值为1,即认为握手成功,该
    发表于 08-31 23:00

    如何通过使用gm/Id的方法来简化设计运放?

     一直想通过使用gm/Id的方法来简化设计运放;  但在实际设计过程中遇到较多的问题;  然后参考了一些国外的文献,发现他们好多用此方法设计OTA;如果是常规的一些opa,可能Av的估算并不是那么
    发表于 06-24 07:37

    如何用软件的方法来实现单片机的重启?

    单片机重启可以通过哪几种方法来实现?如何用软件的方法来实现单片机的重启?
    发表于 07-14 06:15

    python执行函数的九种方法

    partialpower_2=partial(power, n=2)power_2(2)# output: 4power_2(3)# output: 9方法三:使用 eval 动态执行如果有需要动态执行
    发表于 03-29 17:43

    nodemcu sdk 151如何添加一种方法来更改UART缓冲区大小?

    nodemcu sdk 151 如何添加一种方法来更改 UART 缓冲区大小.. uart.set_buffer( id, bufsize ) eLUA 支持更改 我需要大 Rx 和小 Tx。 我
    发表于 05-09 11:16

    如何通过简单的方法来增加手机的续航时间

    通过这篇文章告诉大家如何通过简单的方法来了解手机的续航时间。
    发表于 01-19 09:20 5995次阅读

    最后一种方法来整理你的电阻器

    电子发烧友网站提供《最后一种方法来整理你的电阻器.zip》资料免费下载
    发表于 12-19 10:19 0次下载
    最后一<b class='flag-5'>种方法来</b>整理你的电阻器

    看一下通过采用HPC方法来解决汽车行业工程挑战的两个具体实例

    大家可能都知道,将Ansys解决方案与高性能计算(HPC)相结合,可带来巨大的投资回报(ROI)。接下来,让我们来看一下通过采用HPC方法来解决汽车行业工程挑战的两个具体实例
    的头像 发表于 03-12 14:29 140次阅读