一段關代碼的鑒賞
在其他單位見到一位工程師,從事了上位軟件開發很多年。近幾年開始做電子產品的軟件。剛剛開發完一款通訊產品。平臺是stm32。其作品完整的體現了其在編程方面的深厚功底。觀之使人汗顏!我們可以欣賞幾行。
本文引用地址:http://www.104case.com/article/201607/294355.htmif (MC52I_SetUsart(USART1_Recv,USART1_Send)==MC52I_USART_ISNULL){
return ;
}
我們可以來看看MC52I_SetUsart(USART1_Recv,USART1_Send)函數的實現方法。
函數原型如下:
uint32_t MC52I_SetUsart(Recv_CALLBACK pRecv,Send_CALLBACK pSend)
{
if (pSend==NULL || pRecv==NULL){
return MC52I_USART_ISNULL;
}
pUsartSend = pSend;
pUsartRecv = pRecv;
return SYS_OK;
}
Recv_CALLBACK, Send_CALLBACK 是
typedef uint32_t (*Recv_CALLBACK)(void *pBuf,uint32_t *pSize);
typedef uint32_t (*Send_CALLBACK)(void *pBuf,uint32_t Size);
這是兩個指針類型,指向兩個函數。這兩個函數分別有兩個參數。
在調用過程MC52I_SetUsart(USART1_Recv,USART1_Send);兩個參數USART1_Recv,USART1_Send 指向兩個函數
uint32_t USART1_Recv(void *pBuf,uint32_t *pSize)
{
USART_Recv(&gSYS_USART1,pBuf,pSize);
return SYS_OK;
}
uint32_t USART1_Send(void *pBuf,uint32_t Size)
{
return USART_Send(&gSYS_USART1,pBuf,Size);
}
我們再來分析一下函數的原型:
uint32_t MC52I_SetUsart(Recv_CALLBACK pRecv,Send_CALLBACK pSend)
{
if (pSend==NULL || pRecv==NULL){
return MC52I_USART_ISNULL;
}
pUsartSend = pSend;
pUsartRecv = pRecv;
return SYS_OK;
}
如果傳入參數 pRecv或pSend指向空,那么返回MC52I_USART_ISNULL,大概可能是該模塊沒有安裝,否則將兩個全區指針指向這兩個參數。完成了對uint32_t USART1_Recv(void *pBuf,uint32_t *pSize)和uint32_t USART1_Send(void *pBuf,uint32_t Size)的調用。看起來非常繞。細細理解確實非常精妙
評論