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

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

    关注

    6074

    文章

    45340

    浏览量

    663622
  • 编程
    +关注

    关注

    90

    文章

    3708

    浏览量

    96765
  • RTOS
    +关注

    关注

    25

    文章

    862

    浏览量

    122613

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    学习RTOS的意义?

    对于嵌入式软件工程师,学习RTOS非常有必要。 1. 项目需要 随着产品要实现的功能越来越多,单纯的裸机系统已经不能完美地解决问题,反而会使编程变得更加复杂,如果想降低编程的难度,就必须引入
    发表于 11-27 08:16

    RTOS怎么实现共享内存?

    K230的RTOS支持POSIX标准的共享内存吗 我尝试使用却失败 还是说需要源码部分配置的开启才可以使用 求教大佬
    发表于 08-04 08:06

    使用RTOS的SDK,调整rtsmart-menuconfig出现编译错误怎么解决?

    .想要启用USB的Host主模式,在rtos_k230下改动rtsmart-menuconfig 2.进入RT-Thread Components---> 3.进入Device
    发表于 07-22 07:59

    请问编译纯rtos到底是选择Linux+rtos的sdk编译only rtos还是直接使用rtos sdk?

    编译纯rtos到底是选择Linux+rtos的sdk编译only rtos还是直接使用rtos sdk?
    发表于 07-11 07:22

    下一代PX5 RTOS具有哪些优势

    许多古老的RTOS设计至今仍在使用,包括Zephyr(1980年代)、Nucleus(1990年代)和FreeRTOS(2003年)。所有这些旧设计都有专有的API,通常更大、更慢,并且缺乏下一代RTOS的必要安全认证和功能。
    的头像 发表于 06-19 15:06 878次阅读

    rtosrtos&amp;linux能否调整连接windows后的设备名称?

    rtosrtos&amp;linux 能否调整连接windows后的设备名称
    发表于 05-14 06:19

    如何在Eclipse ThreadX RTOS中集成SystemView

    SEGGER实时软件分析工具SystemView已经在ThreadX v6.4.2上进行了测试。SystemView从v3.60c版本支持Eclipse ThreadX(Azure RTOS),用户
    的头像 发表于 05-06 17:11 1176次阅读

    RTOS如何在FX3中工作?

    大家好, 我正在使用 FX3 进行一个项目。 我想知道 RTOS 调度是如何工作的。 我知道调用“CyU3PKernelEntry();”后 RTOS 就会开始工作。 如果我只注册一个应用程序线程。 我的线程什么时候执行? 是否有其他系统/fx3 线程与我的线程共享系
    发表于 05-06 13:20

    k230 rtos串口1无输出怎么解决?

    studio k230 linux+rtos,在大核里打开了uart1设备,使用例程通过uart1发送和接收数据,但是电脑上没有接收到任何数据,01 studio的串口1是io3和io4,请问是需要配置引脚功能么?如果需要,怎么改
    发表于 04-28 08:02

    详解RTOS中的Hook函数

    Hook函数是RTOS中的一个关键特性,通过该函数,用户可以增强对任务管理的控制,定义系统行为。
    的头像 发表于 03-24 16:14 840次阅读

    STM32MP131C CbueMX中间件无RTOS选项是怎么回事?

    如题,STM32MP131C CbueMX中间件无RTOS选项,对比选择STM32MP157芯片是有的,怎么查这部分资料
    发表于 03-14 06:59

    RTOS中的本地存储指针使用

    本地存储指针是RTOS中的一个重要特性,增强了任务管理和数据处理能力。在RTOS上下文中,本地存储是指存储在本地的特定任务或对象的数据。通常与任务本地存储(Task Local Storage,TLS)有关,其中数据存储在任务控制块(TCB)中,允许每个任务具有私有的、特
    的头像 发表于 02-28 16:33 1172次阅读
    <b class='flag-5'>RTOS</b>中的本地存储指针使用

    Flexible Safety RTOS的技术特征

    Embedded Office的Flexible Safety RTOS是专为具有严格功能安全要求的嵌入式系统量身定制的、先进的实时操作系统。该RTOS专为工业自动化、汽车、铁路和医疗设备等行业而设
    的头像 发表于 01-07 11:29 997次阅读

    RTOS中的错误检查机制

    在嵌入式应用中,有可能发生各种各样的错误,系统必须能够检测到这些错误并作出适当的响应。RTOS通常内置了一些错误检查功能,用于检测错误并向应用提供响应错误的方法。
    的头像 发表于 01-03 14:44 1022次阅读

    使用任务通知提高RTOS应用的效率

    在实时嵌入式系统中,性能和资源效率是决定设计成败的关键因素。传统的实时操作系统(RTOS)提供了如队列、信号量和事件组机制,实现任务之间的同步和通信。FreeRTOS/SAFERTOS还提供一种方法可以使这些过程更快、更轻量化,即任务通知。
    的头像 发表于 12-27 14:54 1073次阅读