我们有一个基于接近报告示例的应用程序。该应用程序应该通过UART接收来自外部MCU的数据并将其发送到空中。
更详细地说,proxr_uart_message_handler组装消息并通过方法发送它的第一个片段(整个消息约为100字节)
attmdb_att_set_value (proxr_env。tx_shdl + TX_IDX_TX_TX_VAL, fragment_size, fragment_data);
prf_server_send_event ((prf_env_struct *) &proxr_env,真的,proxr_env。tx_shdl + TX_IDX_TX_TX_VAL);
然后,当片段被发送时,从gattc_cmp_evt_handler上下文,我们以与上面相同的方式发送下一个片段。
它似乎是工作的,但有时应用程序是崩溃。
我有两个问题:
1.是否可以像上面描述的那样发送数据?例如,从gattc_cmp_evt_handler和pror_uart_message_handler上下文调用prf_server_send_event是否安全?
2.你能给我一些提示,如何查找坠毁的原因吗?我只是收到一堆Jlink错误,比如
**JLink警告:CPU无法暂停
***JLink错误:不能读取寄存器15 (R15),而CPU正在运行
***JLink错误:不能读取寄存器16 (XPSR),而CPU正在运行
**JLink警告:CPU无法暂停
所有寄存器都显示为零(显然,因为Jlink失去了连接)。我在HardFault_HandlerC中设置了断点,但是没有命中。另外,当重新连接时,我检查了STATUS_BASE内存位置,但它只有零。
谢谢,
迈克尔
设备:
嗨,迈克尔,
很抱歉耽误了您的时间,我们正在处理中,有新情况我们会及时通知您。
谢谢MT_dialog。
如果您还没有发送前一个包的最后一个片段,那么您在uart上收到另一个数据量,您该怎么办?请注意,prf_server_send_event发送一条消息,当您接收到GATTC_CMP_EVT时,该消息已完成,如果您发送的消息超过了您所能消耗的数量,那么堆内存将耗尽,然后芯片将重新启动,而不会触发硬故障处理程序。您可能需要对uart进行一些流控制,或者如果您获取的数据比通过空气发送的数据更快,则可能需要删除数据包。
嗨Joacime,
也许您是对的,您的问题的原因是您在某个点上耗尽了内存。请您可以覆盖jump_table中的platform_reset函数并调试它,看看设备是否会发出平台重置(这可能会导致您使用Jlink时遇到的问题)。很可能您分配内存的速度比释放内存的速度要快,因此会耗尽内存。是的,流控制机制可以解决你的问题。
由于MT_dialog
Joacimwe MT_dialog,
这个问题确实是由内存分配引起的,使用来自ke_msg_alloc的RESET_MEM_ALLOC_FAIL错误代码调用了platform_reset。
谢谢你的帮助。