我遇到地址/指针转换问题
我跟着OOTB recive的代码(uint8_t * Buf,uint32_t * Len);函数,在数据中断被接收时异步运行
uint8_t UserRxBufferFS[APP_RX_DATA_SIZE]; //static buffer
volatile uint8_t * __usrRxIndex = UserRxBufferFS; //volatile pointer to data end
static int8_t recive (uint8_t* Buf, uint32_t *Len)
{
uint8_t result = USBD_OK;
//copy *Len number of data from Buf to UserRxBufferFS
memcpy(UserRxBufferFS+__usrRxIndex, Buf, *Len);
if( (uint32_t)( (__usrRxIndex )- UserRxBufferFS) + *Len > 0xff){ //calculate buffer overflow
__usrRxIndex = UserRxBufferFS; //buffer
} else {
__usrRxIndex += *Len;
}
}
然后我尝试通过volatile __usrRxIndex捕获数据的结尾,每次捕获数据时都会更新。
但是当我尝试使用g ++ compilator编译时,我收到了错误:
error: invalid operands of types 'volatile uint8_t* {aka volatile unsigned char*}' and 'uint8_t (*)[512] {aka unsigned char (*)[512]}' to binary 'operator-'
我做了一些解决方法并将每个地址计算为数字,然后进行减法但我的问题是为什么g ++编译器不允许数组和指针减法?有一些简单的方法可以解决这个错误吗?
答案 0 :(得分:1)
在
memcpy(UserRxBufferFS+__usrRxIndex, Buf, *Len);
这个添加不应该编译,它没有意义。你可能想要:
memcpy(__usrRxIndex, Buf, *Len);
另一件事是你在memcpy
内存损坏后检测到缓冲区溢出。它需要在memcpy
之前检测缓冲区溢出。