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/LAUNCHXL-CC2650:简单中央信标和二进制信标

Guru**** 2589275 points
Other Parts Discussed in Thread: CC2650

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/601758/rtos-launchxl-cc2650-simple-central-and-binary-semaphore

器件型号:LAUNCHXL-CC2650
Thread 中讨论的其他器件:CC2650

工具/软件:TI-RTOS

您好!

我正在尝试开发自己的由 UART 连接驱动的中央应用、但我在这里面临一个奇怪的问题。

我在示例 UART_echo 上通过回调实现了 UART、并在该示例上使用了二进制信号量。 就像这样、我的回调发送一个信标、我的任务仅在它接收到这个信标时运行。 我将为您介绍 uartecho.c.

这个具有信标的示例运行得很好、我必须发送16个字节来获得我的信标、并且必须再次发送16个字节来获得第二个信标。

现在、我将 UART 添加到简单中央示例中、它正在工作、我能够读取和写入数据。 问题出在信号量,我构建的信号量与我在 uartecho.c 上制作的信号量完全相同,但这次任务从不在 ligne 等待 :  

Semaphore_pend (hSemUART、BIOS_wait_forever); 

我可以对 ligne 进行注释、结果与我的任务在运行时没有任何响铃的情况相同。

是否不建议在此项目上使用此类信标? 是否有人可以确认任务应该等待?

此致、

John

e2e.ti.com/.../uartecho.ce2e.ti.com/.../simple_5F00_central-app.rar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否尝试使用 ROV 来查看您的任务是否实际上被 Semaphore_pend()阻止? 此外、作为一个实验、您可以尝试对信标进行计数、并运行一个位。 如果计数值逐渐增加、表示您的发布信标的速度可能比您使用"pends"时所用的速度快。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、Tom Kopriva、

    感谢您的回答。 我尝试了您的实验、但它没有计数。

    我看到有一个关于我所做的事情的优先级任务问题、我将 UART 函数的优先级从1移动到4。 它导致了 UART 功能上的"内部错误"、正如我在 ROV 上看到的那样。

    无论如何、我仍然有相同的问题、Semaphore_pend 不会等待任何东西。 计数不会增加、顺便说一下、我删除了代码的 Semaphore_post、但函数仍在运行。 我不理解在哪种情况下、如果信号量被很好地初始化、挂起将无法工作。

    在 ROV 中、我可以看到有关 UART 任务的奇怪情况。 我暂停调试几次、任务的状态不同:"BlockedOn"、"unkNow"、"Semaphore: 0x20000026c"。 但在所有情况下、任务都在运行。

    此外、我在回调中放置了一个 LED 闪烁、它工作正常、回调工作正常。

    是否有人可以确认此问题?

    此致、

    John

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

    新数据:当我进行信标发布时、任务会被"抢先"、正如我在 ROV 中看到的、但没有其他任务正在运行、只有 iCall_taskEntry 是"就绪"、但没有任务正在运行。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如何初始化信号量? 是创建还是构造的? 您是否也能在 ROV 中看到信标的状态? (在构建 Semphore 时、不要使 Semaphore_Structt 成为静态的、这样 ROV 就可以看到它。) 以确保信号量已正确初始化。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Tom、

    感谢您的回答。

    是的、我对它进行了很好的初始化、因为它与我的 uartecho 示例完全相同、并且它在上面运行得很好。

    我可以看到 ROV 上的信标、有时它正在等待任务、有时不执行任何操作。 当它等待任务时、任务运行时不关心信标。

    此致、

    John

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

    [引用 user="John73"]当任务处于暂挂状态时,任务运行时不关心信标。[/quot]
    尊敬的73:

    您能解释更多详细信息吗? 如果您可以复制代码以初始化任务和信号量、这将会更容易。

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

    您好、Luu、

    感谢您的回答。

    以下是用于初始化任务和信号量的代码:

    -全球:

    Semaphore_Structt semUART;
    Semaphore_Params sParams;
    
    Semaphore_handle hSemUART; 
    #define task_stack_size 864
    #define task_PRI 4. 
    void taskUART_create (void)
    {
    Task_Params params;
    Task_Params_init (&params);
    params.priority = task_PRI;
    params.STACKSIZE = task_stack_size;
    params.stack = sbcTaskStack;
    
    Task_construct(&sbcTask, taskUART,&params,NULL);
    
    } 



    -在函数中:taskUART (UARg a0、UArg A1)

    Semaphore_Params_init (&sParams);
    sParams.mode = Semaphore_Mode_binary;
    
    Semaphore_construction (&semUART、0、&sParams);
    hSemUART = Semaphore_handle (semUART); 

    下面是我的完整函数和回调函数:  

    静态空 UART_ReadCallback (UART_Handle handle、void * rxBuf、size_t size)
    {
    
    PIN_setOutputValue (ledPinHandle、Board_LED1、!PINCC26XX_getOutputValue (Board_LED1));
    
    Semaphore_post (hUART);
    
    } 

    void taskUART (UARg a0、UARg A1){
    
    
    Board_initUART ();
    UART_Params_init (&uartParams);
    
    uartParams.writeDataMode = UART_DATA_binary;
    uartParams.readDataMode = UART_DATA_binary;
    uartParams.readReturnMode = UART_ReturnFull;
    uartParams.readMode = UART_MODE_CALLBACK;
    //uartParams.writeMode = UART_MODE_BLOCKING;
    //uartParams.dataLength = UART_LEN_8;
    uartParams.readEcho = UART_ECHO_OFF;
    uartReadParams.baudate = 115200;
    uartParams.readParams.readback = UART_Open;UART_Callback
    
    = UART_CALART0_Callback;uartParams_uartParams_uartCallback uartParams);
    
    if (UART == NULL){
    
    // erreur (红色 LED?)
    }
    
    Semaphore_Params_init (sParams);
    sParams.mode = Semaphore_Mode_binary;
    
    Semaphore_construction (&semUART、0、&sParams);
    hSemUART = Semaphore_handle (semUART);
    
    UART_WRITE (UART、"MiqroMaster "、12);
    UART_WRITE (UART、"初始化\n\r"、12);
    
    
    while (1){
    
    UART_READ (UART、rxBuff、BUFSIZE);
    
    UART_WRITE (UART、"正在运行!\n\n"10);
    
    
    Semaphore_pend (hSemUART、BIOS_wait_forever);
    }
    

    通过 uartecho 上的此代码,我可以看到“正在运行!” 一次在 UART 链路上、如果我在计算机上向 CC2650发送16个字符、则会是第二次。 但在 simple_central 上、我看到的是"正在运行!" 时间、就像我注释 Semaphore_pend 一样。

    此致、

    John

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的73:
    uartecho 的代码没有任何问题。 您是否发送第二个任务的代码?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Luu、

    我确信您的意思是"您是否发送了第二个任务的代码?"。 以下是我的所有代码(如果是您要求的代码)(已加入文件)

    e2e.ti.com/.../2117.simple_5F00_central.c

    e2e.ti.com/.../5722.main.c

    e2e.ti.com/.../simple_5F00_central.h

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

     尊敬的73:
    不能对 Task_construct(&sbcTask, taskuart,&params, NULL)和 Task_construct(&sbcTask, SimpleBLECentral_taskFxn、&taskParams、NULL);
    它们有两项任务。 因此、您需要两个指针来存储每个任务的信息。

    此外、您应该将其分离。 您可以看到 sensortag 示例以了解多任务的工作原理。 这是我用于 UART 任务的代码。 将在 main 函数中调用 FIOT_UART_CreateTask 函数。

    void FIOT_UART_Serial_Rx_CB (UART_Handle iHandle、void * OData、size_t count)
    {
    //!*********
    //!将 UART_Rx_Buf 复制到 UART_Tx_Buf
    //!*********
    
    //!*********
    //!将任务唤醒以处理
    //!*********
    Semaphore_post (UART_hSem);
    }
    /*********
    *职能-任务
    /*
    !
    秘书长的报告
    *@fn void FIOT_UART_CreateTask (void)
    *
    *@协议的简短任务创建函数
    *
    @param None
    *
    @return None
    *
    ******** /
    void FIOT UART_CreateTask (void)
    {
    Task_Params TaskParams;
    //!*********
    //!配置任务
    //!*********
    Task_Params_init (&TaskParams);
    TaskParams.stack = UART_TaskStack;
    TaskParams.STACKSIZE = UART_TASK_STACK_SIZE;
    TaskParams.priority = UART_TASK_PRIORITY;
    
    Task_construction (&UART_TaskStructt、FIOT_UART_TaskFxn、 &TaskParams,NULL);
    }/*
    !
    秘书长的报告
    *@fn void FIOT_UART_InitTask (void)
    *
    *@简要利用 UART 层
    *
    *@param None
    *
    @return None
    *
    ******** /
    void FIOT_UART_InitTask (void)
    {
    //!*********
    //!初始化 UART
    //!*********
    UART_Params uParams;
    
    UART_PARAMS_INIT (uParams);
    
    uParams.writeDataMode = UART_DATA_binary;
    uParams.readDataMode = UART_DATA_binary;
    uParams.readReturnMode = UART_return_full;
    uParams.readMode = UART_MODE_CALLBACK;
    uParams.readCallback = FIOT_UART_Serial_Rx_CB;
    
    UART_uHandle = UART_OPEN (Board_UART、&uParams);
    //!*********
    //!利用信标
    //!*********
    Semaphore_Params sParams;
    Semaphore_Params_init (&sParams);
    sParams.mode = Semaphore_Mode_binary;
    
    Semaphore_construction (&UART_sSem、0、 sParams);
    UART_hSem = Semaphore_handle (&UART_sSem);
    }
    /*!
    秘书长的报告
    *@fn void FIOT_UART_TaskFxn (UARg a0、UARg A1)
    *
    @协议的简短应用任务入口点。
    *
    *@param a0、A1 -未使用。
    *
    *@无返回
    *
    ******** /
    void FIOT UART_TaskFxn (UARg a0、UARg A1)
    {
    //!*********
    //!初始化 UART 层
    //!*********
    FIOT_UART_InitTask ();
    //!*********
    //!UART 层的循环
    //!*********
    对于(;;)
    {
    //!*********
    //!refesh 以读取新数据
    //!*********
    UART_READ (UART_uHandle、&UART_Rx、1);
    
    Semaphore_pend (UART_hSem、BIOS_wait_forever);
    //!*********
    //!处理数据
    //!*********
    
    } 

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

    非常感谢您的回答和帮助。 它解决了我的问题!
    我将尝试您管理 UART 连接的方法、这似乎是最好的方法。

    此致、
    John
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的73:
    好的。 很高兴能为您^^