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.

CC2650 running sensor 例程,单独跑蓝牙可以被搜到,可以传数据,另一个任务单独跑也是正常的,二者一起跑,蓝牙就搜索不到了不直达

Other Parts Discussed in Thread: CC1350, CC2650

蓝牙优先级高,是3

另外一个任务优先级是2。无非就是一些串口和SPI操作。

两个任务各自独自运行都是好好的。 同时运行就各种问题。蓝牙搜不到。  

  • 1、请问还有一个是什么任务?
    2、请提供一下SDK版本及CCS版本信息
  • 1、adc采集,dac控制电压,串口发送采集数据等
    2、ble_sdk_2_02_02_25, 用的IAR8.1

    3、为什么每次发帖都要求修改个人信息,保存的时候又提示电话号码错误,莫名其妙
  • 请参考右面链接进行新任务的添加:dev.ti.com/.../node
    论坛发帖不便的问题我去咨询下网站开发人员,后续再来更新
  • 1、你的这个链接挺好的

    2、我在原本例子上,蓝牙部分未做任何更改。 自己新建的任务也是和蓝牙毫不相关 

    现在的问题是,为什么两个无关联的任务同时运行就不行,到底是哪里冲突了呢

  • 是IAR的堆栈不够么 ?

  • 蓝牙任务的优先级为2, 另外一个是1, 蓝牙的优先级高一些。
    为什么蓝牙跑不对,搜不到, 反而另外一个任务工作好好的 , 道理说不通啊
  • 蓝牙任务的优先级为2, 另外一个是1, 蓝牙的优先级高一些。
    为什么蓝牙跑不对,搜不到, 反而另外一个任务工作好好的 , 道理说不通啊
  • 如果把另外一个任务关闭掉, 蓝牙就可以被搜到, 跑的好好的,这说明了什么呢
  • 如果把另外一个任务的任务战缩小, 蓝牙就可被搜到了,但是手机上点连接后就没反应。
  • 把另外一个任务的战调整为100, 另外一个任务不运行了, 蓝牙也搜不到了
    把另外一个任务的战调整为200,另外一个任务不运行了, 蓝牙可以搜到,也可以收到蓝牙的数据。
  • 把另外一个任务的战调整为300,另外一个任务不运行了,蓝牙也搜不到了
  • 用CCS的ROV【runtime object view】查看一下各任务的内存使用情况

  • 我的ccs没有tools 这一栏 。

    我从驱动去掉一些不必要的内存消耗。然后调大另外一个任务的堆栈,然后另外一个任务可以运行了。
    蓝牙可以搜到了,但是手机订阅通知就没动静了,没有周期性的收到数据了。

    也就是说:

    根本原因还是另外一个任务的串口 和两个SPI 的操作,对蓝牙这个任务有影响了。
  • 看起来是的,你要不断调整内存,看看能否找到平衡点。建议更新一下CCS,用工具看会更直观
  • 我把另外一个任务主循环中所有的操作都注释掉,只保留Task_sleep(50 * 100);这个延时。

    仍然是只能搜到蓝牙,无法订阅通知并读取到数据。
  • 还有一个地方, 就是蓝牙只要能搜到,蓝牙能连接上,可以从其他特征值读取到数据,也有回复。 就是使能通知不行,不能收到周期性的数据。
  • www.ti.com/.../CCSTUDIO-WCS
    你们官网的第一个演示界面图也没看到tools这一栏啊, TOOLS是最近的版本才添加的么
  • CCS 7.1 及以上的都支持。你必须连上板子,在debug模式下,才会出现tools选项。ROV的使用请参考:

    software-dl.ti.com/.../rov.html
    training.ti.com/how-use-runtime-object-view
  • 这个错误是怎么回事

  • 请问你的SDK,CCS版本分别是什么?
  • ble_sdk_2_02_02_25
    CCS9.0
  • 发现running sonsor这个例程里面有个Board_InitKeys这个操作,初步定位这里面的key的IO和我另外一个任务的一些IO重叠冲突了。

    void Board_initKeys(keysPressedCB_t appKeyCB)
    {


    // Initialize KEY pins. Enable int after callback registered
    hKeyPins = PIN_open(&keyPins, keyPinsCfg);
    PIN_registerIntCb(hKeyPins, Board_keyCallback);

    #if defined (CC2650_LAUNCHXL) || defined (CC1350_LAUNCHXL)
    PIN_setConfig(hKeyPins, PIN_BM_IRQ, Board_BTN1 | PIN_IRQ_NEGEDGE);
    PIN_setConfig(hKeyPins, PIN_BM_IRQ, Board_BTN2 | PIN_IRQ_NEGEDGE);
    #elif defined (CC2650DK_7ID) || defined (CC1350DK_7XD)
    // PIN_setConfig(hKeyPins, PIN_BM_IRQ, Board_KEY_SELECT | PIN_IRQ_NEGEDGE);
    //PIN_setConfig(hKeyPins, PIN_BM_IRQ, Board_KEY_UP | PIN_IRQ_NEGEDGE);
    //PIN_setConfig(hKeyPins, PIN_BM_IRQ, Board_KEY_DOWN | PIN_IRQ_NEGEDGE);
    //PIN_setConfig(hKeyPins, PIN_BM_IRQ, Board_KEY_LEFT | PIN_IRQ_NEGEDGE);
    //PIN_setConfig(hKeyPins, PIN_BM_IRQ, Board_KEY_RIGHT | PIN_IRQ_NEGEDGE);
    #endif

    #ifdef POWER_SAVING
    //Enable wakeup
    #if defined (CC2650_LAUNCHXL) || defined (CC1350_LAUNCHXL)
    PIN_setConfig(hKeyPins, PINCC26XX_BM_WAKEUP, Board_BTN1 | PINCC26XX_WAKEUP_NEGEDGE);
    PIN_setConfig(hKeyPins, PINCC26XX_BM_WAKEUP, Board_BTN2 | PINCC26XX_WAKEUP_NEGEDGE);
    #elif defined (CC2650DK_7ID) || defined (CC1350DK_7XD)
    //PIN_setConfig(hKeyPins, PINCC26XX_BM_WAKEUP, Board_KEY_SELECT | PINCC26XX_WAKEUP_NEGEDGE);
    //PIN_setConfig(hKeyPins, PINCC26XX_BM_WAKEUP, Board_KEY_UP | PINCC26XX_WAKEUP_NEGEDGE);
    //PIN_setConfig(hKeyPins, PINCC26XX_BM_WAKEUP, Board_KEY_DOWN | PINCC26XX_WAKEUP_NEGEDGE);
    //PIN_setConfig(hKeyPins, PINCC26XX_BM_WAKEUP, Board_KEY_LEFT | PINCC26XX_WAKEUP_NEGEDGE);
    //PIN_setConfig(hKeyPins, PINCC26XX_BM_WAKEUP, Board_KEY_RIGHT | PINCC26XX_WAKEUP_NEGEDGE);
    #endif
    #endif //POWER_SAVING

    // Setup keycallback for keys
    Util_constructClock(&keyChangeClock, Board_keyChangeHandler,
    KEY_DEBOUNCE_TIMEOUT, 0, false, 0);

    // Set the application callback
    appKeyChangeHandler = appKeyCB;
    }

    1、把这个函数里面关于管教的配置的全部注释掉,还是只能搜到模块,建立连接后无法使能通知接受数据

    2、直接把这个函数注释掉,可以搜到模块,建立连接后断开就再也搜不到这个模块了。

  • static void RunningSensor_handleKeys(uint8_t shift, uint8_t keys)
    {

    return;

    // If a reset was in progress, cancel it.
    if (resetInProgress == TRUE)
    {
    resetInProgress = FALSE;

    Util_stopClock(&resetClock);

    #if USING_NEGLECT_TIMEOUT
    // If using neglect time and in a connection.
    if (gapProfileState == GAPROLE_CONNECTED)
    {
    // Restart neglect timer.
    Util_startClock(&neglectClock);
    }
    #endif //USING_NEGLECT_TIMEOUT

    return;
    }


    if (keys & KEY_SELECT)
    {
    // Reset in progress has started.
    resetInProgress = TRUE;

    #if USING_NEGLECT_TIMEOUT
    // Stop the neglect timer.
    Util_stopClock(&neglectClock);
    #endif //USING_NEGLECT_TIMEOUT

    // Start reset timer.
    Util_startClock(&resetClock);
    }
    else if (keys & KEY_UP)
    {
    // Set simulated measurement flag index.
    if (++sensorFlagsIdx == FLAGS_IDX_MAX)
    {
    sensorFlagsIdx = 0;
    }
    }
    else if (keys & KEY_RIGHT)
    {
    // If not in a connection, toggle advertising on and off.
    if (gapProfileState != GAPROLE_CONNECTED)
    {
    uint8_t advStatus;

    // Set fast advertising interval for user-initiated connections.
    GAP_SetParamValue(TGAP_GEN_DISC_ADV_INT_MIN, DEFAULT_FAST_ADV_INTERVAL);
    GAP_SetParamValue(TGAP_GEN_DISC_ADV_INT_MAX, DEFAULT_FAST_ADV_INTERVAL);
    GAP_SetParamValue(TGAP_GEN_DISC_ADV_MIN, DEFAULT_WHITE_LIST_ADV_DURATION);

    // Toggle GAP advertisement status.
    GAPRole_GetParameter(GAPROLE_ADVERT_ENABLED, &advStatus);
    advStatus = !advStatus;

    // If not already using white list, begin to do so.
    // Only do so if about to begin advertising.
    if (USING_WHITE_LIST && advStatus == TRUE)
    {
    uint8_t bondCount = 0;

    GAPBondMgr_GetParameter(GAPBOND_BOND_COUNT, &bondCount);

    if ((sensorUsingWhiteList == FALSE) && (bondCount > 0))
    {
    uint8_t value = GAP_FILTER_POLICY_WHITE;

    GAPRole_SetParameter(GAPROLE_ADV_FILTER_POLICY, sizeof(uint8_t),
    &value);

    sensorUsingWhiteList = TRUE;
    }
    }

    GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof(uint8_t), &advStatus);

    // Set state variable.
    if (advStatus == FALSE)
    {
    sensorAdvCancelled = TRUE;
    }
    }
    else if (gapProfileState == GAPROLE_CONNECTED)
    {
    // If connected, change rate of motion.
    if(++motionIdx >= MOTION_IDX_MAX)
    {
    motionIdx = 0;
    }

    motion = motionCycle[motionIdx];
    }
    }
    }
    这段代码干嘛用的
  • if (events)
    {
    // Running sensor periodic event.
    if (events & RSC_PERIODIC_EVT)
    {
    events &= ~RSC_PERIODIC_EVT;

    // Perform periodic sensor's periodic task.
    RunningSensor_periodicTask();
    }
    设断点发现:
    第一层if的判断可以进入
    第二层的周期性事件无法进入
  • 对按键事件进行处理
  • 那我按键的管脚不配置,但是按键事件的处理保留对蓝牙程序的运行没有影响吧

  • 现在反过来想一想,有没有可能是非蓝牙任务占用CPU资源过多,导致 蓝牙任务运行受阻,最终导致广播搜不到?