你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

如何根据已给参数编写函数?

[复制链接]
any_014 提问时间:2015-11-25 17:03 /
想用AD7193,在官网上扒了段程序,但SPI收发部分需要自己编写。
  1. unsigned char SPI_Write(unsigned char slaveDeviceId,
  2.                         unsigned char* data,
  3.                         unsigned char bytesNumber)
  4. {
  5.     // Add your code here.
  6. }
复制代码


这个函数第二个参数是个发送数组的指针,第三个参数是发送字节数。
该怎么处理这个指针呢?是新建个数组把原来的全部复制过来?

调用该函数的函数如下:
  1. void AD7193_SetRegisterValue(unsigned char registerAddress,
  2.                              unsigned long registerValue,
  3.                              unsigned char bytesNumber,
  4.                              unsigned char modifyCS)
  5. {
  6.     unsigned char writeCommand[5] = {0, 0, 0, 0, 0};
  7.     unsigned char* dataPointer    = (unsigned char*)&registerValue;
  8.     unsigned char bytesNr         = bytesNumber;
  9.    
  10.     writeCommand[0] = AD7193_COMM_WRITE |
  11.                       AD7193_COMM_ADDR(registerAddress);
  12.     while(bytesNr > 0)
  13.     {
  14.         writeCommand[bytesNr] = *dataPointer;
  15.         dataPointer ++;
  16.         bytesNr --;
  17.     }
  18.     SPI_Write(AD7193_SLAVE_ID * modifyCS, writeCommand, bytesNumber + 1);
  19. }
复制代码
收藏 评论4 发布时间:2015-11-25 17:03

举报

4个回答
moyanming2013 回答时间:2015-11-25 21:22:44
本帖最后由 moyanming2013 于 2015-11-25 21:29 编辑

完全没必要复制,你直接操作形参指针就行了,操作的长度就是形参bytesNumber。

说下你的问题至少包含:
1.调用函数中的while循环,极有可能会造成writeCommand被撑爆,应该使用writeCommand的大小作为退出的条件。
2.调用函数中SPI_Write的第一个实参这么写无效,modifyCS指针是个野指针,你必须明确的指出是哪个ID。
3.调用函数中SPI_Write的第三个实参这么写基本是内存泄漏的,除非你规定SPI_Write中第三个形参的实际数据大小要减掉1,那么这显得画蛇添足。


dsjsjf 回答时间:2015-11-25 22:10:31
顶一下吧
any_014 回答时间:2015-11-26 17:27:19
本帖最后由 any_014 于 2015-11-26 17:29 编辑
moyanming2013 发表于 2015-11-25 21:22
完全没必要复制,你直接操作形参指针就行了,操作的长度就是形参bytesNumber。

说下你的问题至少包含:

2.第一个参数其实是不打算用的,不过既然这个参考函数里有这个参数,所以就先保留了。要不然,参考的相关函数都要改了。
3.不明白为什么内存泄漏呢?
这个芯片通讯情况是这样的:bytesNumber是想要发送的字节数,但是在这之前需要先发给特殊的数,就是writeCommand[0]里的数,所以总共发的数是bytesNumber+1;
1.我还没想明白呢,一会再仔细琢磨下。
moyanming2013 回答时间:2015-11-30 17:06:26
本帖最后由 moyanming2013 于 2015-11-30 17:09 编辑

1.你的writeCommand的大小不是bytesNr,是sizeof(writeCommand),如果bytesNr小于sizeof(writeCommand)那么while循环还好说,但没有人会给你这个保证。你如果说我的bytesNr就是4(按照后面你的意思推算的话),那你的代码只能自己看了,过2个月自己都看不明白了。更不用说:移植、修改或更新了。
2.即使AD7193_SLAVE_ID是unsigned char类型的,你也得强制转换一下。既然不用,干脆传入NULL不就行了?!
3.可以部分参考1,你的bytesNumber必须是4,不然对于SPI_Write的第三个实参writeCommand操作来说,极有可能指针出界,导致泄漏。没人能给你保证bytesNumber必须要是4。

你这里面最大的问题在于在AD7193_SetRegisterValue申请了一段内存,你该申请多少?应该是bytesNumber,那这个数是多少?没人知道,你怎么知道是4呢?也许后天就变成了12、30、95等等。你这么写中间层的代码不但会增加出错的几率,而且极难移植、修改或更新。我给你个代码示例:
  1. void AD7193_SetRegisterValue(unsigned char registerAddress,
  2.                                                unsigned long registerValue,
  3.                                                unsigned char bytesNumber,
  4.                                                unsigned char modifyCS)
  5. {
  6.     SPI_Write(0, AD7193_COMM_WRITE|AD7193_COMM_ADDR(registerAddress), 1);//send the special number.
  7.     SPI_Write(0,(unsigned char*)& registerValue, bytesNumber);//send the data.
  8. }
复制代码


所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
13245底部标题123相同标题
12底部标题123相同标题
33333底部标题123相同序号
3435底部标题-无链接
关注我们
st-img 微信公众号
st-img 手机版