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.

[参考译文] RTOS/CC2640:iCall_errno_invalid_service:我的 GAP 任务终止、我可以#39;t 重新启动它

Guru**** 2581345 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/592447/rtos-cc2640-icall_errno_invalid_service-my-gap-task-terminates-and-i-can-t-restart-it

器件型号:CC2640

工具/软件:TI-RTOS

编译器:TI v16.9.2.LTS

RTOS:2_20_01_08

BLE 堆栈:2_02_01_18

堆栈被配置为作为外设+观测器运行

运行一段不确定的时间后、应用程序从我的 peripheral_observer 配置文件接收到一个 GAPROLE_ERROR 状态更改。

在调试器中、GAPROLE_ERROR 来自询问 GAP 的配置文件:

if (GAP_MakeDiscoverable (self Entity、&params)!=成功)

基本上、当调用 GAP_MakeDiscoverable 时、系统会尝试对 GAP 服务建立一个 ICall 调用、但该服务会终止。

所以:

1) 1) RTOS 如何在某些内容终止时告知您、以便您可以捕获它?

2) 2)我可以重新启动 GAP、还是应该重新启动器件?

3) 3)据我所知、我在所有任务堆栈和堆上都有大量开销、而在 RTOS 查看器中看不到错误、没有堆栈溢出等  所有的内存 alloc/dealloc 看起来都是平衡的、每当发生器件发现事件时、我都会将信息复制到事件循环的新消息中。  我在执行设备发现时关闭广播。

真的不确定如何在这里继续。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    服务终止意味着什么? 如果您在 gap.h 中查看 API 说明、它应该会返回一些错误代码:

    /**
    *@简介 设置或更改广播。 也会开始广播。
    *
    *@PAR 对应的事件:
    *@ref gap_make_Discovery_done 类型的事件@ref gapMakeDiscoverableRspEvent_t
    *
    *@param 任务 ID -接收事件的任务
    *@param pParams -广播参数
    *
    *@返回 @ref 成功:广播请求发送到堆栈
    *@返回 @ref bleIncorrectMode:配置文件角色无效
    *@返回 @ref bleAlreadyInRequestedMode:已在广播
    *@返回 @ref bleNotReady:尚未设置广播数据
    *
    extern bStatus_t GAP_MakeDiscoverable( uint8 taskID、gapAddertisingParams_t *pParams );

    请告诉我们函数的返回值。

    祝你一切顺利
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    啊、这实际上是因为我做了一个非常愚蠢的剪切和粘贴编码。

    BLE 堆栈随附的示例观测器.c 仅检查返回代码是否成功、它不做任何其他区分、如果不成功、则将观测器角色推入 GAPROLE_ERROR。  这显然是愚蠢和错误的。

    我处理错误的方式也是错误的。  我将处理所有故障码并重试。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    因此、稍后会进行更多的错误检查。 我在主应用程序任务中使用时钟每30秒执行一次发现。 发现仅持续3秒。

    但是、似乎有一种情况、即下次我的时钟触发时发现仍在进行。

    bStatus_t 结果为"bleAlreadyInRequestedMode"。

    我猜我当时会打电话取消发现模式、但如果蓝牙堆栈卡在有趣的状态、这是否能充分修复蓝牙堆栈? 似乎奇怪的是、我要求调查完成10倍的时间、它会一直等待发现完成。