TI中文支持网
TI专业的中文技术问题搜集分享网站

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

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

babober:

经过进一步测试发现如果在程序中同时调用vTaskDelay和osal_snv_write,或者vTaskDelay和osal_snv_read就会使程序进入到ICall_abort。请帮忙分析造成这种现象的原因

,

Vivian Gao:

我看到你在8.10 SDK上,这种行为在8.40 SDK上也会重现吗?SDK版本之间进行了几次更改,包括错误修复,因此我想确认最新版本上是否仍然存在该问题。

,

babober:

想确认一下8.10 SDK是否确实存在这个异常,你们自己有验证过吗,因为我看到还有别人也提出这个问题了。至于8.40 SDK我还在测试中,有结果了我会同步上来。

,

babober:

在8.40 SDK版本上测试,情况1看起来得到了修复,目前测试未出现ICall_abort。但是情况2仍然会进入到ICall_abort,尝试将vTaskDelay替换成usleep和sleep函数仍然会进入ICall_abort,请帮忙分析原因。

,

Vivian Gao:

我认为使用最新的SDK进行测试也是一个好主意。此外,我恳请您在以下方面给予我帮助:您是否在回调函数之外成功执行了osal_snv_read(APP_FLASH_ID_START,10,FLASH_test_data)?我不确定那个flash地址的开头是什么。您能尝试使用CPUDelay()函数而不是vTaskDelay rtos延迟吗?尝试使用BLEAppUtil_invokeFunctionNoData(),只传递函数,不传递NULL指针。将数据缓冲区解析为osal_snv_read()函数,如下所示:(uint8*)databuf。

,

babober:

1.本程序使用的flash地址ID是0x98,根据NV的描述,这个ID是在customer可用范围内

2.BLEAppUtil_invokeFunctionNoData原型也是通过调用BLEAppUtil_invokeFunction(func,NULL)实现的

3.osal_snv_read(APP_FLASH_ID_START,10,FLASH_test_data)中FLASH_test_data已经是(uint8*)类型

现在的问题是:在情景1中,使用BLEAppUtil_invokeFunction将读写flash操作发送到TI提供的主函数任务中执行时,通过延时进行flash操作是可以的,但是在情景2中创建新的freertos任务,在新freertos任务中执行flash读写操作就会进入ICall_abort异常。

,

Vivian Gao:

抱歉,我不确定我是否理解场景一的问题是否得到了解决?请查看此处可能的ICall中止原因。

https://software-dl.ti.com/simplelink/esd/simplelink_lowpower_f3_sdk/8.40.00.61/exports/docs/ble5stack/ble_user_guide/html/ble-stack-5.x-guide/debugging-index-cc23xx.html#icall-abort

其中一个原因是任务的ICall寄存器不正确。请看这里:创建其他启用ICall的任务。

software-dl.ti.com/…/tasks.html

,

babober:

在场景一的问题,在8.1版本的SDK运行时,调试分析看到进入ICall_abort是因为ICall_setTimer导致的。在8.4版本的SDK中场景一的问题不会发生,不会进入ICall_abort

场景2新建freertos task,在8.1和8.4版本中运行都会失败,还不确定具体失败原因是什么

,

Vivian Gao:

我再看一下,请等待回复。

,

Vivian Gao:

对于场景1,让我们确认最新的SDK。对于场景2,我认为这是原因,因为新任务未注册ICall,请查看《用户指南》的这一部分Creating Additional ICall Enabled Tasks.

赞(0)
未经允许不得转载:TI中文支持网 » CC2340R5: 调用osal_snv_write和osal_snv_read时,程序进入ICall_abort
分享到: 更多 (0)