在其他單位見到一位工程師,從事了上位軟件開發(fā)很多年。近幾年開始做電子產(chǎn)品的軟件。剛剛開發(fā)完一款通訊產(chǎn)品。平臺是stm32。其作品完整的體現(xiàn)了其在編程方面的深厚功底。觀之使人汗顏!我們可以欣賞幾行。 if (MC52I_SetUsart(USART1_Recv,USART1_Send)==MC52I_USART_ISNULL){ return ; } 我們可以來看看MC52I_SetUsart(USART1_Recv,USART1_Send)函數(shù)的實現(xiàn)方法。 函數(shù)原型如下: 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); 這是兩個指針類型,指向兩個函數(shù)。這兩個函數(shù)分別有兩個參數(shù)。 在調(diào)用過程MC52I_SetUsart(USART1_Recv,USART1_Send);兩個參數(shù)USART1_Recv,USART1_Send 指向兩個函數(shù) 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); } 我們再來分析一下函數(shù)的原型: 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; } 如果傳入?yún)?shù) pRecv或pSend指向空,那么返回MC52I_USART_ISNULL,大概可能是該模塊沒有安裝,否則將兩個全區(qū)指針指向這兩個參數(shù)。完成了對uint32_t USART1_Recv(void *pBuf,uint32_t *pSize)和uint32_t USART1_Send(void *pBuf,uint32_t Size)的調(diào)用。看起來非常繞。細細理解確實非常精妙。 |