LabVIEWCompactRIO 开发指南9
保持连续内存健康
连续内存是一种连续的、不分段的内存块。当程序包含各种动态分配时,内存可能会变得碎片化,从而使查找大块连续内存变得更加困难。在图3.26的例子中,即使RTOS有足够的内存来存储40字节的请求分配,程序还是会失败并崩溃,因为RTOS没有足够大的连续段。
图3.26 RTOS上的内存会变得碎片化,令内存管理器很难定位大块的连续内存
可以通过最小化动态内存分配和为等于最大预期数组大小的数组预分配空间来保持连续内存的健康状态。图3.27展示了如何使用Initialize array和Replace array函数为数组预分配内存。数组只创建一次,并且Replace array可以将输入缓冲区重用为输出缓冲区。如果可以确定数组的大小上限,则应该预先分配数组。
图3.27 在可能的情况下为数组预先分配内存
监控系统内存
在设计系统时,考虑包含内存监视代码,以便在内存不足时安全地重新启动目标。当以实时目标为目标时,可以使用RT Get memory Usage VI以编程方式访问系统的内存状态。
图3.28 通过NI系统配置API以编程方式监控内存
还应该包括一个执行以下功能的安全关闭例程:
■关闭文件以防止损坏
■终止通信以避免冲突
■将硬件输出设置为安全状态
有关此主题的更多信息,请参阅NI Developer Zone文档Fail-Safe Control Reference Design。还可以在工具菜单下的LabVIEW中使用NI分布式系统管理器监视内存使用情况。
图3.29 使用NI分布式系统管理器监控CompactRIO内存使用情况
使用有限的CPU资源
在设计实时目标应用程序时,应该将CPU使用率控制在70%以下。可以使用NI分布式系统管理器或以编程方式使用RT获取CPU负载VI来监控CPU使用情况。在尝试减少应用程序的CPU使用情况时,请考虑以下几点。
图3.30 使用RT获取CPU负载VI监控CPU使用情况
在使用定时结构时要小心
如果应用程序不包含任何需要确定性行为的任务,请使用带有定时函数的While循环而不是Timed循环。定时循环提供了许多有用的内置功能,但也比While循环有更多的开销。此外,如果定时循环没有得到正确的执行,它们可能会导致系统变得无响应。因此,应该只在绝对必要的时候使用定时循环。
只在必要时快速运行循环
尽管可能希望尽可能快地运行应用程序中的每个循环,但这种做法可能会导致不希望的计时行为,包括增加抖动甚至系统死锁。例如,运行用户界面数据发布循环的速度比人类操作员处理和响应数据的速度要快,这对实时目标的CPU造成了不必要的负担。在大多数情况下,对于通过网络发布用户界面数据的环路,2Hz到15Hz的速率就足够了。
避免使用太多网络发布的共享变量
当托管在CompactRIO控制器上时,网络发布的共享变量会导致显著的CPU和内存开销。如果应用程序使用大量网络发布的共享变量(超过几十个),那么尽可能将这些共享变量托管在Windows主机PC上。请注意,在主机PC上托管共享变量时,不能启用RT FIFO,以便在时间关键循环之间进行确定性数据传输。
在可能的情况下卸载任务
为了最大限度地减少实时目标上的CPU使用,请考虑将某些任务卸载到桌面PC或FPGA目标(如果可用)。
需要说明的是,上述的例程和文档,都是可以下载的,双击即可打开,其中压缩文件是可以采用粘贴复制的方式,拷贝到硬盘上。这不是图片,各位小伙伴看到后尝试一下,这个问题就不用加微信咨询了。有关LabVIEW编程、LabVIEW开发等相关项目,可联系们。附件中的资料这里无法上传,可去公司网站搜索下载。