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

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

3天内不再提示

使用RTOS的好处呢?

传感器技术 来源:面包板社区 作者:面包板社区 2021-01-04 11:09 次阅读

要用RTOS?单片机就这一点资源,使用RTOS能保证效率吗?”

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

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

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

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

unsignedcharBuf[NBYTE-2];bitGetRight=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;}}}

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

voidcomm(void)interrupt4//"串行口中断"{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,在它适用的情况下,它工作得很好。

责任编辑:lq

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

    关注

    6008

    文章

    44105

    浏览量

    623566
  • 编程
    +关注

    关注

    88

    文章

    3458

    浏览量

    92761
  • RTOS
    +关注

    关注

    20

    文章

    782

    浏览量

    118901

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

文章出处:【微信号:WW_CGQJS,微信公众号:传感器技术】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    FreeRtos能否直接读取Rtos的系统时钟计数器来实现延时统计,改如何读取?

    关于200~300uS的延时 1 能否直接读取Rtos的 系统时钟计数器来 实现延时统计,改如何读取? 2 通过独立的定时器中断来实现,这样感觉有点麻烦,好处是比较严谨,但是代码稍微复杂 3
    发表于 04-29 08:40

    不会RTOS,是因为你没搞懂NVIC

    管理的中断可进行中断嵌套,直译为高优先级可打断低优先级中断,然后高优先级执行完了再转回去执行低优先级中断。对于RTOS(实时操作系统)类型的OS有很大的好处,所以
    的头像 发表于 03-31 08:09 280次阅读
    不会<b class='flag-5'>RTOS</b>,是因为你没搞懂NVIC

    基于RTOS的应用进程中的典型线程

    RTOS中的关键因素是最小的中断延迟和最小的线程切换延迟。RTOS的价值在于它的响应速度或可预测性,而不是它在给定时间段内可以执行的工作量。
    发表于 03-05 09:32 211次阅读
    基于<b class='flag-5'>RTOS</b>的应用进程中的典型线程

    RTOS中的线程、进程和协程详解

    看到有小伙伴在讨论【RTOS任务属于线程还是进程】的话题,这里就来分析一下OS中的线程、进程和协程的这几个概念,同时一起看看RTOS中的任务到底属于哪一种。
    的头像 发表于 11-09 12:36 1129次阅读
    <b class='flag-5'>RTOS</b>中的线程、进程和协程详解

    RTOS相比裸机有什么优点?RTOS相比裸机更方便吗?

    RTOS相比裸机有什么优点?RTOS相比裸机更方便吗? RTOS代表实时操作系统,专门为需要高可靠性和可预测性的系统设计。相比之下,裸金属或“裸”系统的硬件或软件层最少,严重依赖开发人员的代码来处
    的头像 发表于 10-29 16:33 1152次阅读

    如何实现RTOS上的微秒级延时设计呢?

    通常RTOS系统滴答为1KHz,当然,也有100Hz,或者10KHz的情况。
    的头像 发表于 09-15 09:16 1636次阅读
    如何实现<b class='flag-5'>RTOS</b>上的微秒级延时设计呢?

    评估RTOS的几个重要指标

    RTOS的实时性能对您来说重要吗?根据Aspencore最近的嵌入式调查(2023年5月),49%的受访者表示,实时性能是对商业RTOS的最重要要求。
    的头像 发表于 09-12 11:06 761次阅读
    评估<b class='flag-5'>RTOS</b>的几个重要指标

    将RTX迁移到CMSIS-RTOS

    CMSIS-RTOS API是基于Cortex-M处理器的设备的通用RTOS接口。 CMSIS-RTOS为需要RTOS功能的软件组件提供了标准化的API,因此给用户和软件行业带来了巨大
    发表于 09-04 06:37

    构建RTOS Kernel指南 (上)

    1 前言 试想与我们相伴的MCU如若只存在裸机程序,那么运行到一个包含延时的线程时,我们的CPU就开始“摸鱼”了。 为了最大化运行CPU,就需要用到RTOS(RealTime Operating
    的头像 发表于 08-03 08:45 444次阅读
    构建<b class='flag-5'>RTOS</b> Kernel指南 (上)

    STM32 RTOS知识点

    电子发烧友网站提供《STM32 RTOS知识点.pdf》资料免费下载
    发表于 08-01 14:28 2次下载
    STM32 <b class='flag-5'>RTOS</b>知识点

    朱天龙:学习和掌握RTOS最好的方法

    在讨论“ 如何学习和掌握RTOS “这件事情之前,我们首先要明确一点:我们是否有必要学习RTOS? 关于这一点,可以看我18年的时候写的一篇文章 《该不该用RTOS?我们只做对的选择
    的头像 发表于 07-28 20:45 825次阅读
    朱天龙:学习和掌握<b class='flag-5'>RTOS</b>最好的方法

    RTOS中Queue的工作原理

    Queue即消息队列是通过RTOS内核提供的一种服务。它是一种线程间同步数据的安全方法。
    的头像 发表于 07-25 15:45 2140次阅读
    <b class='flag-5'>RTOS</b>中Queue的工作原理

    使用Zephyr RTOS的碳漫游者

    电子发烧友网站提供《使用Zephyr RTOS的碳漫游者.zip》资料免费下载
    发表于 06-28 14:54 0次下载
    使用Zephyr <b class='flag-5'>RTOS</b>的碳漫游者

    求助,什么时候用RTOS

    本菜鸟一直是用的裸机开发,也学习过操作系统,但是一直没明白什么时候用RTOS,感觉用裸 机开发一点问题没有啊,什么情况下用RTOS
    发表于 06-28 06:54

    RTOS核心:调度和分割

    对许多嵌入式项目来说,系统设计师都倾向于选择实时操作系统(RTOS)。但RTOS总是必要的吗?答案是取决于具体的应用,因此了解我们要达到什么目标是决定RTOS是必要的还是花瓶的关键。 一般来说
    的头像 发表于 06-22 10:46 519次阅读