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);

继续查询。。。