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

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

    关注

    6039

    文章

    44579

    浏览量

    636417
  • 编程
    +关注

    关注

    88

    文章

    3628

    浏览量

    93811
  • RTOS
    +关注

    关注

    22

    文章

    817

    浏览量

    119717

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

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

收藏 人收藏

    评论

    相关推荐

    深入解析Zephyr RTOS的技术细节

    Zephyr是一个针对资源受限设备优化的小型、可缩放、多体系架构实时操作系统(RTOS)。Zephyr由Linux基金会维护[1],是一个以构建业界最佳的RTOS为目标的开源合作项目。近年来
    的头像 发表于 10-22 16:47 585次阅读
    深入解析Zephyr <b class='flag-5'>RTOS</b>的技术细节

    rtthread是抢占式的rtos,那么线程的timeout参数具体的作用是什么

    查阅相关说明,rtthread是抢占式的rtos,那么线程的timeout参数具体的作用是什么, 假如线程A,B的优先级分别是1和2,timeout是10ms。当线程B 在运行中,还未到timeout,此刻挂起的线程A被触发,是直接抢占,打断线程B的运行还是要等超时再运
    发表于 09-27 08:39

    RTOS正在缩小与Linux的差距

    RTOS与Linux的物联网设备操作系统之争已经持续了很多年。Linux以其强大的计算能力和丰富的软件生态,在需要复杂处理和软件支持的物联网设备上占据一席之地;RTOS凭借实时响应和资源节约的特性
    的头像 发表于 09-10 08:07 797次阅读
    <b class='flag-5'>RTOS</b>正在缩小与Linux的差距

    freertos和rtos区别是什么

    FreeRTOS 和 RTOS(实时操作系统)是两个不同的概念,但它们之间有紧密的联系。FreeRTOS 是一个特定的开源实时操作系统,而 RTOS 是实时操作系统的一般概念。 概念定义 RTOS
    的头像 发表于 09-02 14:18 1342次阅读

    RTOS与Linux有什么区别

    RTOS(Real-Time Operating System,实时操作系统)与Linux是两种在不同应用场景下发挥重要作用的操作系统,它们在设计理念、功能特性、应用场景以及性能表现等方面存在显著差异。以下是对RTOS与Linux区别的详细分析。
    的头像 发表于 08-20 16:05 3801次阅读

    RTOS的特性和类型

    实时操作系统(RTOS)是一种可运行实时计算应用程序的软件平台,用于处理具有明确时间约束的事件和数据。与通用操作系统(GPOS)不同,RTOS必须在有限的硬件资源上调度应用程序之间的处理和数据共享
    的头像 发表于 08-20 11:29 621次阅读

    RTOS开发最佳实践

    基于RTOS编写应用程序时,有一些要注意事项。在本节中,您将学习RTOS开发最佳实践,例如POSIX合规性、安全性和功能安全认证。
    的头像 发表于 08-20 11:24 473次阅读

    RTOS-SDK下如何关闭系统的提示信息?

    您好,我使用的1.3版本的RTOS-SDK,在STA状态下,连接状态改变串口0会有提示信息产生,怎么样才能将其关闭
    发表于 07-22 07:04

    将ADF移植到RTOS上大概都需要哪些步骤?一般移植周期多久?

    1 ADF是免费的开源软件吗? 2 将ADF移植到RTOS上大概都需要哪些步骤?一般移植周期多久?
    发表于 06-28 08:03

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

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

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

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

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

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

    有没有办法或示例来编写一个函数来检查CAN硬件的接收缓冲区并以更符合RTOS的轮询方式提取任何新消息?

    需将该函数声明为静态函数,从而消除了在芯片上不同CAN总线设备之间重用代码的许多好处。 有没有办法或示例来编写一个函数来检查 CAN 硬件的接收缓冲区并以更符合 RTOS 的轮询方式提取任何新消息?
    发表于 01-25 06:47

    使用差分晶振有什么好处

    使用差分晶振有什么好处? 差分晶振是一种使用两个晶体来实现信号产生的技术。相比于传统的单端晶振,差分晶振具有以下几个优势: 1. 抗干扰能力强:差分晶振采用差分方式进行信号生成,因此对于环境中
    的头像 发表于 01-23 16:43 482次阅读

    功放pcb大面积覆铜的好处有哪些

    功放pcb大面积覆铜的好处有哪些? 功放(功率放大器)是一种用于放大电信号的电子设备,主要用于音频系统、通信系统、测量仪器等领域。作为功放的关键组成部分之一,功放PCB的设计和制造对于整个功放
    的头像 发表于 01-17 16:50 828次阅读