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,在它适用的情况下,它工作得很好。

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

    关注

    6043

    文章

    44617

    浏览量

    638000
  • RTOS
    +关注

    关注

    22

    文章

    819

    浏览量

    119854
  • c编程
    +关注

    关注

    0

    文章

    94

    浏览量

    29374

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

文章出处:【微信号:eedesigner,微信公众号:eeDesigner】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

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

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

    是否有一种方法来确定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

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

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

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

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

    在keil中添加STC型号的3种方法

    在keil中添加STC型号的3种方法
    发表于 09-09 16:22 76次下载

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

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

    介绍两种方法来避免正在执行中的任务中断

    有时我们也许会有这样的需求:要执行一个命令或者脚本,但是需要几个小时甚至几天。这就要考虑一个问题,就是中途断网或出现其他意外情况,执行的任务中断了怎么办?可以把命令或者脚本丢到后台运行,不过也不保险。下面就介绍两种方法来避免这样的问题发生。
    的头像 发表于 02-09 08:56 6281次阅读
    介绍两<b class='flag-5'>种方法来</b>避免正在执行中的任务中断

    种方法来判断电路中正负极资料下载

    电子发烧友网为提供几种方法来判断电路中正负极资料下载的电子资料下载,更有其他相关的电路图、源代码、课件教程、中文资料、英文资料、参考设计、用户指南、解决方案等资料,希望可以帮助到广大的电子工程师们。
    发表于 04-04 08:43 1027次下载
    几<b class='flag-5'>种方法来</b>判断电路中正负极资料下载

    介绍3种方法跨时钟域处理方法

    介绍3跨时钟域处理的方法,这3种方法可以说是FPGA界最常用也最实用的方法,这三
    的头像 发表于 09-18 11:33 2.2w次阅读
    介绍<b class='flag-5'>3</b><b class='flag-5'>种方法</b>跨时钟域处理<b class='flag-5'>方法</b>

    识别电路的10种方法

    对较复杂的电路应先将原电路简化为等效电路,以便分析和计算。识别电路的方法很多,现结合具体实例介绍十种方法
    发表于 02-08 16:20 243次下载
    识别电路的10<b class='flag-5'>种方法</b>

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

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

    linux网络配置的3种方法

    Linux是一流行的操作系统,广泛应用于服务器和网络设备中。Linux系统提供了多种方法来配置网络连接,使得网络设置更加灵活和可定制。本文将会介绍Linux网络配置的三种方法,包括命令行方式
    的头像 发表于 11-27 14:33 4522次阅读