一段关代码的鉴赏

发布时间:2016-7-25 11:16    发布者:designapp
关键词: stm32 , 编程
在其他单位见到一位工程师,从事了上位软件开发很多年。近几年开始做电子产品的软件。刚刚开发完一款通讯产品。平台是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)的调用。看起来非常绕。细细理解确实非常精妙。
本文地址:https://www.eechina.com/thread-171127-1-1.html     【打印本页】

本站部分文章为转载或网友发布,目的在于传递和分享信息,并不代表本网赞同其观点和对其真实性负责;文章版权归原作者及原出处所有,如涉及作品内容、版权和其它问题,我们将根据著作权人的要求,第一时间更正或删除。
您需要登录后才可以发表评论 登录 | 立即注册

厂商推荐

相关视频

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表