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。堆内存日志
堆内存使用的实际金额可以监控,通过运行您的应用程序的控制下我们的调试器,如下:
设置CFG_LOG_HEAP_USAGE宏定义的da1458x_config_advanced.h文件,定义:
#定义CFG_LOG_HEAP_USAGE
取代da14531.lib与da14531_with_heap_logging.lib在我们的项目:
请注意
堆日志库中可以找到\ sdk \ \ system_library \ \ Keil_5输出平台
文件夹的SDK。
重建应用程序,然后使用我们的调试器执行。在命令窗口类型
disp_heaplog ()
您应当会看到类似如下:
的当前的
值代表时堆内存的使用量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过程;增加相关的宏定义堆大小,重建应用程序日志,然后再次堆内存使用。经过几次迭代后你应该发现一个合适的最大堆大小。
请注意
它可能容易简单的最大堆大小增加到一个较大的值。我们不建议这样做。使用大内存堆领域减少可用内存的代码和数据存储。