any_014 发表于 2015-11-25 17:03:38

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

想用AD7193,在官网上扒了段程序,但SPI收发部分需要自己编写。
unsigned char SPI_Write(unsigned char slaveDeviceId,
                        unsigned char* data,
                        unsigned char bytesNumber)
{
    // Add your code here.
}

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

调用该函数的函数如下:
void AD7193_SetRegisterValue(unsigned char registerAddress,
                           unsigned long registerValue,
                           unsigned char bytesNumber,
                           unsigned char modifyCS)
{
    unsigned char writeCommand = {0, 0, 0, 0, 0};
    unsigned char* dataPointer    = (unsigned char*)&registerValue;
    unsigned char bytesNr         = bytesNumber;
   
    writeCommand = AD7193_COMM_WRITE |
                      AD7193_COMM_ADDR(registerAddress);
    while(bytesNr > 0)
    {
      writeCommand = *dataPointer;
      dataPointer ++;
      bytesNr --;
    }
    SPI_Write(AD7193_SLAVE_ID * modifyCS, writeCommand, bytesNumber + 1);
}

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里的数,所以总共发的数是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等等。你这么写中间层的代码不但会增加出错的几率,而且极难移植、修改或更新。我给你个代码示例:
void AD7193_SetRegisterValue(unsigned char registerAddress,
                                             unsigned long registerValue,
                                             unsigned char bytesNumber,
                                             unsigned char modifyCS)
{
    SPI_Write(0, AD7193_COMM_WRITE|AD7193_COMM_ADDR(registerAddress), 1);//send the special number.
    SPI_Write(0,(unsigned char*)& registerValue, bytesNumber);//send the data.
}

页: [1]
查看完整版本: 如何根据已给参数编写函数?