본문 바로가기
카테고리 없음

버퍼[Buffer] - 큐 구조

by Luyin 2012. 3. 4.
1) UART 통신일 경우 인터럽트 서비스 루틴에서 바로 EnQueue함.
interrupt [USART0_RXC] void usart0_rxc(void)
{
    Uart0_EnQueue(UDR0);
}

2) Main 함수 또는 Timer/Counter 핸들러 내부에서 DeQueue함.
        
if(Uart0_Is_Empty() == FALSE) 
            Order = Uart0_DeQueue();


//UART
#define BUFFER_SIZE 1024
#define TRUE 1
#define FALSE 0

//USART 전역 변수
char u0_rx_buffer[BUFFER_SIZE];
int u0_rx_point_head = 0;
int u0_rx_point_tail = 0; 

/* 큐에 관한 함수들----------------------------------------------------------*/
char Uart0_DeQueue(void)
{
	char retVal = u0_rx_buffer[u0_rx_point_tail];
	increase_point_value(&u0_rx_point_tail);
	return retVal;
}

void Uart0_EnQueue(char data)
{
	u0_rx_buffer[u0_rx_point_head] = data;
	increase_point_value(&u0_rx_point_head);
}

int Uart0_Is_Empty(void)
{
	if(u0_rx_point_head == u0_rx_point_tail)
 	{
  		return TRUE;
	}
	return FALSE;
}

void increase_point_value(int* data_p)
{
	(* data_p)++;
	if(BUFFER_SIZE == (*data_p))
	{
		(*data_p) = 0;
	}
}