SDK版本:simplelink_lowpower_f3_sdk_8_10_01_02
CCS:Version: 12.7.1.00001
示例:basic_ble_LP_EM_CC2340R5_freertos_ticlang
情况1:
基于basic_ble_LP_EM_CC2340R5_freertos_ticlang示例开发应用程序,当串口收到某些特定字符串时,需要调用osal_snv_write将一些信息保存在flash中,或者调用osal_snv_read从flash中读取信息进行比对校验,在这个过程中发现程序进入到了ICall_abort。操作流程,当UART收到信息后,在uartParams.readCallback中使用BLEAppUtil_invokeFunction(read_uart_cb_to_invoke,NULL);将任务发送主函数。
read_uart_cb_to_invoke代码如下:
void read_uart_cb_to_invoke( char *pData )
{
const TickType_t xDelay = pdMS_TO_TICKS(1000);
// uint8_t flash_test_data[] = "1234567890";
uint8_t flash_test_data[10];
app_driver_uart_write("test begin\r\n",strlen("test begin\r\n"));
vTaskDelay(xDelay);
app_driver_uart_write("test end\r\n",strlen("test end\r\n"));
// osal_snv_write(APP_FLASH_ID_START,10,flash_test_data);
osal_snv_read(APP_FLASH_ID_START,10,flash_test_data);
vTaskDelay(xDelay);
app_driver_uart_write("test end\r\n",strlen("test end\r\n"));
// osal_snv_write(APP_FLASH_ID_START,10,flash_test_data);
osal_snv_read(APP_FLASH_ID_START,10,flash_test_data);
vTaskDelay(xDelay);
app_driver_uart_write("test end\r\n",strlen("test end\r\n"));
// osal_snv_write(APP_FLASH_ID_START,10,flash_test_data);
osal_snv_read(APP_FLASH_ID_START,10,flash_test_data);
vTaskDelay(xDelay);
app_driver_uart_write("test end\r\n",strlen("test end\r\n"));
// osal_snv_write(APP_FLASH_ID_START,10,flash_test_data);
osal_snv_read(APP_FLASH_ID_START,10,flash_test_data);
vTaskDelay(xDelay);
app_driver_uart_write("test end\r\n",strlen("test end\r\n"));
// osal_snv_write(APP_FLASH_ID_START,10,flash_test_data);
osal_snv_read(APP_FLASH_ID_START,10,flash_test_data);
vTaskDelay(xDelay);
app_driver_uart_write("test end\r\n",strlen("test end\r\n"));
// osal_snv_write(APP_FLASH_ID_START,10,flash_test_data);
osal_snv_read(APP_FLASH_ID_START,10,flash_test_data);
vTaskDelay(xDelay);
app_driver_uart_write("test end\r\n",strlen("test end\r\n"));
// osal_snv_write(APP_FLASH_ID_START,10,flash_test_data);
osal_snv_read(APP_FLASH_ID_START,10,flash_test_data);
vTaskDelay(xDelay);
app_driver_uart_write("test end\r\n",strlen("test end\r\n"));
// osal_snv_write(APP_FLASH_ID_START,10,flash_test_data);
osal_snv_read(APP_FLASH_ID_START,10,flash_test_data);
vTaskDelay(xDelay);
app_driver_uart_write("test end\r\n",strlen("test end\r\n"));
// osal_snv_write(APP_FLASH_ID_START,10,flash_test_data);
osal_snv_read(APP_FLASH_ID_START,10,flash_test_data);
}
read_uart_cb_to_invoke中执行几次osal_snv_read或者osal_snv_write时就进入到ICall_abort。已经排查过跟UART输出无关,将app_driver_uart_write("test end\r\n",strlen("test end\r\n"));注释掉仍然会进入ICall_abort。
情况2:
基于freertos新建任务,在任务中进行osal_snv_read或者osal_snv_write操作,程序同样会进入ICall_abort
新建任务:
void mainTaskFunction(void *par)
{
for(;;)
{
uint8_t temp[22] = "1234567890qwertyuiop";
uint8_t temp1[22];
app_driver_uart_write("mainTaskFunction line 1\r\n",sizeof("mainTaskFunction line 1\r\n") - 1);
osal_snv_read(0x98,20,temp1);
app_driver_uart_write("read\r\n",sizeof("read\r\n") - 1);
vTaskDelay(pdMS_TO_TICKS(1000));
osal_snv_write(0x98,sizeof(temp) - 1,temp);
app_driver_uart_write("mainTaskFunction line 2\r\n",sizeof("mainTaskFunction line 2\r\n") - 1);
}
}
TaskHandle_t mainTaskHandle;
void SystemInit(void)
{
xTaskCreate(mainTaskFunction,"mainTaskFunction",1000,NULL,4,&mainTaskHandle);
}
当初始化完成以后在void App_StackInitDoneHandler(gapDeviceInitDoneEvent_t *deviceInitDoneData)末尾调用void SystemInit(void)创建新任务,程序运行以后程序直接进入ICall_abort,期间修改任务优先级依然会进入ICall_abort
请帮忙分析上述两种情况产生的原因及改善方案