zoukankan      html  css  js  c++  java
  • zigbee官方协议栈实验无线透明传输SerialApp.c解析

    绑定建立起来之后什么时候就启动串口传输了呢?

    从osal_start_system这个函数开始->>Hal_ProcessPoll()

    里面有如下的编译判断语句

    #if (defined HAL_UART) && (HAL_UART == TRUE)
      HalUARTPoll();

    由于本实验是串口传输实验判断条件成立

     HalUARTPoll();

    然后-》HalUARTPollDMA()

    这个函数的最后有这样一句话:

    if (evt && (dmaCfg.uartCB != NULL))
      {
        dmaCfg.uartCB(HAL_UART_DMA-1, evt);
      }

    进一步分析:

    static uartDMACfg_t dmaCfg;

    typedef struct {  

    uint16 rxBuf[HAL_UART_DMA_RX_MAX];

    #if HAL_UART_DMA_RX_MAX < 256   uint8 rxHead;

      uint8 rxTail; #else   uint16 rxHead;  

    uint16 rxTail;

    #endif  

    uint8 rxTick;  

    uint8 rxShdw;

      uint8 txBuf[2][HAL_UART_DMA_TX_MAX];

    #if HAL_UART_DMA_TX_MAX < 256   uint8 txIdx[2];

    #else   uint16 txIdx[2];

    #endif  

    volatile uint8 txSel;  

    uint8 txMT;  

    uint8 txTick;           // 1-character time in 32kHz ticks according to baud rate,                           // to be used in calculating time lapse since DMA ISR                           // to allow delay margin before start firing DMA, so that                           // DMA does not overwrite UART DBUF of previous packet     volatile uint8 txShdw;  // Sleep Timer LSB shadow.  

    volatile uint8 txShdwValid; // TX shadow value is valid  

    uint8 txDMAPending;     // UART TX DMA is pending

    halUARTCBack_t uartCB;

    } uartDMACfg_t;

    那halUARTCBack_t又是什么呢?

    typedef void (*halUARTCBack_t) (uint8 port, uint8 event);

    他是个指针函数,也就是说dmaCfg.uartCB是个halUARTCBack_t的回调函数,那他又是在哪儿赋值的呢?

    既然是回调函数,那么在要用的时候才会被赋值,我们回到void SerialApp_Init( uint8 task_id )这个函数分析,发现如下两句话:

     uartConfig.callBackFunc         = SerialApp_CallBack;
      HalUARTOpen (SERIAL_APP_PORT, &uartConfig);

    先分析第一句:halUARTCfg_t   uartConfig;

    typedef struct
    {
      bool                configured;
      uint8               baudRate;
      bool                flowControl;
      uint16              flowControlThreshold;
      uint8               idleTimeout;
      halUARTBufControl_t rx;
      halUARTBufControl_t tx;
      bool                intEnable;
      uint32              rxChRvdTime;
      halUARTCBack_t      callBackFunc;
    }halUARTCfg_t;

    也就是说uartConfig.callBackFunc也是typedef void (*halUARTCBack_t) (uint8 port, uint8 event);类型的函数指针。

    并且SerialApp_CallBack赋值给他uartConfig.callBackFunc,那我们会想到uartConfig.callBackFunc应该会继续把值赋值给dmaCfg.uartCB的

    继续分析:

    进入HalUARTOpen(uint8 port, halUARTCfg_t *config)--》》HalUARTOpenDMA(config)

    发现第一句话:static void HalUARTOpenDMA(halUARTCfg_t *config)
    {
      dmaCfg.uartCB = config->callBackFunc;
      // Only supporting subset of baudrate for code size - other is possible.

    这下该清楚了吧,也就是说dmaCfg.uartCB最终调用的是这个函数:

    static void SerialApp_CallBack(uint8 port, uint8 event)

    {  

      (void)port;

      if ((event & (HAL_UART_RX_FULL | HAL_UART_RX_ABOUT_FULL | HAL_UART_RX_TIMEOUT)) &&

    #if SERIAL_APP_LOOPBACK       (SerialApp_TxLen < SERIAL_APP_TX_MAX))

    #else       !SerialApp_TxLen)

    #endif

      {    

    SerialApp_Send();  

       }

    }

     然后就进入了SerialApp_Send(); 这个函数,首先读DMA,若有数据时进行发送,否则 设置事件

    osal_set_event(SerialApp_TaskID, SERIALAPP_SEND_EVT);

    继续查询。。。

  • 相关阅读:
    Tom和Jerry来了,Tom和Jerry走了——北漂18年(38)
    查找(一)史上最简单清晰的红黑树解说
    HDU4763-Theme Section(KMP+二分)
    Loadrunner得到server參数
    hdu 4002
    javascript——从「最被误解的语言」到「最流行的语言」
    【云快讯】之四十八《IBM和Cisco最新收购,加强Openstack易用能力》
    2013级学生两学期编程量统计
    Hadoop高速入门
    HDOJ 3339 In Action
  • 原文地址:https://www.cnblogs.com/ltfbk/p/2989005.html
Copyright © 2011-2022 走看看