LabVIEWCompactRIO 开发指南8
消除不必要的驱动因素
要释放一些系统内存,可以卸载实时系统上不使用的任何驱动程序。要自定义软件堆栈,右键单击实时目标下的软件,并选择添加/删除软件。选择推荐的软件集并删除任何不必要的驱动程序。
图3.24 卸载不用于增加内存的软件驱动程序。
选择具有更多板载内存的硬件目标
可以选择各种CompactRIO和NI单板里RIO目标,具有不同数量的板载内存。如果在静态内存分配方面存在问题,请考虑使用具有更多板载内存的CompactRIO系统。
动态内存分配
动态内存分配是在运行时分配的内存。动态内存分配会影响应用程序的性能和确定性,因为它们调用内存管理器,而内存管理器充当共享资源。动态分配内存的时间取决于需要分配的内存量和内存的当前状态。动态内存分配也会影响实时应用程序的可靠性。如果内存管理器在内存中找不到足够大的连续段来填充请求,它将终止程序。
设计代码以避免动态内存分配所需的工作量应该与嵌入式系统所需的正常运行时间相关。可以处理定期重新启动或维护的系统可以自由地使用动态内存,只要它们监视内存状态。一旦系统重新启动,内存就会被释放。如果系统不能处理常规重启,那么应该考虑使用以下技术来减少动态内存分配。为了获得最大的可靠性,请将代码移动到FPGA或创建冗余系统。
通过关闭引用来避免内存泄漏
内存泄漏是永远不会释放的资源分配。内存泄漏可能需要很长时间才能耗尽内存,但最终可能导致系统崩溃。常见的内存泄漏来源如下:
■调用带有泄漏的库
■未关闭的文件句柄
■未关闭的VI服务器引用
■未闭合的驱动手柄
■未封闭的共享变量API引用
■未关闭的TCP连接ID或侦听器ID
通过关闭初始化期间打开的所有引用来避免内存泄漏。用移位寄存器替换任何引用的终端也是一种安全的做法。
使用固定大小的数据避免过度分配
当程序试图在RAM中存储过多的数据时,就会发生内存过度分配。它通常来自没有固定大小的队列或缓冲区。图3.25中的图表显示了缓冲区正在扩展的情况。注意,一旦缓冲区扩展,它通常不会收缩。当代码运行时,缓冲区可能会被定期清空,但它仍然保留其最大值的大小。
图3.25 无界缓冲区随着时间的推移会减少内存。
以下是动态内存分配的常见来源:
■队列没有固定大小
■可变大小的数组(和波形)
■可变大小的字符串
■变体
本章讨论了在实时目标上的进程之间共享数据的两种方法。默认情况下,队列具有可变大小的缓冲区。即使有固定数量的元素,包含可变大小数据(字符串、变量)的队列的大小仍然是可变的。对于网络流和共享变量也是如此。如果正在处理一个需要考虑动态内存分配的应用程序,请使用RT FIFO在进程之间传输数据。
需要说明的是,上述的例程和文档,都是可以下载的,双击即可打开,其中压缩文件是可以采用粘贴复制的方式,拷贝到硬盘上。这不是图片,各位小伙伴看到后尝试一下,这个问题就不用加微信咨询了。有关LabVIEW编程、LabVIEW开发等相关项目,可联系们。附件中的资料这里无法上传,可去公司网站搜索下载。