Ç请帮忙解释一下小码
请帮助我了解两件事我在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
?
功能是获取数据的“原始”缓冲液,和线:
usbRequest_t *rq = (void *)data;
只是创建一个指向该缓冲区使用由usbRequest_t
结构中指定的数据布局来访问它。
但绝对没有谈到这个操作昂贵 - 编译器将可能甚至没有实际的优化构建创建一个新的指针变量。
在那里另一方面,也有可能是便携性的担忧,但可能不适合您的特定应用很重要。
问题1:由于data
是uchar *
,你需要将其转换为另一种类型。如果您愿意,您可以直接将它投射到usbRequest_t *
。
问题2:地址rq->bRequest
需要花费尽可能多的时间来计算地址data[2]
。在这两种情况下,您都会将指针从堆栈中取出并为其添加固定的偏移量。使用结构指针会产生更清晰的代码。
您的第一行(RQ =(空隙)..)告诉编译器把作为usbRequest_t
通过了8个字节假定这是从一个设备或网络的分组和编码要看着它,仿佛它相匹配的结构
是它创建了一个指针 - 但在生成的代码几乎肯定会发生的是,第一个字节的地址被简单地加载到寄存器。因此,有没有开销
反过来你rq-> bRequest的建议==东西实际上将数据复制 - 这是一个(V小8个字节)的开销
这是映射结构一个很常见的技术到串行化数据流上
关于您声称代码效率低下的问题,我在访问data[x]
和rq->x
之间几乎没有区别。在这两种情况下,代码以基址开始,并偏移几个字节(显然最多为8个字节)。
[Base Address] + [Offset]
将会是相同的,无论你是按数组还是按结构来做。如果简单的添加是程序中效率低下的根源,那么您的问题会更大。