你好,
我无法理解da1458x_config_advanced.h文件中以下宏的目的/含义。你能解释一下每一个的意思吗?
#定义DB_HEAP_SZ
#定义ENV_HEAP_SZ
#定义MSG_HEAP_SZ
#定义NON_RET_HEAP_SZ
实际上,我正在通过UART从不同的控制器发送GATT数据库,并使用TASK_APP和使用KE_MSG_ALLOC分配服务,特征和描述符。
添加一些后,控制权转移到wrap_platform_reset()。当我阅读一些关于对话框支持的答案时,我发现这种情况发生在内存低的时候。
所以,我增加了所有这些的值,现在我的关贸总协定数据库工作正常。
尽管如此,我还是想确切地了解上述每个宏的用途。
谢谢,
Hrishikesh
设备:
嗨dhrishi,
这些宏定义了不同用途的内存段的大小。例如,调用KE_MSG_ALLOC将从MSG节分配请求量的内存,MSG节的大小由MSG_HEAP_SZ定义。DB用于GATT数据库,ENV用于内核和BLE堆栈内部使用,而NON_RET用于通用目的。
我有大量的服务和特色(6项服务和33项特色)。我端的每个服务的总大小为:
S1: 1278字节字节
S2: 570字节
S3: 751字节
S4: 1455字节
S5: 745字节
S6: 214字节
每个服务中的特征都是TLV8类型的,因此它们的大小更大。
你能建议一下可以使用的大小宏的值吗?我使用的当前值:
#define DB_HEAP_SZ 2048
#定义ENV_HEAP_SZ 1536
#define MSG_HEAP_SZ 2048
#定义NON_RET_HEAP_SZ 1024
有了这些值,当我添加服务S4时,DA14580变得无响应。我认为这是记忆的问题。
我试过在一些组合中增加这些,但没有运气。
我终于可以使它工作与以下值:
#define DB_HEAP_SZ 3072
#定义ENV_HEAP_SZ 3584
#define MSG_HEAP_SZ 1600
#定义NON_RET_HEAP_SZ 1024
你能证明这些值,并让我知道,如果有任何问题(如最大尺寸等)
你好,
我们需要添加一些新服务和大约10个特性。在这种情况下,增加的宏的大小(上面提到的)超出了执行区域ZI_RET20的范围。正确的处理方法是什么?
在编译时,我得到了错误:
错误:L6220E: Execution region ZI_RET20 size (9764 bytes) exceeds limit (8888 bytes) region包含0字节的padding和0字节的veener
错误:L6221E:执行区域ZI_RET20的执行范围()与执行区域ZI_RET21的执行范围()重叠
我至少需要2kB的内存。如何增加区域的大小以及我能做到的最大值是多少。
你好dhrishi,
很抱歉耽搁了。
因此,为了更好地理解,您现在有多个服务,其中包括2个自定义服务(允许在580上),其余都是标准服务。
当您提到DA14580变得无响应时,您是否尝试调试它是由于堆栈问题而不是堆问题。请确认是否有任何与堆栈崩溃相关的问题。您可以通过简单地用一个模式填充内存并查看它被修改到哪个部分来做到这一点。
根据描述,总内存将是每种类型中所有动态分配的总和。
最好的
信用证
不。我所有的服务和特征都是自定义的,具有128位uid。
我们有大量的服务(8-10),特征(50-55),特征值大小也相当大(每个特征几乎150字节)。
不,我无法调试该故障,因为DA14580是模块的一部分(其中有我们的MCU和DA14580)。所以我们不能调试它。虽然,我可以验证它与内存有关,因为当我减少输入服务和特征时,它工作得很好。只是,当我引入一个服务或特性时,DA14580在通过UART添加GATT数据库时,在某个命令之后没有响应
你好dhrishi,
DA14580具有8 kB的保留RAM。您只能在Ret ram中保存一定数量的数据。可以从MAP文件监视这一点,并且可以根据可用内存对应用程序进行调优。请将您的MAP文件转发给我,以便我检查内存使用情况。
另外,你的应用程序会进入深度睡眠吗?您是否需要保留内存中的所有服务/字符?我想知道如果你不操作深度睡眠来释放一些保留RAM,数据是否可以移动到常规RAM。
只是确认一下,你是在HCI上使用DA14581吗?
最好的
信用证
你好,
非常感谢您的支持。很抱歉回复晚了。
目前,我们计划延长睡眠时间。根据我的理解,在此睡眠模式期间,8kB保留RAM以及整个系统RAM被保留。对吧?
因此,我认为将一些数据移动到常规RAM应该是好的。我先试着自己搬东西。如果有什么问题,我会把地图文件发给你。请您提供一下您的邮箱id。
此外,我还想了解一些事情:
1.在添加服务时,总大小是给定的,并且我假设堆栈为该服务的特征值(根据大小)分配了那么多内存。那么在下面,哪种类型的堆是用来存储这个的:
DB_HEAP_SZ或ENV_HEAP_SZ或MSG_HEAP_SZ
2.如果我们决定使用延长睡眠,如果我将环境堆和msg堆保留在保留RAM中(利用可用的8KB)并将db堆移动到sys RAM(或其他组合)是否可以?这种情况下会有什么问题吗?
3.如果我们决定使用深度睡眠模式,我们可以通过修改API SystemInit()中值0-23之间的EM_MAP配置来保留超过8kB的内存吗?如果是,使用这种配置可以保留多少最大内存量。
另外,您能告诉我使用扩展睡眠模式和深度睡眠模式的标准BLE外设的电流值吗?我只是想了解一下当前收视率的差异。
谢谢,
Hrishikesh
你好dhrishi,
请提供你的邮箱,我将转发一个安全文件夹给你。这可以用来上传地图文件。
1.添加任何服务/字符,内存从DB_HEAP_SZ分配。但是,由于总体代码和数据增加,RAM使用(其他堆)也会相应增加。
2.在长时间睡眠中,你在哪里保留记忆并没有什么不同。因此,您可以使用任何适合内存组织的组合。
3.在深度睡眠状态下,你只能保留8kB的内存。
4.在DA14580上,通常延长睡眠电流范围在1.2 - 1.4 uA之间,深度睡眠电流约为650nA左右。但请记住,这可能因硬件设计和使用的组件而异。
最好的
信用证
你好,
谢谢你的回复。因此,我假设所有的记忆都保留在延长睡眠模式下。我打算使用延长睡眠模式。
那么,就功能而言,延长睡眠模式和深度睡眠模式有什么区别呢?如果有相同的指针。那我就能理解了。
我已经创建了基于ble_app_barebone示例应用程序(SDK: 5.0.4)的应用程序。那么,这里默认使用的电源模式是什么呢?
此外,我还将指针“app_on_system_powered”设置为需要定期调用的函数。我看到它返回GOTO_SLEEP和KEEP_POWERED。是否与电源模式有关(在这种情况下是长时间睡眠)?
如果我不断地从这个函数返回KEEP_POWERED,会发生什么?
而且,如果我返回GOTO_SLEEP,那么UART或BLE上的任何活动都会唤醒它吗?
简而言之,我需要理解这些返回值的含义和结果。
谢谢,
Hrishikesh
嗨dhrishi,
睡眠模式在我们的数据表和用户手册中有解释。有关简要参考,您可以查看7.1.1睡眠模式在我们的嗯- b - 051 - _da1458x_software_platform_reference文档。
中定义了休眠模式user_config.h将项目归档。的默认值ble_app_barebone是ARCH_SLEEP_OFF这通常是我们SDK中的默认值。这意味着它处于Active模式。
的.app_on_system_powered当应用程序希望在BLE关闭后保持系统活动时调用。这是为了给应用程序提供额外的处理时间来进行一些数据/后台处理。基于这里调用的函数将决定应用程序是否必须保持通电或可以进入睡眠状态。如果您进入睡眠状态,那么它将在睡眠模式结束时被唤醒以处理BLE事件。请参考我们的UM唤醒DA14580的方法。但是默认情况下,UART不会唤醒系统,而BLE会唤醒系统。
最好的
信用证
你好,
谢谢你的回复。两件事:
1.如果我修改user_config.h以使用扩展睡眠模式,但在app_on_system_powered回调的整个过程中返回KEEP_POWERED,会使用扩展睡眠模式吗?或者BLE仍然可以进入长时间睡眠模式?
设置:我们的模块是一个外设解决方案,具有外部MCU和DA14580。外部MCU将GATT数据库和广告数据通过UART发送到DA14580,以便DA14580开始广告。
理想情况下,DA14580可以进入长时间睡眠。接下来,它可能会收到:
i.来自MCU(通过UART)的事件,如指示(要求发送到BLE中心),更新的广告数据,断开连接请求或
2BLE中心可能会向DA14580发送GATT读写命令。
那么,我们如何适当地处理所有这些,并且仍然保持DA14580处于长时间睡眠状态以节省电力。
2.是否有一个应用程序笔记,帮助在延长睡眠模式下读取ble_app_peripheral。配置、引脚、场景和其他细节?我们可以首先在DA14580上尝试,然后在我们的模块上复制它以获取实际的电流读数。我看到Training_04_sleep_modes_current_measurement_v1.0.pdf。我来检查一下。
你好dhrishi,
1.如果让应用程序处于活动状态app_on_system_powered过程中,无论启用哪种睡眠模式,系统都不会进入睡眠状态。
此外,假设您在下一个BLE事件即将发生之前允许系统休眠,那么它就足够智能,可以确定在此期间进入睡眠是否经济。如果不是,它将保持活跃。
对于您的申请,
从你的解释中,我了解到你正在使用UART上的HCI实现。在这种情况下,您可以使用外部唤醒机制从外部事件唤醒系统。要设置这一点,您将在休眠之前在一个特定分配的GPIO上启用中断。在休眠期间,如果MCU在该GPIO上发送事件,系统将唤醒,您可以进行所需的处理。
注意:如果缺少GPIO,您可以使用其中一个接口(UART)引脚,在睡眠前将其设置为GPIO,唤醒后将其修改为UART。详情请参阅系统软件部分Um-b-051: da14580以进一步了解该机制的工作原理。
2.是的,有一个应用程序提示AN-B-051 SmartSnippets功率分析器校准用于指导您完成当前的测量。也可参考AN-B-051 SmartSnippets功率分析器校准用于校准开发套件以获得准确的结果。
最好的
信用证