请帮助我了解两件事我在C代码中发现:Ç请帮忙解释一下小码
首先,是整个代码:
usbMsgLen_t usbFunctionSetup(uchar data[8])
{
usbRequest_t *rq = (void *)data;
static uchar dataBuffer[4]; /* buffer must stay valid when usbFunctionSetup returns */
if(rq->bRequest == CUSTOM_RQ_ECHO){ /* echo -- used for reliability tests */
dataBuffer[0] = rq->wValue.bytes[0];
dataBuffer[1] = rq->wValue.bytes[1];
dataBuffer[2] = rq->wIndex.bytes[0];
dataBuffer[3] = rq->wIndex.bytes[1];
usbMsgPtr = dataBuffer; /* tell the driver which data to return */
return 4;
}else if(rq->bRequest == CUSTOM_RQ_SET_STATUS){
if(rq->wValue.bytes[0] & 1){ /* set LED */
LED_PORT_OUTPUT |= _BV(LED_BIT);
}else{ /* clear LED */
LED_PORT_OUTPUT &= ~_BV(LED_BIT);
}
}else if(rq->bRequest == CUSTOM_RQ_GET_STATUS) {
dataBuffer[0] = ((LED_PORT_OUTPUT & _BV(LED_BIT)) != 0);
usbMsgPtr = dataBuffer; /* tell the driver which data to return */
return 1; /* tell the driver to send 1 byte */
}
return 0; /* default for not implemented requests: return no data back to host */
}
现在,usbFunctionSetup
得到的8个无符号字符数组。现在有线:
usbRequest_t *rq = (void *)data;
所以,我得到了左侧的声明,但是什么是右侧?我知道(void *)
被转换为这种类型,但为什么?
而第二个问题是,心不是这个代码效率低下?因为第一个函数接收8个字节的数据,并且它为它们创建了额外的指针。并且创建额外的指针,至少如果我是正确的,只是为了能够通过在usbRequest_t
结构中定义的名称来访问单个数据。那岂不是更简单,更高效的只是在代码中使用,而不是仅仅rq->bRequest == something
例如 data[2]==something
或者bRequest
比一个字节大,例如data[1] == low_byte_of_something && data[2]== high_byte_of_something
?