你好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广告=真实;
空白user_adv_stopped (uint8_t状态)
{
arch_set_pxact_gpio ();
//将GAP角色改为中心角色
广告= 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(结构gapm_adv_report_ind const * param)
{
volatile静态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 kit上运行固件,几分钟后(大约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的代码,ex. 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