我们有一个基于概述的申请报告示例。该应用程序应该通过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,true,proxr_env.tx_shdl + tx_idx_tx_tx_val);
然后,当发送片段时,从GattC_CMP_EVT_Handler上下文中,我们以与上述相同的方式发送下一个片段。
它似乎有效,但有时申请被崩溃了。
我有两个问题:
1.如上所述,是否可以发送数据?例如。从gattc_cmp_evt_handler和proxr_uart_message_handler上下文中调用prf_server_send_event是安全的吗?
你能给一些暗示如何追捕崩溃的原因吗?我只是获得一堆jlink错误
** jlink警告:CPU无法停止
*** JLINK错误:CPU运行时无法读取寄存器15(R15)
*** jlink错误:CPU正在运行时无法读取寄存器16(XPSR)
** jlink警告:CPU无法停止
所有寄存器都显示零(显然,因为JLINK LOOSE连接)。我在hardfault_handlerc中设置了断点,但没有命中。此外,在重新连接时,我检查了status_base内存位置,但它只有zeros。
谢谢,
迈克尔
设备:
迈克尔,
抱歉延迟,我们正在努力,当我们有新的东西时,我们会回到你身边。
谢谢mt_dialog。
如果您尚未发送上一个数据包的最后一个片段,您会在UART上收到另一个数据,您会这样做?请注意,PRF_SERVER_SEND_EVENT发送消息,当您收到GATTC_CMP_EVT时,邮件完成,如果您发送的消息比可以消耗,则堆内存将耗尽,然后芯片重新启动而不触发硬故障处理程序。如果您将数据变得更快,则可能需要对UART或删除数据包进行一些流量控制,而不是在空中发送的速度。
嗨joacime,
你可能是对的,你遇到问题的原因是你在某些时候你用完了内存。请在jump_table中的platform_reset函数中覆盖platform_reset函数,然后调试它,看看设备是否发出平台重置(这可能会导致您对jlink的麻烦)。大多数人可能会比你可以释放的速度分配内存,因此你用完了。是的,对于流量控制机制可以解决您的问题。
谢谢mt_dialog.
joacimwe,mt_dialog,
确实是由内存分配引起的问题,使用rest_mem_alloc_fail错误代码从res_msg_alloc调用platform_reset。
谢谢你的帮助。