誰かが循環バッファインデックスの観点からビットマスキングがどのように機能するかを説明できますか?具体的には、次のコードで:
#define USART_RX_BUFFER_SIZE 128 /* 2,4,8,16,32,64,128 or 256 bytes */
#define USART_RX_BUFFER_MASK ( USART_RX_BUFFER_SIZE - 1 )
ISR(USART_RX_vect)
{
unsigned char data;
unsigned char tmphead;
/* Read the received data */
data = UDR0;
/* Calculate buffer index */
tmphead = ( USART_RxHead + 1 ) & USART_RX_BUFFER_MASK;
USART_RxHead = tmphead; /* Store new index */
if ( tmphead == USART_RxTail )
{
/* ERROR! Receive buffer overflow */
}
USART_RxBuf[tmphead] = data; /* Store received data in buffer */
}
インデックスをビットマスキングした結果、インデックスがラップアラウンドすることはわかっています。私の質問はなぜですか?また、なぜ「USART_RX_BUFFER_SIZE」は2の累乗でなければならないのですか?
ありがとうございました
ジョー