2010-08-13 78 views
1

请帮助我了解两件事我在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

回答

0

功能是获取数据的“原始”缓冲液,和线:

usbRequest_t *rq = (void *)data; 

只是创建一个指向该缓冲区使用由usbRequest_t结构中指定的数据布局来访问它。

但绝对没有谈到这个操作昂贵 - 编译器将可能甚至没有实际的优化构建创建一个新的指针变量。

在那里另一方面,也有可能是便携性的担忧,但可能不适合您的特定应用很重要。

0

问题1:由于datauchar *,你需要将其转换为另一种类型。如果您愿意,您可以直接将它投射到usbRequest_t *

问题2:地址rq->bRequest需要花费尽可能多的时间来计算地址data[2]。在这两种情况下,您都会将指针从堆栈中取出并为其添加固定的偏移量。使用结构指针会产生更清晰的代码。

0

您的第一行(RQ =(空隙)..)告诉编译器把作为usbRequest_t

通过了8个字节假定这是从一个设备或网络的分组和编码要看着它,仿佛它相匹配的结构

是它创建了一个指针 - 但在生成的代码几乎肯定会发生的是,第一个字节的地址被简单地加载到寄存器。因此,有没有开销

反过来你rq-> bRequest的建议==东西实际上将数据复制 - 这是一个(V小8个字节)的开销

这是映射结构一个很常见的技术到串行化数据流上

0

关于您声称代码效率低下的问题,我在访问data[x]rq->x之间几乎没有区别。在这两种情况下,代码以基址开始,并偏移几个字节(显然最多为8个字节)。

[Base Address] + [Offset]将会是相同的,无论你是按数组还是按结构来做。如果简单的添加是程序中效率低下的根源,那么您的问题会更大。