This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CC2340R5: 调用osal_snv_write和osal_snv_read时,程序进入ICall_abort

Part Number: CC2340R5

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

请帮忙分析上述两种情况产生的原因及改善方案