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.

[参考译文] CC2340R5:芯片卡在 uart2_write->SemaphoreP_PEND 中

Guru**** 2589245 points


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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1391354/cc2340r5-a-chip-stuck-in-uart2_write--semaphorep_pend

器件型号:CC2340R5

工具与软件:

大家好!

我在这个调用堆栈中卡住了

UART2_writeTimeoutBlocking->SemaphoreP_pend->xSemaphoreTag->xQueueSemaphoreTag->portYIELD_in_API。

在正常情况下、在函数  xQueueSemaphoreTake 中、变量 uxSemaphoreCount >0、不会进入 portYIELD_within_API。

我有很多芯片、使用相同的固件、只有一个出现此错误。

为什么会发生这种情况,如果有办法解决它?

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

    您好 Xuefeng.jin、

    我希望你做得好。 我想问一下、这是用于定制硬件还是 LaunchPad? 您在使用哪种 SDK?  

    Unknown 说:
    我有很多芯片、使用相同的固件、只有一个芯片有此错误。

    我们在同一个芯片上发现了这个吗?  

    您能否在代码进入此问题之前提供一个代码片段?

    谢谢!
    Alex F

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

    这是在具有 SDK 7.40.00.64的定制硬件上

    2.所有测试均使用定制硬件而不是 LaunchPad。

    3.我使用了 UART2_Mode_Blocking 作为 Uart2 writeMode。 每次 UART 写入都会卡住。
      在 uart2.c -> UART2_writeTimeoutBlocking 中

    SemaphoreP_PEND 调用 xSemaphoreTake、  

    在正常情况下、 uxSemaphoreCount > 0

    但在其他情况下、这个芯片运行、最后进入入口 YIELD_INHER_API、它卡在这里。

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

    您好!

    您能否在空示例中运行以下代码片段? 我想看看这个基本形式的 uart2_mode_blocking 是否仍会导致您的终端出现相同问题、因为它会卡住、只需打开 PuTTY 会话、然后键入一些字符即可正常工作。  

    void *mainThread(void *arg0)
    {
        /* 1 second delay */
        uint32_t time = 1;
    
        /* Call driver init functions */
        GPIO_init();
        // I2C_init();
        // SPI_init();
        // Watchdog_init();
    
        /* Configure the LED pin */
        GPIO_setConfig(CONFIG_GPIO_LED_0, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
    
        /* Turn on user LED */
        GPIO_write(CONFIG_GPIO_LED_0, CONFIG_GPIO_LED_ON);
        // Initialize UART2 parameters
        UART2_Params params;
        UART2_Params_init(&params);
        params.baudRate = 115200;
        params.readMode = UART2_Mode_BLOCKING;
        params.writeMode = UART2_Mode_BLOCKING;
        // Open the UART
        UART2_Handle uart;
        while(1)
        {
        uart = UART2_open(CONFIG_UART2_0, &params);
        // Enable receiver, inhibit low power mode
        UART2_rxEnable(uart);
        // Read from the UART.
        size_t  bytesRead;
        uint8_t buffer[1];
        int32_t status;
        status = UART2_read(uart, buffer, 1, &bytesRead);
        // Write to the UART
        size_t  bytesWritten;
        status = UART2_write(uart, buffer, 1, &bytesWritten);
        // Close the UART
        UART2_close(uart);
        }
    }

    谢谢!
    Alex F

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

    您好、Alex、

    作为示例代码、写入命令没有卡住。 我认为我的代码没有太大的不同。

    我的项目基于示例 data_stream、以及以下代码

    bStatus_t DSP_start( DSP_cb_t *appCallbacks )
    {
      uint8 status = SUCCESS;
    
      // Add data stream service
      status = DSS_addService();
      if ( status != SUCCESS )
      {
        // Return status value
        return ( status );
      }
    
      // Register to service callback function
      status = DSS_registerProfileCBs( &dsp_serverCB );
      if ( status != SUCCESS )
      {
        // Return status value
        return ( status );
      }
    
      // Registers the application callback function
      if ( appCallbacks )
      {
        dsp_appCB = appCallbacks;
      }
      else
      {
        return ( INVALIDPARAMETER );
      }
    
      UART2_Params uartParams;          //+++ Initialize UART
    
                                        //+++ Open UART in callback mode for both read and write (even if write is not used used):
      UART2_Params_init(&uartParams);
      uartParams.readMode       = UART2_Mode_CALLBACK;
      uartParams.writeMode      = UART2_Mode_BLOCKING;
      uartParams.readCallback   = uartReadCallback;
      uartParams.writeCallback  = uartWriteCallback;
      uartParams.baudRate       = 921600;

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

    您好!  

    看一下您的代码片段、当您使用 writeCallback 时、可能需要将 writeMode 更改为回调模式;作为一个测试、如果您执行该操作、将会发生什么情况? (基本来说、我们在回调模式中使用 writeCallback、但 writeMode 当前设置为阻塞)。  

    谢谢!
    Alex F

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

    尊敬的 Alex F:

    使用 UART2_Mode_CALLBACK 模式不会卡住、因为这不会访问第二个 SemaphoreP_PEND。 但在我这边、必须使用 UART2_Mode_blocking 以正常方式写入数据。

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

    您好!

    我的一位同事注意到以下主题中使用 BLE 堆栈的 UART 存在一个半类似的问题:

    https://e2e.ti.com/f/1/t/1386965/

    但在本例中、它似乎是状态、而不是信标。  

    通过 UART_WRITE 的"Buffer"(基本上是我们尝试发送的消息)的状态是什么? 此条目中是否仍包含数据?  

    谢谢!
    Alex F