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.

CC2640R2 启动初始分过程中icall_directAPI函数报ICALL_ERRNO_TIMEOUT错误

CC2640R2 启动初始分过程中icall_directAPI函数报ICALL_ERRNO_TIMEOUT错误,这个错误是INT问题,有时能正常启动后系统运行起来,但大部分时间是不行,

背景环境如下:

1,CCS7.3., 

2, cc2640r2_sdk_1_50_00_58,

3, cc2640r2_sdk_ble_example_pack_1_50_00_62中的hid_emu_kbd demo。

  • 根据描述无法判断,是否对例程做了修改,具体是哪些?
    PS:协议栈版本及CCS版本都太低,建议升级到最新版再测试
  • 1,修改硬件配置设置,把CC2640R2_LAUNCHXL修改为CC2640R2DK_5XD
    2,修改进程ICALL_MAX_NUM_TASKS个数,由4修改为5
    3,其他修改跟系统启动无关。仅仅是APP task 函数的简单修改.

    另外 cc2640r2_sdk_ble_example_pack_1_50_00_62在TI官网是最新版本,这个版本对应的CCS是7.3, 是否还有更新的demo pack?


    uint32_t icall_directAPI( uint8_t service , icall_lite_id_t id, ... )
    {
    va_list argp;
    uint32_t res;
    icallLiteMsg_t liteMsg;

    // The following will push all parameter in the runtime stack.
    // This need to be call before any other local declaration of variable....
    va_start(argp, id);

    // Test that the API is not called in a Hwi or Swi context
    {
    BIOS_ThreadType threadtype = BIOS_getThreadType();

    if (threadtype == BIOS_ThreadType_Hwi ||
    threadtype == BIOS_ThreadType_Swi)
    {
    #ifdef HALNODEBUG
    #else /* ! HALNODEBUG */
    ICall_abort();
    #endif /* HALNODEBUG */
    }
    }

    // Create the message that will be send to the requested service..
    liteMsg.hdr.len = sizeof(icallLiteMsg_t);
    liteMsg.hdr.next = NULL;
    liteMsg.hdr.dest_id = ICALL_UNDEF_DEST_ID;
    liteMsg.msg.directAPI = id;
    liteMsg.msg.pointerStack = (uint32_t*)(*((uint32_t*)(&argp)));
    ICall_sendServiceMsg(ICall_getEntityId(), service,
    ICALL_MSG_FORMAT_DIRECT_API_ID, &(liteMsg.msg));

    // Since stack needs to always have a higher priority than the thread calling
    // the API, when we reach this point the API has been executed by the stack.
    // This implies the following:
    // - API are not called in critical section or in section where task
    // switching is disabled
    // It is possible that the stack is blocking on this API, in this case a
    // sync object needs to be used in order for this call to resume only when
    // the API has been process in full.
    {
    ICall_Errno errno;
    void *pCmdStatus = NULL;

    errno = ICall_waitMatch(ICALL_TIMEOUT_PREDEFINE, matchLiteCS, NULL, NULL,
    (void **)&pCmdStatus);
    if (errno == ICALL_ERRNO_TIMEOUT)
    {
    #ifdef HALNODEBUG
    #elif defined(EXT_HAL_ASSERT)
    HAL_ASSERT(HAL_ASSERT_CAUSE_ICALL_TIMEOUT);
    #else /* !EXT_HAL_ASSERT */
    ICall_abort();
    #endif /* EXT_HAL_ASSERT */
    }
    else if (errno == ICALL_ERRNO_SUCCESS)
    {
    if (pCmdStatus)
    {
    ICall_freeMsg(pCmdStatus);
    }
    }
    else
    {
    #ifdef HALNODEBUG
    #else /* ! HALNODEBUG */
    ICall_abort(); ; ------> stop here by breakpoint
    #endif /* HALNODEBUG */
    }
    }

    // The return parameter is set in the runtime stack, at the location of the
    // first parameter.
    res = liteMsg.msg.pointerStack[0];

    va_end(argp);

    return (res);
    }
  • 很久没逛官网了吧,最新版SDK是3.40:

  • 因为我们需要基于HID keyboad的profile来开发应用,只有在扩展demo包cc2640r2_sdk_ble_example_pack_1_50_00_62里支持这个profile demo , 目前这个版本在官网显示是最新版本,但它对应的SDK包是1.50.00.58版本才能正常运行,看如下链接扩展包支持指导,

    software-dl.ti.com/.../simplelink_example_pack_users_guide.html

    另外,扩展demo包是否有比目前cc2640r2_sdk_ble_example_pack_1_50_00_62版本更新的,如果有,请提供下载链接。谢谢
  • sorry 我看错了,SimpleLink CC2640R2 SDK BLE Example Pack的话最新版确实是1.50.关于icall的问题,请参考以下的类似解答:
    e2e.ti.com/.../648172
    e2e.ti.com/.../887989