링버퍼 관련 코드 질문
펌웨어 시작이제 한달쨰...아직 C문법도 잘 모르는 초보입니다.
어떻게 어떻게 해서....링버퍼 구현했습니다.....근데...프로그램 테스트를 프로그램상에서 임의의 데이터를 넣어주고
터미널로 보내서 링버퍼 동작을 하는지 확인을 했는데...임의의 데이터를 키보드 입력으로 넣어줄려고 하는데
막히네요..... 코드 좀 봐주세요.... 키보드 입력받은 부분이 잘못인거 같은데.....잘 모르겠네요....
대충 프로그램 설명을 하면 링버퍼[100]에서 스타스 포인터와 엔드 포인터를 정하고 데이터 길이만큼
*m_load_ptr 과 *m_consume_ptr이 이동을 합니다.....Add_buffer() 에서 데이터 입력을 저장하고
Get_buffer() 에서 입력한 만큼 읽어갑니다... ( 1바이트씩 처리해야함(여러바이트라도 결국은 한바이트씩 처리) ) 이후
터미널상엔 버퍼안에 내용을 모두 뿌려줍니다.
아래 빨간색부분이 의심이 가는데 어떻게 수정을 해야할지 모르겠네요....
** 추가로 아래 코드로 테스트는 아스키모드로만 되더라구요....헥사 모드로 바꿀려면 프로그램 손 많이 되야되나요?
#include "io8535.h"
#include "string.h"
unsigned char *m_load_ptr, *m_consume_ptr;
unsigned char *m_buff_end;
unsigned char *m_buff;
unsigned char m_max_load, m_max_consume, m_data_in_buffer;
unsigned char buffer[100];
unsigned char rBuffer[10];
unsigned char i;
// 전송
void PUT( unsigned char TX_D )
{
while(!(USR & 0x20)); // 송신 가능 ?
UDR = TX_D; // 송신
}
// Updata_State
void Update_State(void)
{
if(m_consume_ptr == m_buff_end) m_consume_ptr = m_buff;
if(m_load_ptr == m_buff_end) m_load_ptr = m_buff;
if(m_load_ptr == m_consume_ptr)
{
if(m_data_in_buffer > 0)
{
m_max_load = 0;
m_max_consume = m_buff_end - m_consume_ptr;
}
else
{
m_max_load = m_buff_end - m_load_ptr;
m_max_consume = 0;
}
}
else if(m_load_ptr > m_consume_ptr)
{
m_max_load = m_buff_end - m_load_ptr;
m_max_consume = m_load_ptr - m_consume_ptr;
}
else
{
m_max_load = m_buff_end - m_load_ptr;
m_max_consume = m_buff_end - m_consume_ptr;
}
}
//RingBuf init
void Init_RingBuffer(void *buffer, unsigned char buffer_size)
{
unsigned char m_buffer_size = buffer_size;
m_buff = (unsigned char *)buffer;
m_buff_end = m_buff + m_buffer_size;
m_load_ptr = m_consume_ptr = m_buff;
m_max_load = m_buffer_size;
m_max_consume = m_data_in_buffer = 0;
Update_State();
}
// Add data
void Add_Buffer_Data(const void *inData, unsigned char len)
{
if(len > (unsigned char)m_max_load)
len = (unsigned char)m_max_load;
memcpy(m_load_ptr, inData, len);
m_load_ptr += len;
m_data_in_buffer += len;
Update_State();
}
// Get data
void Get_Buffer_Data(void *outData, unsigned char len)
{
if(len > (unsigned char)m_max_consume)
len = (unsigned char)m_max_consume;
memcpy(outData, m_consume_ptr, len);
m_consume_ptr += len;
m_data_in_buffer -= len;
Update_State();
}
// 키보드 입력
#pragma vector = UART_RX_vect
__interrupt void UART_RXD(void)
{
unsigned char *ch;
*ch = UDR;
Add_Buffer_Data(&ch, sizeof(ch));
Get_Buffer_Data(rBuffer, sizeof(ch));
for(i=0; i<10; i++)
{
PUT(buffer[i]);
}
}
void main(void)
{
// serial init
UBRR = 11; // 3.6864[MHz]일 경우 19200[bps]
UCR = 0x98; // 송신,수신 인에이블, 수신 인터럽트 인에이블
SREG = 0x80; // 전체 인터럽트 인에이블
Init_RingBuffer(buffer, 100);
}


댓글 달기