19所示。堆内存使用

SDK6使用动态内存分配的四个堆领域:

  • KE_MEM_ENV:用于环境变量。

  • KE_MEM_ATT_DB:用于服务属性数据库。

  • KE_MEM_KE_MSG:用于内核消息。

  • KE_MEM_NON_RETENTION:用于一般用途的堆内存。

SDK包含默认值的最大大小的堆区域,通常不需要调整。

19.1。堆内存错误

偶尔,默认为您的应用程序堆大小是不够的。在这种情况下,您的应用程序运行时控制的调试器,您可能会发现它停止platform_reset_func和误差值传递给这个函数RESET_MEM_ALLOC_FAIL

如果你把这堆相关错误在运行您的应用程序,那么第一步是确定哪些堆(s)耗尽内存。要做到这一点,在堆内存日志部分按照说明如下。

19.2。堆内存日志

堆内存使用的实际金额可以监控,通过运行您的应用程序的控制下我们的调试器,如下:

  1. 设置CFG_LOG_HEAP_USAGE宏定义的da1458x_config_advanced.h文件,定义:

#定义CFG_LOG_HEAP_USAGE
  1. 取代da14531.libda14531_with_heap_logging.lib在我们的项目:

_images / heap_log_lib.png

图59使用堆日志库

请注意

堆日志库中可以找到\ sdk \ \ system_library \ \ Keil_5输出平台文件夹的SDK。

  1. 重建应用程序,然后使用我们的调试器执行。在命令窗口类型disp_heaplog ()您应当会看到类似如下:

_images / disp_heaplog.png

图60显示堆日志结果

当前的值代表时堆内存的使用量disp_heaplog命令被执行死刑。的最大值代表使用堆内存的最大数量到目前为止——请注意,它并不代表最大的堆内存可用。

如果内存预留特定堆变得筋疲力尽,然后从另一个堆内存区域。如果发生这种情况的使用大小其他日志中的条目将非零。

请注意

应用程序代码将继续运行这个命令后执行。建议尝试使用这个命令在不同的点在代码执行,为了感受最大的堆使用情况。例如,如果您的设备作为祝福外围,检查堆使用情况后连接到一个中央等。

如果你发现一个或多个内存堆的地区,可以使最大大小按照在下一节中的说明。

19.3。堆内存调整

最大堆大小的默认值,可使用以下宏覆盖在文件中定义的da1458x_config_advanced.h:

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // *自定义堆大小* // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // / # define DB_HEAP_SZ 1024/ / # define ENV_HEAP_SZ 4928/ / # define MSG_HEAP_SZ 6880/ / # define NON_RET_HEAP_SZ 2048

简单地取消宏(s)对应于堆大小你想改变,然后设置相应的值。例如,如果你想增加的最大大小非保留堆到3000字节,你把这个定义如下:

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // *自定义堆大小* // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // / # define DB_HEAP_SZ 1024/ / # define ENV_HEAP_SZ 4928/ / # define MSG_HEAP_SZ 6880#定义NON_RET_HEAP_SZ 3000

当一个错误发生时,只记录堆使用情况告诉你,你已经耗尽内存。它没有告诉你需要更大的堆区域。确定这是一个itterative过程;增加相关的宏定义堆大小,重建应用程序日志,然后再次堆内存使用。经过几次迭代后你应该发现一个合适的最大堆大小。

请注意

它可能容易简单的最大堆大小增加到一个较大的值。我们不建议这样做。使用大内存堆领域减少可用内存的代码和数据存储。

19.4。优化堆内存使用

堆耗尽一些常见的原因如下:

  • 定义大量的服务/特征会导致数据库堆耗尽。我们建议保持服务和特质的数量降到最低。