电子应用场景设计 干货 FreeRTOS学习笔记 ——应用场景

小编 2024-10-25 论坛 23 0

干货 FreeRTOS学习笔记 ——应用场景

去年NXP KW41大赛的时候被迫啃了一口FreeRTOS,我后来打算系统地学习一下它,再尝试应用到自己的DIY项目当中去。FreeRTOS只是众多的 RTOS (字面意思是实时操作系统)中的一种,因为用得广泛有是开源的,作为学习是个不错的选择。我大概地读过了它的文档,现在回头开始梳理,研究下部分的实现细节,一边写这个连载。

什么情况下可以用 FreeRTOS ?

单片机也要用操作系统?如果以日常用的Windows, Linux, BSD这些,甚至是DOS,来代表操作系统的话,在单片机上运行操作系统时候个很荒诞的想法——因为对大多数单片机,RAM实在太少了。而 FreeRTOS 并不是要提供一个在单片机上运行软件的平台,把软件一个个安装到它上面,供用户选择运行什么,它没有用户界面;它不是一个管家,也不带任何硬件驱动程序,也没有文件系统服务提供。FreeRTOS只是一个操作系统内核,它首先提供了操作系统最重要的特性:任务调度。

也就是说,有了FreeRTOS,在单片机上实现多任务会容易一些。这里至少有两层含义,一是多任务是否一定要用RTOS才可以实现? 当然不是。对于单片机开发来讲,所有系统资源都是你的,在不同中断服务里面处理不同的任务并不是很困难的事情。第二,是否没有多任务就完全用不着RTOS? 这也得看具体情况,如何界定“任务”的概念了,一件复杂的事情在程序中也有可能划分为几个任务来处理。

还是举几个例子吧。

1SD卡MP3音乐播放机

暂且不管用户操作界面,在播放状态下,从数据流上看播放机是这样工作的(作了一定简化):

I2S接口DMA缓冲区空闲

用剩余PCM数据填充缓冲区,请求解码下一块MP3数据

请求读取MP3文件下一段内容

定位SD卡上要读取扇区位置

SDIO控制器读命令发送

SDIO控制器接收数据完成中断

填充文件数据缓冲区

解码MP3数据,写PCM数据缓冲区

填满I2S接口的DMA缓冲区

这个过程涉及到四个关键的软件部分:

若按自顶向下的软件设计思路,I2S设备驱动以固定的节拍被唤醒,进行缓冲区PCM数据填充,因此需要定期去调用MP3解码程序。MP3解码器则根据前面一段解码操作的结果来决定是否要访问文件系统(因为MP3解码一块数据产生的PCM音频数据的量并不能刚好是I2S设备驱动请求的大小),以及需要读取多少字节的MP3文件内容,还有解码出来暂时用不到的数据也要保存起来下次用。到了文件系统这里,请求读文件的位置和长度也未必是正好SD卡上的一个扇区,所以也有缓存,而且还需要跟踪文件在SD卡上的索引。SDIO设备驱动则按照文件系统的请求读取SD卡,等待操作完成以后返回,注意它和前面的模块不同的是,有一段什么事情也不干的硬件IO等待时间。

一层层的嵌套调用关系如这样:

注意,每一次的函数调用,都代表一个完整的操作:填充一块缓冲区、解码一段MP3数据、读取一段文件,以及读取SD卡一块数据。下层的子程序被调用,完成后返回上一层的程序中继续执行。在没有异常(中断)发生的情况下,程序是不会离开这个调用关系嵌套的。

又需要注意到,上面几个列举的主要函数,虽然一次调用操作是完整的,但每次操作过后它的内部状态不一定相同。用C语言来说,就是这些函数需要有static型的局部变量,或者是自己用一些全局变量来记住上次调用后状态是怎样了。典型的就是文件系统 read_file() 这样的函数被调用后,它需要记住文件指针的位置,以便下次接着读。

如上描述实现的音乐播放器实现有一个重要的缺点:在SD卡读操作的等待时间里,CPU的执行只能停留在SD卡访问函数中,不能用来进行MP3解码的运算操作,处理能力被浪费了。在I2S设备的缓冲区填满,到下一次需要再填充这段时间 ,CPU也是处于空闲状态。其实完全可以利用这两段空闲时间,做其它的事情,比如预先解码MP3一部分数据。那么问题是,如何在一个函数执行过程中,跳出去执行其它的函数,然后再跳回来?用中断,对,但是把什么放在中断里面呢?

2 USB mass storage设备

就是利用单片机的USB片上设备,模拟一个U盘。做这样的设备,主要内容就是响应来自USB主机的各种请求。当USB主机向设备发出请求的时候,USB硬件会产生一个IRQ,随后USB的中断服务函数(IRQ handler)被执行。通常,USB驱动程序库会提供一些回调(callback)函数接口,就是由用户写一些函数,供USB IRQ handler在需要的时候调用。

作为USB mass storage设备,需要提供的回调函数必须要有读存储设备、写存储设备等,以产生实际的磁盘数据给USB,以及接收USB要求写的磁盘数据。这些函数什么时候被调用到,是应用程序无法预见的,因为它在USB中断发生之后的响应过程中。这样一来,回调函数处理U盘模拟的事务,主程序里面不用管,可以处理无关的别的工作,也就实现了多任务么!

然而,在中断环境下执行用户代码,好像不是太好的选择,因为这时候优先级同级和更低的中断就不能响应了。在实际的USB mass storage设备里面,U盘的数据要从片外存储设备中读取,比如NAND Flash,情况就会糟糕——读取数据需要等待,而这个等待完全发生在USB IRQ handler里面,USB主机的请求暂时也没法再响应了。如果主程序中的任务也需要硬件I/O中断,可能就会受到影响。

那么,作为只模拟一个U盘,不进行其它任务的应用来说,这样似乎也无关紧要:反正都是等。我亲自做过的USB全速(12Mbps)下U盘设备的表现,传输速度最多到500多kB,比12Mbps差了不少,为什么呢?

看上面这个图,USB IRQ中断响应期间,是没有数据传输的,所以12Mbps的有效带宽被浪费了一部分,U盘的吞吐率自然就达不到理论值了。回调函数在I/O等待的时候,USB主机也在等待USB设备的应答。而U盘数据准备好之后,USB硬件发送数据,CPU又无事可干直到下一次请求到来。比较合理的设计是利用USB TX的时间进行实际存储设备的I/O预读取,也就是猜测USB会继续请求读上次读了的后面的数据,那就先把数据读到内存中来,一旦猜对了,就可以缩短下次请求的响应时间,模拟U盘的读取吞吐率就提高了。要这么实现,就不能单纯地在回调函数中处理I/O任务。

3数据记录装置的存储管理

某个应用需要对远程设备(通过UART连接)进行 ReadChipID, ReadStatus, ReadData, EraseData, WriteData 这几项操作,以实现数据管理。这几个操作在具体的实现上,都是通过UART发送约定好格式的命令数据,然后通过解析UART收到的返回数据内容来判断操作是否成功,并接收有效的数据。

倘若把注意力放在UART发送命令这里,程序的结构可能是这样的:

这样的设计假定了远程设备会如期地发送出来应答,对UART交互过程却几乎没有容错能力。一旦交互过程中出现了意外,就无法从错误状态恢复,只能从头再来。

一旦考虑到UART通信可能出现的异常,程序的编写就变得不那么直截了当了。一种办法是将解析UART收到数据的功能写成状态机,在数据是否合乎预定的格式、对返回数据的辨识的基础上确定程序执行的状态。当到达某些状态时,就从UART发送命令。但如此写法,从读代码的角度很难看出程序执行的意图,把操作流程和通信纠错混在了一起,且不利于代码维护。

如何在保持程序流程直观的写法下,融进去通信状态识别和错误处理机制呢?按照一般的思维,这是一个单任务(线程)的程序,程序是顺序执行,都不需要借助中断。程序是在按照一个流程进行操作,但还要处理与流程关系不紧密的UART通信异常,这两项工作在时间上是交错的。倘若设想这是两个任务在进行,但是是在可以预见地相互切换着呢?好像这么说把简单事情又复杂化了……

上面三个例子都有可能借助“任务调度”实现更有效的运行时间分配。在我看来,FreeRTOS提供了一种新的程序组织方式——任务,把复杂的事情划分成独立的小块分开编写;同时又提供一些机制让这些小块功能相互协同,来实现总的目的。FreeRTOS的任务是用C语言函数来编写的,它提供一个特性,可以让几个函数看起来“同时”在执行。当然啰,只有一个CPU的情况下实际上是轮流在执行的,不过这也和普通C语言程序有重大区别。

我们知道,C语言的函数可以嵌套调用,可以递归调用。比如 funcA() 调用 funcB(),然后 funcB() 又调用 funcC(),甚至 funcC() 再调用 funcA() 都可以。但是 funcA() 必须等到 funcB() 返回之后才能继续执行它后面的内容,funcB() 调用 funcC() 也是等待 funcC() 完成了,控制权才回来。

对于FreeRTOS的任务则不是这样的了,taskA() 任务可以在执行过程中主动或者被动地交出控制权,taskB() 可以这时候获得控制权,但它并不是从头再开始执行,而是从上次交出控制权的那个地方后面继续执行。又在某个时候,taskB() 交出控制权,系统选择了执行 taskC(),然后再当 taskC() 交出控制权时,taskA() 又恢复了执行。

上面这个图简化了一点,实际上从一个任务的函数跳出来到另一个任务的函数中继续执行的过程,中间还要执行一段FreeRTOS内核的代码,也就是说是内核在负责调度下一步执行哪个任务,如何暂停当前的任务,如何恢复另一个任务。

是否多任务的调度一定要用某种RTOS来实现?也并不是,用了RTOS会有所帮助,同时资源开销会多那么一点。比如已经提到过的用中断来切换任务,已可以实现简单的多任务。又比如,把一个任务分解成多个步骤,每个步骤对应一个函数,然后在一个大的循环里面每次选择执行哪个任务的哪一步。这种多任务为非抢占式的,而用中断实现的多任务是抢占式的。

请注意,不管是否用了某种RTOS来实现,多任务操作的特点是每个任务只要没有执行完,它的状态(包括私有的数据)就必须完整保存。因为代表任务的函数(比如中断服务程序、任务的某一个步骤)一旦返回了,局部变量的作用域就消失,不能用来保存状态,所以任务状态保存要么用全局变量,要么用static的局部变量,要么用动态分配的存储。FreeRTOS的办法是:让任务函数暂停执行不需要返回,可以同时存在多个这种没有返回的函数,然后任选其中一个恢复执行。如何实现这个特性?请听我下篇分析。

以上图文内容均是EEWORLD论坛网友cruelfox 原创,在此感谢。

欢迎微博@EEWORLD,如果你也写过此类原创干货请关注微信订阅号(ID:eeworldbbs,将你的原创发至:bbs_service@eeworld.com.cn,一经入选,我们将帮你登上头条!

与更多行业内网友进行交流请登陆EEWORLD论坛。

智能工厂四大应用场景

什么是智能工厂?美国ARC总结:以制造为中心的数字制造、以设计为中心的数字制造、以管理为中心的数字制造,并考虑了原材料、能源供应、产品销售的销售供应,提出用工程技术、生产制造、供应链这三个维度来描述工程师的全部活动。

通过建立描述这三个维度的信息模型,利用适当的软件,能够完整表达围绕产品设计、技术支持、生产制造已经原材料供应、销售和市场相关的所有环节的活动。实时数据的支持,实时下达指令指导这些活动,全面的优化,在三个维度之间交互,我们叫数字化工厂或智慧工厂。

在智能工厂中,借助于各种生产管理工具/软件/系统和智能设备,打通企业从设计、生产到销售、维护的各个环节,实现产品仿真设计、生产自动排程、信息上传下达、生产过程监控、质量在线监测、物料自动配送等智能化生产。下面介绍了几个智能工厂中的典型“智能”生产场景。

场景1:设计/制造一体化

在智能化较好的航空航天制造领域,采用基于模型定义(MBD)技术实现产品开发,用一个集成的三维实体模型完整地表达产品的设计信息和制造信息(产品结构、三维尺寸、BOM等),所有的生产过程包括产品设计、工艺设计、工装设计、产品制造、检验检测等都基于该模型实现,这打破了设计与制造之间的壁垒,有效解决了产品设计与制造一致性问题。制造过程某些环节,甚至全部环节都可以在全国或全世界进行代工,使制造过程性价比最优化,实现协同制造。

场景2:供应链及库存管理

企业要生产的产品种类、数量等信息通过订单确认,这使得生产变得精确。例如:使用ERP或WMS(仓库管理系统)进行原材料库存管理,包括各种原材料及供应商信息。当客户订单下达时,ERP自动计算所需的原材料,并且根据供应商信息即时计算原材料的采购时间,确保在满足交货时间的同时使得库存成本最低甚至为零。

场景3:质量控制

车间内使用的传感器、设备和仪器能够自动在线采集质量控制所需的关键数据;生产管理系统基于实时采集的数据,提供质量判异和过程判稳等在线质量监测和预警方法,及时有效发现产品质量问题。此外,产品具有唯一标识(条形码、二维码、电子标签),可以以文字、图片和视频等方式追溯产品质量所涉及的数据,如用料批次、供应商、作业人员、作业地点、加工工艺、加工设备信息、作业时间、质量检测及判定、不良处理过程等。

场景4:能效优化

采集关键制造装备、生产过程、能源供给等环节的能效相关数据,使用MES系统或EMS(能源管理系统)系统对能效相关数据进行管理和分析,及时发现能效的波动和异常,在保证正常生产的前提下,相应地对生产过程、设备、能源供给及人员等进行调整,实现生产过程的能效提高。

因此,智能工厂的建立可大幅改善劳动条件,减少生产线人工干预,提高生产过程可控性,最重要的是借助于信息化技术打通企业的各个流程,实现从设计、生产到销售各个环节的互联互通,并在此基础上实现资源的整合优化和提高,从而进一步提高企业的生产效率和产品质量。

获取享控智能工厂解决方案, 咨询热线:400 806 2286

重庆享控智能科技有限公司

公司成立于2013年,专注于物联网技术与人工智能技术研发、整合、应用。打造了中国领先的工业互联网平台-享控云网(包括五大系列产品:DZRPlus云平台、企业应用软件、边缘智能、自动化与智能装备、工业数字化服务)。产品主要应用于智能制造、智慧水务、智能制药、智能环保、智能化工、智能冶金、智慧能源等行业,并为企业打造智能化运营平台整体解决方案和系统集成。

相关问答

什么是 电子 商务的四个 应用场景 ?

1、在互联网上发现生活服务,通过网络支付购买,再到线下来接受服务,线上(互联网)到线下模式,2、在移动互联网上发现服务,通过手机支付,再到线下接受服务...1...

瞬态 电子 器件有哪些 应用场景 ?-盖德问答-化工人互助问答社区

医疗检测应用。将瞬态电子器件植入要检测位置,如心脏位置、肺部、胃位置、手术缝合位置等,监测手术后的恢复情况,待一段时间后,该器件便自动溶解,无...

电子 身份证使用 场景 是什么意思?

1.电子身份证使用场景是多样的。2.这是因为电子身份证可以在各种需要身份验证的场合使用,例如机场、银行、政府机关等。它可以替代传统的纸质身份证,提供更...

交互式 电子 白板主要 应用 范围是哪些?其功能是什么?

交互式电子白板主要用与教育和视频会议用的比较广泛些,其功能主要方便于老师上课,结合了之前台式机得复杂的连接线和视觉上的完美,其次触摸功能取代了鼠标操作...

房地产行业都有哪些 场景 可以使用到 电子 合同/ 电子 印章系统的?

房地产行业在项目采购、房屋买卖、人事管理、房屋租赁、物业管理、等多种场景下都是可以使用到电子印章系统。就拿“微签”来讲,微签电子签章系统可以将合同模板...

AI智能 电子 名片小程序使用 场景

智能名片是数字化名片,传统名片+数字化=AI电子名片。AI电子名片在前端打开了名片社交关系链,在后端部署了AI雷达,精准检测客户的访问轨迹、行为轨迹...

应用电子技术 教育是学什么的?就业前景怎么样啊? 申请方

毕业后去教书,对于女孩子来说这应该是很不错的选择!男生可能选这条路的还是少吧,我们班还有一部分人是去电子类的公司上班,比较辛苦点。如果学的好...

医保 电子 凭证激活以后,可以在哪些 场景应用 呢?

社会进入老龄化,现在的孩子少,老人多,1对年轻夫妻要赡养4个老人,有了社保医保,孩子们的压力会小很多。朋友们,您的医保电子凭证激活了吗?你在日常生活中...企业...

eld数字身份证使用范围?

可用于线上身份认证和线下身份出示场景,如在支持eID的酒店前台出示电子身份证照,即可办理入住酒店。使用eID线下认证时无需联网,但申请和删除eID、线上认证时...

天博 电子 (官方)APP下载安装/网站网页通用版入口

AHC微米口香糖面膜简直就是补水炸弹,它的膜布是那种微压花的很特别不算超薄,但上脸真的巨服帖,完美的贴合在我脸上,而且承载力很棒,精华不会像普通...