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; } }
카테고리 없음