一段关代码的鉴赏
发布时间:2016-7-25 11:16
发布者:designapp
在其他单位见到一位工程师,从事了上位软件开发很多年。近几年开始做电子产品的软件。刚刚开发完一款通讯产品。平台是stm32。其作品完整的体现了其在编程方面的深厚功底。观之使人汗颜!我们可以欣赏几行。 if (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)的调用。看起来非常绕。细细理解确实非常精妙。 |
网友评论