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/CC2640R2F:如何将事件从 SCS 任务发送到应用任务

Guru**** 2589280 points


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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/603722/rtos-cc2640r2f-how-to-signal-an-event-from-scs-task-to-app-task

器件型号:CC2640R2F

工具/软件:TI-RTOS

尊敬的 TI 专家:

我成功地安装并生成了用于 UART 仿真的 SCS 代码。

因此、当从 PC 接收数据时、它会发送回 PC。

我的问题是如何将接收事件信号发送到应用 MCU 而不是 PC。

我的理解是调用 scTaskAlertCallback 以使用'Semaphore_post'生成信号。

但是、我不知道如何在应用 CPU 中链接事件。 我仍然不熟悉信号。

我是否应该在 scTaskAlertCallback()中添加或修改某些内容?

void scTaskAlertCallback (void){

   //唤醒操作系统任务
   Semaphore_post (semaphore_handle (&semScTaskAlert));

}// scTaskAlertCallback

typedef 结构

 uint8_t 事件; //传感器控制器事件
 uint16_t data;  // UART 数据
} uartEvt_t;


静态空 SimpleBLECentral_scUART_enqueueMsg (uint8_t 事件、uint8_t 数据)

 uartEvt_t *pMsg;

 //创建消息的动态指针。
 if (pMsg = iCall_malloc (sizeof (uartEvt_t)))
 {
   pMsg->EVENT = EVENT;
   pMsg->data =数据;

   //将消息排队。
   Util_enqueueMsg (appMsgQueue、syncdEvent、(uint8*) pMsg);
 }

void SimpleBLECentrall_scUartTransferHandler (uint8数据)

 SimpleBLECentral_scUART_enqueueMsg (SBC_UART_EVT、DATA);

静态空 SimpleBLECentral_processAppMsg (hbcEvt_t *pMsg)


 switch (pMsg->HDR.event)
 {
   案例 SBC_State_change_EVT:
     SimpleBLECentral_processStackMsg ((iCall_HDR *) pMsg->pData);

     //释放堆栈消息
     iCall_freeMsg (pMsg->pData);
     中断;
   
   案例 SBC_UART_EVT:
     SimpleBLECentral_processUART ((((uartEvt_t*) pMsg)->data);
     中断;
     
   默认值:
     //不执行任何操作。
     中断;
 }

静态空 SimpleBLECentral_processUART (uint16_t 数据)

 Display_printf (dispHandle、6、0、"UART 数据:%x"、数据);

BR、

吉元

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

    我修改了下面代码中的回波部分以发出事件和数据、这似乎是可以的、但我不确定这一点。

    请告诉我它是否正常。

    void ScUart_taskFxn (UArg a0、UArg A1){

      //初始化传感器控制器

      scifOsalInit();

      /*

      *从传感器控制器到 MCU 域有两个事件信号:

      *。 就绪表示用于启动或停止传感器控制器任务的控制接口空闲且 就绪。

      *。 传感器控制器任务使用警报将系统 CPU 从待机状态唤醒并交换数据。

      *

      scifOsalRegisterCtrlReadyCallback (scCtrlReadyCallback);

      scifOsalRegisterTaskAlertCallback (scTaskAlertCallback);

      scifInit (&scifDriverSetup);

      //启动 UART 仿真器

      scifExecuteTasksOnceNbl (BV (SCIF_UART_MOSDER_TASK_ID);

      //启用波特率生成

      scifUartSetBaudRate (19200);

      //启用 RX (在启用起始位检测之前需要10个空闲位周期)

      scifUartSetRxFifoThr (SCIF_UART_RX_FIFO_MAX_COUNT / 2);

      scifUartSetRxTimeout (10 * 2);

      scifUartSetRxEnableReqIdleCount (10 * 2);

      scifUartRxEnable (1);

      //使能事件(半满 RX FIFO 或10位周期超时

      scifUartSetEventMask (BV_SCIF_UART_ALERT_RX_FIFO_UPLOW_THR | BV_SCIF_UART_ALERT_RX_BYTE_TIMEOUT);

      字符输出[]={"ABCDEFH"};

      scifUartTxPutChars (输出、sizeof (输出));

      //主循环

      while (1){

        //等待警报回调

        Semaphore_pend (Semaphore_handle (&semScTaskAlert)、BIOS_wait_forever);

        //清除警报中断源

        scifClearAlertIntSource();

        //回显 RX FIFO 中当前的所有字符

        int rxFifoCount = scifUartGetRxFifoCount();

        while (rxFifoCount--){

          //scifUartTxPutChar ((char) scifUartRxGetChar ());

          SimpleBLECentrall_scUartTransferHandler ((char) scifUartRxGetChar());

        }

        //清除触发此操作的事件

        scifUartClearEvents ();

        //确认警报事件

        scifAckAlertEvents ();

      }

    }// ScUart_taskFxn

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

    上述方法很好、但并不完美。
    如果 PC 终端持续快速地发送某些数据、则应用 CPU 端将丢失一些数据的几个字节。
    SCS 的常见问题解答提到"APP-CPU 可以轮询 AUX RAM 中的变量"。
    因此,应用 CPU 使用 scifUartRxGetChar()直接读取。 而是使用 SimpleBLECentrall_scUartTransferHandler (rxFifoCount)指示发送到应用 CPU 端的长度。

    void ScUart_taskFxn (UArg a0、UArg A1){

       //初始化传感器控制器
       scifOsalInit();

       /*
        *从传感器控制器到 MCU 域有两个事件信号:
        *。 就绪表示用于启动或停止传感器控制器任务的控制接口空闲且 就绪。
        *。 传感器控制器任务使用警报将系统 CPU 从待机状态唤醒并交换数据。
        *
       scifOsalRegisterCtrlReadyCallback (scCtrlReadyCallback);
       scifOsalRegisterTaskAlertCallback (scTaskAlertCallback);
       scifInit (&scifDriverSetup);

       //启动 UART 仿真器
       scifExecuteTasksOnceNbl (BV (SCIF_UART_MOSDER_TASK_ID);

       //启用波特率生成
       scifUartSetBaudRate (19200);

       //启用 RX (在启用起始位检测之前需要10个空闲位周期)
       scifUartSetRxFifoThr (SCIF_UART_RX_FIFO_MAX_COUNT / 2);
       scifUartSetRxTimeout (10 * 2);
       scifUartSetRxEnableReqIdleCount (10 * 2);
       scifUartRxEnable (1);

       //使能事件(半满 RX FIFO 或10位周期超时
       scifUartSetEventMask (BV_SCIF_UART_ALERT_RX_FIFO_UPLOW_THR | BV_SCIF_UART_ALERT_RX_BYTE_TIMEOUT);

       字符输出[]={"ABCDEFH"};
       scifUartTxPutChars (输出、sizeof (输出));
       
       //主循环
       while (1){

           //等待警报回调
           Semaphore_pend (Semaphore_handle (&semScTaskAlert)、BIOS_wait_forever);

           //清除警报中断源
           scifClearAlertIntSource();

           //回显 RX FIFO 中当前的所有字符
           int rxFifoCount = scifUartGetRxFifoCount();
           SimpleBLECentrall_scUartTransferHandler (rxFifoCount);

    /*
           while (rxFifoCount--){
               char Rx_data = scifUartRxGetChar();
               //scifUartTxPutChar (Rx_DATA);
               HufBLECentrall_scUartTransferHandler (Rx_DATA);
           }

           //清除触发此操作的事件
           scifUartClearEvents ();

           //确认警报事件
           scifAckAlertEvents ();
    *        
       }

    }// ScUart_taskFxn

    静态空 SimpleBLECentral_processUART (uint8_t length)

     display_printf (dispHandle、6、0、"UART 数据长度:%d、长度);
     while (length--){
         char Rx_data = scifUartRxGetChar();
         //scifUartTxPutChar (Rx_DATA);
         display_printf (dispHandle、6、0、"UART 数据:%x"、Rx_data);
     }
     //清除触发此操作的事件
     scifUartClearEvents ();

     //确认警报事件
     scifAckAlertEvents ();  

    我希望这对那些想要集成 SC UART 仿真器的用户很有用。

    BR、

    吉元

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

    很高兴您找到了一个适合您的实施方案。