你好Dialog_Support团队,
固件执行几分钟后,设备进入arch_system.c的wrap_platform_reset处理程序。
我的设备进行角色切换操作。它使用app_easy_timer在时间共享的基础上执行中心和外围角色。这里我附上角色转换部分的代码片段。我的应用程序也没有建立任何类型的连接。它接收USER_ADVERTISE_DATA,并根据接收到的数据进行进一步的操作。为了读取广告数据字符串,我使用了user_on_adv_report_ind函数。我还附上了user_on_adv_report_ind函数的代码片段。
Uint8_t advertising = true;
空白user_adv_stopped (uint8_t状态)
{
arch_set_pxact_gpio ();
//将GAP角色改为central
广告= false;
user_app_configuration_func (GAP_CENTRAL_MST);
}
空白user_scan_complete (uint8_t状态)
{
广告= true;
user_app_configuration_func (GAP_PERIPHERAL_SLV);
}
空白user_app_on_set_dev_config_complete ()
{
arch_set_pxact_gpio ();
如果(广告)
{
app_easy_gap_non_connectable_advertise_start ();
}
else //准备扫描
{
//启动扫描并在一段时间后停止扫描
user_scan_start ();
user_stop_scan app_easy_timer (200);
}
}
Void user_on_adv_report_ind (struct gapm_adv_report_ind const * param)
{
volatile static uint8_t param_data[ADV_DATA_LEN];
param_data[23] =参数- > report.data [23];
param_data[24] =参数- > report.data [24];
param_data[25] =参数- > report.data [25];
param_data[26] =参数- > report.data [26];
}
根据我在param_data中收到的值,我将采取进一步的操作。我使用了timer0和timer2的pwm对广告字符串接收的数据进行了进一步的处理。除了这个,我没有执行任何额外的功能。
现在,如果我在discovery套件上运行固件,几分钟后(大约5-7分钟)执行停止并转到wrap_platform_reset处理程序。这只发生在我收到任何数据在user_on_adv_report_ind函数和执行进一步的操作。如果我没有对收到的数据执行进一步的操作,那么固件不会去wrap_platform_reset处理程序。你能告诉我发生这种情况的原因和解决办法吗?
感谢和问候,
前腿帕特尔
嗨,前腿帕特尔
请问收到user_on_adv_report_ind函数的数据后你会做什么操作?wrap_platform_reset处理程序命中的可能原因如下:
1.来自主机的大量UART流量。
2.vi arch_printf打印太多内容,malloc会失败,会调用平台重置函数wrap_platform_reset
3.设备耗尽内存,如果设备耗尽内存,这将导致设备复位
如果问题与内存越界问题有关,那么应该增加堆大小。否则你应该控制uart波特率。
谢谢,PM_Dialog
嗨,前腿帕特尔
如前所述wrap_platform_reset发生的最明显的原因是由于内存分配失败,这意味着有一个内存泄漏你的西南,你分配数据的地方和你永远不会释放他们(您可以验证在函数的参数错误,应该RESET_MEM_ALLOC_FAIL)。关于应用程序的最佳堆,您应该通过改变da1458x_config_advanced.h文件中的堆的大小来进行实验,没有办法确切地知道您的应用程序应该拥有的堆的确切大小,但如果我的假设是正确的,并且存在内存泄漏,增加堆不会有帮助,它只会增加设备最终在平台重置时停止的时间。从app_on_adv_report_ind回调,我没有看到任何可疑的东西,可以导致这种行为(我没有看到任何内存分配,可以导致这种行为)。从一开始设备卡在前6分钟,现在卡在15或20分钟时,从flash运行,堆是相同的方式配置?或者你做过什么调整吗?当在开发工具包和自定义板上运行同一个项目时,会有不同的行为吗?你还提到了你的波特率,你是否使用UART,如果你使用UART,你是否使用arch_printf()功能?
由于PM_dialog
你好PM_Dialog,
谢谢你的回复。
1.因为在开始时设备卡在前6分钟,现在卡在15或20分钟从flash运行,堆是相同的方式配置?
-是的,这两种情况下堆大小是相同的。
2.当在开发工具包和自定义板上运行同一个项目时,会有不同的行为吗?
——是的。在开发工具包上运行良好。但在定制板上,它是停止广告后的可变数量的时间(从15分钟到2小时)。但是其他SDK的代码,例如ble_app_peripheral, blinky, timer0 PWM与自定义板运行良好。
3.你还提到了你的波特率,你是否使用UART,如果你使用UART,你是否使用arch_printf()功能?
—UART波特率为115200。我使用UART来执行arch_printf(),但现在我不使用arch_printf()功能。
与问候,
前腿帕特尔
你好,
只是为了澄清一些事情,我想我失去了你的一秒钟,你提到你的自定义设备在15分钟或2个小时的操作后卡住了,但运行这在开发工具包运行良好?也只有在您的自定义板上,在调试会话期间,您看到断言发生在wrap_platform_reset()函数?对吗?您是否验证过在flash中运行fw时,设备在平台复位功能中再次卡死?可以通过在设备卡住时热加载调试器来实现,也可以通过在wrap_platform_reset中的断言指令执行之前切换gpio来实现。
由于PM_dialog