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.

[参考译文] CC2640R2F:在项目中通过不同的 C 文件发布事件。

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1213402/cc2640r2f-posting-an-event-from-different-c-file-in-project

器件型号:CC2640R2F

我将使用 simple_broadcaster 示例并在 advertData 中广播传感器值。 我的传感器在 SPI 上工作、因此我在 spi_sensor.c 中创建了一个任务 spi_task_fxn、并将其添加到 simple broadcaster 项目中。 我需要 在 spi_task_fxn 中调用"vfnSpiXfers"中发布事件、现在我正在 simple_broadcer.c 中等待该事件。可以通过项目中的其他 c 文件发布事件吗? 如果需要。 请解释一下、因为我不熟悉 Tirtos。

>> vfnSpiPerformanceXfers 代码

void vfnSpiPerformXfers (SPI_Handle masterSpi)
{
    uint8_t u8xfer_nb_bytes;
    static uint8_t u8Temperature = 0;
    static float fPressure = 0;
    static float fAccZ = 0;
    static float fAccX = 0;
    static float fVolt=0;


    char tempStr[10] = {0};
    //Int key;
    memset(bleStr,0,20);
    /* Prepare the Tx buffer for SPI transfers */
    u8xfer_nb_bytes = u8SpiFillTxBuffer();


    /* Launch the SPI transfers - this is a blocking operation */
  //

     vfnSpiTriggerXfers(masterSpi, u8xfer_nb_bytes);

    //key = Hwi_disable();

    /* Store sensor data in the application buffer.

       Note that the returned status is discarded here, but in a final application it should
       be used to check the validity of the data received and do a re-try in case transfers
       were not successfully */

    if(u8SpiStoreData())
    {

        u8Temperature = getTemperatureValue(gSendData.array_data[13]);
        fPressure = getPressureValue(gSendData.array_data[7], gSendData.array_data[6]);
        fAccZ = getAccelerometerValue(gSendData.array_data[9], gSendData.array_data[8]);
        fAccX = getAccelerometerValue(gSendData.array_data[11], gSendData.array_data[10]);
        fVolt = getVoltageValue(gSendData.array_data[12] );




        memset(tempStr, 0, sizeof(tempStr));
        memset(bleStr, 0, sizeof(bleStr));

        itoa(u8Temperature, tempStr);
        strcat(bleStr, tempStr);
        strcat(bleStr, ",");

        memset(tempStr, 0, sizeof(tempStr));
        ftoa(fPressure, tempStr, 2 );
        strcat(bleStr, tempStr);
        strcat(bleStr, ",");

        memset(tempStr, 0, sizeof(tempStr));
        
        ftoa(fVolt, tempStr, 2 );
        strcat(bleStr, tempStr);
        strcat(bleStr, ",");

        memset(tempStr, 0, sizeof(tempStr));
        
        ftoa(fAccX, tempStr, 2 );
        strcat(bleStr, tempStr);

      


Event_post(syncEvent,SBP_PERIODIC_EVT);
      

    }
  
}

>> simple_broadcer.c

static void SimpleBroadcaster_taskFxn(UArg a0, UArg a1)
{
  // Initialize application
  SimpleBroadcaster_init();

  // Application main loop
  for (;;)
  {
    // Get the ticks since startup
    uint32_t tickStart = Clock_getTicks();

    uint32_t events;

    events = Event_pend(syncEvent, Event_Id_NONE, SBB_ALL_EVENTS,
                        ICALL_TIMEOUT_FOREVER);

    if (events)
    {
      ICall_EntityID dest;
      ICall_ServiceEnum src;
      ICall_HciExtEvt *pMsg = NULL;

      if (ICall_fetchServiceMsg(&src, &dest,
                                (void **)&pMsg) == ICALL_ERRNO_SUCCESS)
      {
        if ((src == ICALL_SERVICE_CLASS_BLE) && (dest == selfEntity))
        {
          // Process inter-task message
          SimpleBroadcaster_processStackMsg((ICall_Hdr *)pMsg);
        }

        if (pMsg)
        {
          ICall_freeMsg(pMsg);
        }
      }

      // If RTOS queue is not empty, process app message.
      if (events & SBB_QUEUE_EVT)
      {
        while (!Queue_empty(appMsgQueue))
        {
          sbbEvt_t *pMsg = (sbbEvt_t *)Util_dequeueMsg(appMsgQueue);
          if (pMsg)
          {
            // Process message.
            SimpleBroadcaster_processAppMsg(pMsg);

            // Free the space from the message.
            ICall_free(pMsg);
          }
        }
      }
      if (events & SBP_PERIODIC_EVT)
        {

         uint8_t i = 0;
             

               uint8_t advData = 0;

              advertData[i++] = 0x02;   // length of this data
              advertData[i++] = GAP_ADTYPE_FLAGS;
              advertData[i++] =  GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED;

              //Setup up custom user data initially
              advertData[i++] = ADV_MAX_LEN - i - 1; // length of this data
              advertData[i++] = GAP_ADTYPE_MANUFACTURER_SPECIFIC; // length of this data

              i=ADVDATA_MANUF_DATA_IDX;

                   advertData[i++]=MACaddress[5];
                   advertData[i++]=MACaddress[4];
                   advertData[i++]=MACaddress[3];
                   advertData[i++]=MACaddress[2];
                   advertData[i++]=MACaddress[1];
                   advertData[i++]=MACaddress[0];

             
              for(i = ADVDATA_SENSOR_DATA_IDX; i < ADV_MAX_LEN; i++)
              {
                advertData[i] = bleStr[advData++];
              }
             GAPRole_SetParameter(GAPROLE_ADVERT_DATA, sizeof(advertData), advertData);
          

        }
    }
  }
}

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

    您好!

    是的、这是可以做到的。 您只需要使 Event_post ()中的变量可见。 示例。

    simple_broadcaster.h

    #define SBP_PERIODIC_EVT Event_Id_00
    
    // Bitwise OR of all events to pend on
    #define SBP_ALL_EVENTS (SBP_ICALL_EVT | \
    SBP_QUEUE_EVT | \
    SBP_PERIODIC_EVT)
    
    extern ICall_SyncHandle syncEvent;


    -kel

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

    尝试做同样的事情,但我无法在 simple_broadcenter_taskfxn 中收到事件

    >> spi_sensor.c

    #include <ti/sysbios/knl/Event.h>
    #include "simple_broadcaster.h"
    
    
    extern ICall_SyncHandle syncEvent;
    
    void vfnSpiPerformXfers (SPI_Handle masterSpi)
    {
        uint8_t u8xfer_nb_bytes;
        static uint8_t u8Temperature = 0;
        static float fPressure = 0;
        static float fAccZ = 0;
        static float fAccX = 0;
        static float fVolt=0;
    
    
        char tempStr[10] = {0};
       
        memset(bleStr,0,20);
        /* Prepare the Tx buffer for SPI transfers */
        u8xfer_nb_bytes = u8SpiFillTxBuffer();
    
    
        /* Launch the SPI transfers - this is a blocking operation */
     
    
         vfnSpiTriggerXfers(masterSpi, u8xfer_nb_bytes);
    
    
    
        /* Store sensor data in the application buffer.
    
           Note that the returned status is discarded here, but in a final application it should
           be used to check the validity of the data received and do a re-try in case transfers
           were not successfully */
    
        if(u8SpiStoreData())
        {
            u8Temperature = getTemperatureValue(gSendData.array_data[13]);
            fPressure = getPressureValue(gSendData.array_data[7], gSendData.array_data[6]);
            fAccZ = getAccelerometerValue(gSendData.array_data[9], gSendData.array_data[8]);
            fAccX = getAccelerometerValue(gSendData.array_data[11], gSendData.array_data[10]);
            fVolt = getVoltageValue(gSendData.array_data[12] );
    
    
            memset(tempStr, 0, sizeof(tempStr));
            memset(bleStr, 0, sizeof(bleStr));
    
            itoa(u8Temperature, tempStr);
            strcat(bleStr, tempStr);
            strcat(bleStr, ",");
    
            memset(tempStr, 0, sizeof(tempStr));
            ftoa(fPressure, tempStr, 2 );
            strcat(bleStr, tempStr);
            strcat(bleStr, ",");
    
            memset(tempStr, 0, sizeof(tempStr));
            ftoa(fVolt, tempStr, 2 );
            strcat(bleStr, tempStr);
            strcat(bleStr, ",");
    
            memset(tempStr, 0, sizeof(tempStr));
           
            ftoa(fAccX, tempStr, 2 );
            strcat(bleStr, tempStr);
    
         //event post to update advertising data
    
            Event_post(syncEvent,SBP_PERIODIC_EVT);
         
    
        }
      
    }

    >> simple_broadcaster.h

    #ifndef SIMPLEBROADCASTER_H
    #define SIMPLEBROADCASTER_H
    
    #ifdef __cplusplus
    extern "C"
    {
    #endif
    
    /*********************************************************************
     * INCLUDES
     */
    #include <icall.h>
    /*********************************************************************
     * CONSTANTS
     */
    
    /*********************************************************************
     * MACROS
     */
    #define SBP_PERIODIC_EVT Event_Id_00
    
    #define SBP_PERIODIC_EVT                      Event_Id_00
    
    #define SBB_ALL_EVENTS                        (SBB_ICALL_EVT    | \
                                                   SBB_QUEUE_EVT    | \
                                                  SBP_PERIODIC_EVT )
    // Event globally used to post local events and pend on system and
    // local events.
    static ICall_SyncHandle syncEvent;
    
    /*********************************************************************
     * FUNCTIONS
     */
    
    /*
     * Task creation function for the Simple Broadcaster.
     */
    extern void SimpleBroadcaster_createTask(void);
    
    /*********************************************************************
    *********************************************************************/
    
    #ifdef __cplusplus
    }
    #endif
    
    #endif /* SIMPLEBROADCASTER_H */

    >> simple_broadcer.c

    #include <ti/sysbios/knl/Task.h>
    #include <ti/sysbios/knl/Clock.h>
    #include <ti/sysbios/knl/Event.h>
    #include <ti/sysbios/knl/Queue.h>
    #include <ti/display/Display.h>
    #include <icall.h>
    #include "util.h"
    /* This Header file contains all BLE API and icall structure definition */
    #include "icall_ble_api.h"
    
    #include "broadcaster.h"
    
    #ifdef USE_RCOSC
    #include "rcosc_calibration.h"
    #endif //USE_RCOSC
    
    #include "board.h"
    
    #include "simple_broadcaster.h"
    
    
    
    
    
    static void SimpleBroadcaster_taskFxn(UArg a0, UArg a1)
    {
      // Initialize application
      SimpleBroadcaster_init();
    
      // Application main loop
      for (;;)
      {
        // Get the ticks since startup
        uint32_t tickStart = Clock_getTicks();
    
        uint32_t events;
    
        events = Event_pend(syncEvent, Event_Id_NONE, SBB_ALL_EVENTS,
                            ICALL_TIMEOUT_FOREVER);
    
        if (events)
        {
          ICall_EntityID dest;
          ICall_ServiceEnum src;
          ICall_HciExtEvt *pMsg = NULL;
    
          if (ICall_fetchServiceMsg(&src, &dest,
                                    (void **)&pMsg) == ICALL_ERRNO_SUCCESS)
          {
            if ((src == ICALL_SERVICE_CLASS_BLE) && (dest == selfEntity))
            {
              // Process inter-task message
              SimpleBroadcaster_processStackMsg((ICall_Hdr *)pMsg);
            }
    
            if (pMsg)
            {
              ICall_freeMsg(pMsg);
            }
          }
    
          // If RTOS queue is not empty, process app message.
          if (events & SBB_QUEUE_EVT)
          {
            while (!Queue_empty(appMsgQueue))
            {
              sbbEvt_t *pMsg = (sbbEvt_t *)Util_dequeueMsg(appMsgQueue);
              if (pMsg)
              {
                // Process message.
                SimpleBroadcaster_processAppMsg(pMsg);
    
                // Free the space from the message.
                ICall_free(pMsg);
              }
            }
          }
          if (events & SBP_PERIODIC_EVT)
            {
    
           
    
              uint8_t i = 0;
                
    
                   uint8_t advData = 0;
    
                  advertData[i++] = 0x02;   // length of this data
                  advertData[i++] = GAP_ADTYPE_FLAGS;
                  advertData[i++] =  GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED;
    
                  //Setup up custom user data initially
                  advertData[i++] = ADV_MAX_LEN - i - 1; // length of this data
                  advertData[i++] = GAP_ADTYPE_MANUFACTURER_SPECIFIC; // length of this data
    
                  i=ADVDATA_MANUF_DATA_IDX;
    
                       advertData[i++]=MACaddress[5];
                       advertData[i++]=MACaddress[4];
                       advertData[i++]=MACaddress[3];
                       advertData[i++]=MACaddress[2];
                       advertData[i++]=MACaddress[1];
                       advertData[i++]=MACaddress[0];
    
                  
                  for(i = ADVDATA_SENSOR_DATA_IDX; i < ADV_MAX_LEN; i++)
                  {
                    advertData[i] = bleStr[advData++];
                  }
                 GAPRole_SetParameter(GAPROLE_ADVERT_DATA, sizeof(advertData), advertData);
         
    
            }
        }
      }
    }

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

    您好!

    撤消您刚才所做的操作。 这是一个 C 编程问题。  

    https://stackoverflow.com/questions/25614732/how-do-define-global-variable-visible-across-several-c-files

    角度 simple_broadcer.c

    iCall_SyncHandle syncEvent;

    simple_broadcaster.h

    extern iCall_SyncHandle syncEvent;

    spi_sensor.c

    #include "simple_broadcenter.h"

    您可能还需要重命名 syncEvent,因为在 broadcer.c 中使用了相同的变量名称

    -kel