K60 下面是官方例程中的。
由于发送或接收描述符环开始寄存器的低3位均为0,所以第一个缓冲区描述符BD首地址必需按8字节对齐,官方手册建议16字节对齐,因此有如下代码:
/* 寻找<发送描述符数组空间>中的16字节对齐的地址,即低四位为0的起始地址*/
unsigned char *pcBufPointer;//为函数内部定义的临时变量
pcBufPointer = &( xENETTxDescriptors_unaligned[ 0 ] );
while( ( ( unsigned long ) pcBufPointer & 0x0fUL ) != 0 )
{
pcBufPointer++;
}
xENETTxDescriptors = ( NBUF * ) pcBufPointer;
/* 寻找<接收描述符数组空间>中的16字节对齐的地址*/
pcBufPointer = &( xENETRxDescriptors_unaligned[ 0 ] );
while( ( ( unsigned long ) pcBufPointer & 0x0fUL ) != 0 )
{
pcBufPointer++;
}
xENETRxDescriptors = ( NBUF * ) pcBufPointer;
/*
* 可为何有如下代码:寻找<接收缓冲区空间>中的16字节对齐的地址。
* 接收缓冲区没有要求必须对齐啊!,求解?
*/
pcBufPointer = &( ucENETTxBuffers[ 0 ] );
while( ( ( unsigned long ) pcBufPointer & 0x0fUL ) != 0 )
{
pcBufPointer++;
}
数据定义(全局变量):
static unsigned char xENETTxDescriptors_unaligned[ ( configNUM_ENET_TX_BUFFERS * sizeof( NBUF ) ) + 16 ];
static unsigned char xENETRxDescriptors_unaligned[ ( configNUM_ENET_RX_BUFFERS * sizeof( NBUF ) ) + 16 ];
static unsigned char ucENETTxBuffers[ ( configNUM_ENET_TX_BUFFERS * configENET_TX_BUFFER_SIZE ) + 16 ];
static unsigned char ucENETRxBuffers[ ( configNUM_ENET_RX_BUFFERS * configENET_RX_BUFFER_SIZE ) + 16 ];
static NBUF *xENETTxDescriptors;
static NBUF *xENETRxDescriptors; |