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.

[参考译文] LP-EM-CC1354P10:传感器控制器、FreeRTOS 和信标超时

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1477271/lp-em-cc1354p10-sensor-controller-freertos-and-semaphore-timeout

器件型号:LP-EM-CC1354P10

工具与软件:

您好!  

我想让传感器控制器使用 FreeRTOS、使用 Sensor Controller Studio 提供的 DPL 和 OSAL。

我遇到的问题是我使用"scifStartTasksNbl"启动任务、然后等待 scifWaitOnNbl、但这不符合指定的超时要求。 它始终直接返回 SCIF_NOT_READY 错误。

        UART_PRINT("[DEBUG] Starting Touch task with ID: %d", SCIF_CAPACITIVE_TOUCH_TASK_ID);
        
        // Configure capacitive touch parameters
        scifTaskData.capacitiveTouch.cfg.isrcCurrent = SCIF_CAPACITIVE_TOUCH_D_ISRC_CURRENT;
        scifTaskData.capacitiveTouch.cfg.maxSmplPeriod = SCIF_CAPACITIVE_TOUCH_D_MAX_SMPL_PERIOD;
        scifTaskData.capacitiveTouch.cfg.minSmplPeriod = SCIF_CAPACITIVE_TOUCH_D_MIN_SMPL_PERIOD;
        
        if (scifStartTasksNbl(1 << SCIF_CAPACITIVE_TOUCH_TASK_ID) != SCIF_SUCCESS) 
        {
            UART_PRINT("[ERROR] Failed to start Capacitive Touch task");
            return 0;
        }

        ret = scifWaitOnNbl(200001);
        if (ret != SCIF_SUCCESS) 
        {
            UART_PRINT("[ERROR] Capacitive Touch task start timeout: %d", ret);
            return 0;
        }
        UART_PRINT("[DEBUG] Touch task started");

我对 FreeRTOS 还比较陌生、那么你有什么建议吗? 什么会导致不遵守超时要求?

请注意、它未在 ISR 内执行。  

谢谢!

C é dric

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

    尊敬的 C é dric:  

    您是否从我们使用 Sensor Controller Studio 生成的示例开始?  https://dev.ti.com/tirex/explore/node?node=A__AddniPdrlDWP1siaPICBSw__com.ti.SIMPLELINK_ACADEMY_CC13XX_CC26XX_SDK__AfkT0vQ__LATEST 

    我想您 在开始任务之前错过了对 scifInit (&scifDriverSetup)的调用。

    此致、
    等等

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

    尊敬的 Theo:  

    感谢您的答复!

    scifInit 之前被调用、这是完整的初始化代码。

     

    我认为这实际上是 FreeRTOS 信标超时的问题、因为当我刚好在 scifWaitOnNbl 之前添加睡眠时、该操作会成功。 这表明后台任务确实正在执行其任务。  

    static int initializeTasks(void)
    {
        SemaphoreP_Params semParams;
        int ret;
        
    
        // Initialize SCIF driver
        scifOsalInit();
        scifOsalRegisterCtrlReadyCallback(scCtrlReadyCallback);
        scifOsalRegisterTaskAlertCallback(scTaskAlertCallback);
        
        if (scifInit(&scifDriverSetup) != SCIF_SUCCESS) 
        {
            UART_PRINT("[ERROR] SCIF driver initialization failed");
            return 0;
        }
    
        // Create the semaphore used to wait for Sensor Controller ALERT events
        SemaphoreP_Params_init(&semParams);
        semParams.mode = SemaphoreP_Mode_BINARY;
        semScTaskAlertHandle = SemaphoreP_construct(&semScTaskAlert, 0, &semParams);
        UART_PRINT("[DEBUG] Alert semaphore created");
    
        // Reset task structures for selected tasks
        scifResetTaskStructs(activeTaskSelection, (1 << SCIF_STRUCT_INPUT) | (1 << SCIF_STRUCT_OUTPUT));
        UART_PRINT("[DEBUG] Task structures reset");
        
        // Wait for the task control interface to be ready
        if (scifWaitOnNbl(20000) != SCIF_SUCCESS) 
        {
            UART_PRINT("[ERROR] Task control interface timeout");
            return 0;
        }
        UART_PRINT("[DEBUG] Task control interface ready");
        
        // Start ADC task if selected
        if (activeTaskSelection & TASK_ADC_ONLY) 
        {
            UART_PRINT("[DEBUG] Starting ADC task with ID: %d", SCIF_ADC_DATA_LOGGER_TASK_ID);
            
            // Initialize ADC task's configuration if needed
            // Add any specific ADC configuration here
            
            if (scifStartTasksNbl(1 << SCIF_ADC_DATA_LOGGER_TASK_ID) != SCIF_SUCCESS) 
            {
                UART_PRINT("[ERROR] Failed to start ADC Logger task");
                return 0;
            }
    //        osi_uSleep(200000); //Without this delay, it fails. With it it succeeds
            if (scifWaitOnNbl(200002) != SCIF_SUCCESS)  //This delay is not respected
            {
                UART_PRINT("[ERROR] ADC Logger task start timeout");
                return 0;
            }
            UART_PRINT("[DEBUG] ADC task started");
        }

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

    尊敬的 Cedric:

    感谢您分享完整的初始化过程。 这看起来一切正常。

    只需确认:导出驱动程序时、您选择了 TI 驱动程序移植层?

    我检查了基础的驱动程序功能、看不到任何能解释您所看到的内容的东西。
    您能否在调试会话中检查对 scifWaitOnNbl()的调用确实失败、以便我们缩小问题范围?

    此致、
    等等


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

    是的、我选择了 TI 驱动程序移植层

    scifWaitOnNbl 调用 osalWaitOnCtrlReady 、该函 数调用 SemaphoreP_pend、一次超时为0、然后使用我指定的超时。  它们的调用  

    xSemaphoreTake 操作失败、并且返回  SemaphoreP_TIMEOUT
    从我看到的情况来看、调用链看起来不错。
    如果我在 scifWaitOnNbl 上设置一个断点 ,它会在之后执行罚款,因为它允许任务初始化完成。  
    我测试了一个简单的信标  
     
    我想这是某种比赛条件。 但我不确定应该如何调试。 查看跟踪任务和 hwi 执行序列的最佳方式是什么? 我无法使用 CCS 20和 cc1354开始跟踪。
     
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Cedric:

    感谢您提供调试信息。 我同意有关的呼吁,它似乎都很好。

    我不确定是什么原因导致您的情况中传感器控制器驱动程序的初始化未完全完成。 但到目前为止、我看到的最佳权变措施是使用某种延迟或引入标志、该标志可在初始化完成后发出信号。

    关于进一步调试、我想您可以使用 GPIO 切换和逻辑分析仪来跟踪项目执行。

    此致、
    等等