我们有一个基于邻近报告示例的应用程序。应用程序应该通过UART从外部MCU接收数据并将其发送到空中。
更详细地说,proxr_uart_message_处理程序将消息组装起来,并通过
attmdb_att_set_值(proxr_env.tx_shdl+tx_IDX_tx_tx_VAL、碎片大小、碎片数据);
prf_服务器发送事件((prf_env_struct*)和proxr_env,true,proxr_env.tx_shdl+tx_IDX_tx_VAL);
然后,当片段被发送时,我们从gattc_cmp_evt_处理程序上下文以与上面相同的方式发送下一个片段。
它似乎可以工作,但有时应用程序会崩溃。
我有两个问题:
1.如上所述发送数据可以吗?例如,从gattc\u cmp\u evt\u处理程序和proxr\u uart\u消息处理程序上下文调用prf\u服务器\u发送\u事件是否安全?
2.你能给我一些关于如何找出撞车原因的提示吗?我只是得到了一堆Jlink错误,比如
**JLink警告:无法停止CPU
***JLink错误:在CPU运行时无法读取寄存器15(R15)
***JLink错误:在CPU运行时无法读取寄存器16(XPSR)
**JLink警告:无法停止CPU
所有寄存器都显示为零(很明显,因为Jlink断开了连接)。我在HardFault_HandlerC中设置了断点,但未命中。另外,当重新连接时,我检查了状态_基本内存位置,但它只有零。
谢谢
迈克尔
设备:
嗨,迈克尔,
很抱歉耽搁了,我们正在处理,我们有新的消息后会回复你。
谢谢你的对话。
如果您还没有发送上一个数据包的最后一个片段,那么通过uart接收到另一个数据量,您会怎么做?请注意,prf_server_send_事件会发送一条消息,当您收到GATTC_CMP_EVT时,该消息将完成,如果您发送的消息超过您的消耗量,堆内存将耗尽,然后芯片将重新启动,而不会触发硬故障处理程序。您可能需要对uart进行一些流量控制,或者,如果您获取数据的速度比通过空中传输的速度快,则可能需要丢弃数据包。
嗨,乔西姆,
也许你是对的,问题的原因是你在某个时候内存不足。请跳过跳转表中的平台重置功能,并对其进行调试,以查看设备是否发出平台重置(这可能会导致您在使用Jlink时遇到的问题)。最可能的情况是,分配内存的速度比释放内存的速度快,因此内存不足。是的,流量控制机制可以解决你的问题。
谢谢你的对话
朱西姆韦,对话山,
这个问题确实是由内存分配引起的,平台重置是用来自ke_msg_ALLOC的reset_MEM_ALLOC_FAIL错误代码调用的。
谢谢你的帮助。