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

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

[复制链接]
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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版