你好,
我无法理解da1458x_config_advanced.h文件中下面宏的目的/意义。你能解释一下这些词的意思吗?
#define db_heap_sz.
#define env_heap_sz.
#define msg_heap_sz.
#定义NON_RET_HEAP_SZ
实际上,我正在通过UART从不同的控制器发送GATT数据库,并使用Task_App和使用Ke_msg_Alloc分配服务,特征和描述符。
添加一些之后,控制转移到wrap_platform_reset()。当我阅读对话框支持的一些答案时,我发现当内存不足时就会发生这种情况。
所以,我增加了所有这些的值,现在我的GATT数据库工作得很好。
不过,我想确切地理解上面每个宏的用途或用途。
谢谢,
Hrishikesh
设备:
嗨dhrishi,
这些宏定义了用于不同用途的内存段的大小。例如,调用KE_MSG_ALLOC将从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
#定义MSG_HEAP_SZ 1600
#定义NON_RET_HEAP_SZ 1024
您能否证明这些价值观证明,如果有任何问题(如最大尺寸等),请告诉我
你好,
我们需要添加几个新服务和大约10个特征。通过这种情况,发生了什么,即宏的增加的尺寸(上面提到的)正在超出执行区域zi_ret20的界限。处理这个的正确方法是什么?
当编译时,我得到的错误:
错误:L6220E:执行区域zi_ret20大小(9764字节)超过限制(8888字节)区域包含0个字节的填充和0字节的veeners
错误:L6221E:执行ream_ret20具有执行范围()与执行范围()的执行区域zi_ret21重叠
我需要至少2kb更多内存。如何做出增加区域大小,直到我可以做多少。
你好dhrishi,
我为耽搁道歉。
所以,为了更好地了解,你现在有多种服务,包括2个定制服务(580允许),其余是标准服务。
当您提到DA14580变得无响应时,您是否尝试调试它是由于堆栈问题而不是堆问题。请确认是否有任何与堆栈崩溃相关的问题。您可以通过简单地用模式填充内存并查看它被修改到哪一部分来实现这一点。
根据描述,总内存将是每种类型中所有动态分配的总和。
最好,
LC.
不。我的所有服务和characteristics are custom having 128 bit UUIDs.
我们有大量的服务(8-10),特征(50-55),特征值大小也相当大(每个特征几乎150字节)
不,我无法调试,因为DA14580是模块的一部分(具有我们的MCU和DA14580)。所以我们无法调试它。虽然,我可以验证它与内存有关,因为当我减少输入服务和特性时,它可以正常工作。只有,当我介绍服务或特征时,DA14580在添加GATT数据库上,DA14580在AD UART添加GATT数据库后没有响应
你好dhrishi,
DA14580具有8 kB的保留RAM。您只能在RET RAM中持有此类数据。这可以从地图文件监视,并且可以根据可用内存调整应用程序。请转发我的地图文件,以便我可以检查内存使用情况。
另外,您的应用程序是否进入深度睡眠状态?您是否需要保留内存中的所有服务/字符?我想知道如果你不操作深度睡眠来释放一些保留RAM,数据是否可以移动到常规RAM。
确认一下,你是在HCI上使用DA14581吗?
最好,
LC.
你好,
非常感谢您的支持。这么晚才回复很抱歉。
截至目前,我们计划使用延长睡眠。根据我的理解,在此睡眠模式下,8KB保留RAM与整个SYS RAM一起保留。对?
所以,我认为将一些数据移动到常规RAM应该是很好的。我会尝试第一次首先移动东西。如果有任何问题,我会发送地图文件。您能否分享您的电子邮件ID。
另外,我还想了解一些事情:
1.添加服务时,给出了总大小,我假设堆栈为该服务的特征值(根据该服务的大小)分配了许多内存。所以如下所示,哪种类型的堆用于存储:
DB_HEAP_SZ或ENV_HEAP_SZ或MSG_HEAP_SZ
2.如果我们决定使用延长睡眠,如果我将env堆和msg堆保留在保留RAM(利用8KB可用)并将DB堆移动到SYS RAM(或其他一些组合)?这种情况会有任何问题吗?
3.如果我们决定使用深度睡眠模式,我们是否可以通过修改API SystemInit()的值0-23之间的EM_MAP配置来保留超过8kB的内存。如果是,使用这种配置可以保留多少最大内存。
另外,您能告诉我使用扩展睡眠模式和深度睡眠模式的标准BLE外设的当前值吗?我只是想知道现在的收视率有什么不同。
谢谢,
Hrishikesh
你好dhrishi,
请提供您的电子邮件,我将转发一个安全文件夹给您。这可以用来上传地图文件。
1.添加任何服务/字符,内存从DB_HEAP_SZ分配。但是,由于整体代码和数据增加,RAM使用率(其他堆)将相应增加ASLO。
2.在延长睡眠中保持内存并没有区别。因此,您可以使用适合内存组织的任何组合。
3.在睡眠深处时,您可以保留的只是8KB。
4.在DA14580上,通常延长的睡眠电流范围在1.2 - 1.4 UA之间,深度睡眠的范围大约约650NA。但请记住,这可能因硬件设计和所使用的组件而异。
最好,
LC.
你好,
谢谢你的回复。有鉴于此,我假设所有内存都在扩展睡眠模式下保留。我打算使用扩展的睡眠模式。
因此,在功能方面,延伸和深度睡眠模式之间有什么区别?如果有任何指针同样。那么我要了解它会很有用。
我已经创建了我的应用程序基于ble_app_barebone样本应用程序(SDK: 5.0.4)。默认情况下,这里使用的电源模式是什么?
此外,我还将指针“app_on_system_powered”设置为需要定期调用的函数。我看到它要么返回GOTO_SLEEP和KEEP_POWERED。是否与电源模式有关(这里是延长睡眠时间)?
如果我不断地从这个函数返回KEEP_POWERED,会发生什么?
而且,如果我返回goto_sleep,那么UART上的任何活动都会唤醒它吗?
简而言之,我需要理解这些返回值指示什么以及结果是什么。
谢谢,
Hrishikesh
嗨dhrishi,
睡眠模式在我们的数据表和用户手册中有解释。你可以查阅安装7.1.1睡眠模式在我们的UM-B-051_DA1458x_software_platform_reference文档。
睡眠模式是定义的user_config.h将项目归档。默认的ble_app_barebone是ARCH_SLEEP_OFF这通常是我们的SDK中的默认值。这意味着它处于活动模式。
的.app_on_system_powered.当应用程序希望在BLE断电后保持系统活动时调用。这旨在为应用程序提供额外的处理时间,以进行一些数据/后台处理。根据这里调用的函数将决定应用程序是否必须保持供电或可以进入睡眠。如果你进入睡眠状态,那么它将在睡眠模式结束时被唤醒以处理BLE事件。关于唤醒DA14580的方法,请参考我们的UM。但是默认情况下,UART不会唤醒系统,而BLE会。
最好,
LC.
你好,
谢谢你的回复。两件事:
1.如果我修改user_config.h使用扩展睡眠模式,但整个返回KEEP_POWERED从我的app_on_system_powered回调,是否有任何扩展睡眠模式的使用?或者BLE仍然可以进入延长睡眠模式?
设置:我们的模块是一个外围解决方案,具有外部MCU和DA14580。外部单片机通过UART将GATT数据库和广告数据发送给DA14580, DA14580可以开始广告。
现在,理想情况下,DA14580可以延长睡眠。继续前进,它可能会收到:
一世。来自MCU(OVER UART)的事件,如指示(req要发送到BLE中央),更新了广告数据,断开请求或
II。BLE Central可能会将GATT读写命令发送到DA14580。
那么,我们如何恰当地处理所有这些问题,并保持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。请参阅系统软件部分嗯- b - 051: DA14580以进一步了解这一机制的工作原理。
2.是的,有一个应用笔记AN-B-051 SmartSnippets Power Profiler校准引导您通过当前的测量值。也参考AN-B-051 SmartSnippets Power Profiler校准用于响起DEV套件以获得令人惊讶的结果。
最好,
LC.