본문 바로가기
Embedded

시리얼 통신을 위한 Queue의 생성

by gigasound 2021. 8. 17.


Queue

임베디드 시스템의 프로세서 속도가 빠르기 때문에 오히려 인터럽트 발생이 많은 시리얼 통신을 RTOS를 이용해서 안정적으로 통신을 관리하는 방법이 사용됩니다.

이를 위해서는 RTOS가 제공하는 queue를 사용하거나, 자신이 queue를 만들어서 활용하기도 합니다. 그런데 RTOS가 제공하는 queue는 몇 개의 단점이 보여서 queue 클래스를 만들어서 활용하고 있습니다.

이 글에서는 아두이노를 위한 queue 생성 코드를 알아보겠습니다. 

//- 중복 컴파을 방지용
#ifndef MY_QUEUE_H
#define MY_QUEUE_H
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#include <Arduino.h>
#include <stdlib.h>
/******************************************************************************
* queue의 클래스
*/
class myQueue {
  public:
    //- 겍체 생성자, size<=312로 해야한다.
    myQueue(int size);
    //- 객체 해지자
    ~myQueue() {
      delete[] _data;  
    }
  private:
    //- queue의 읽기 쓰기 위치
    int _front;
    int _back;
    //- quqeue에 기록된 숫자
    int _count;
    //- queue를 위한 버퍼
    char* _data;
    //- quque 버퍼의 크기
    int _size;
  public :
    //- queue의 읽기 쓰기 위치
    inline int front();
    inline int back();
    //- quqeue에 기록된 숫자
    inline int count();
    //- quque 버퍼의 크기
    inline int size();
    //- queue에 쓰기
    void push(const char &item);
    //- queue에서 읽기
    char pop();
    //- queue의 기록 위치 초기화
    void clear();
};
/******************************************************************************
*/
myQueue::myQueue(int size){
  //- queue의 초기 조건
  _front = 0;
  _back = 0;
  _count = 0;
  _size = size;
  //- 버퍼 생성 
  _data = new char[_size + 1];   
}
/******************************************************************************
*  return :
*     기록된 데이터 숫자 
*/
int myQueue::count() {
  return _count;
}
/******************************************************************************
*  return :
*     기록 위치 
*/
int myQueue::front() {
  return _front;
}
/******************************************************************************
*  return :
*     추출 위치 
*/
int myQueue::back() {
  return _back;
}
/******************************************************************************
*  return :
*     버퍼 크기
*/
int myQueue::size() {
  return _size;
}
/******************************************************************************
*  item : 입력 문자
*/
void myQueue::push(const char &item){
  if(_count < _size) { 
    _data[_back++]=item;
    ++_count;
    if (_back > _size){
      _back -= (_size + 1);
    }
  }
}
/******************************************************************************
*  return :
*     추출 문자
*/
char myQueue::pop() {
  if(_count <= 0) {
    return 0;
  } 
  else {
    char result = _data[_front];
    _front++;
    --_count;
    if (_front > _size){
      _front -= (_size + 1);
    } 
    return result; 
  }
}
/******************************************************************************
* queue의 쓰기 읽기 초기화 
*/
void myQueue::clear() {
  _front = _back;
  _count = 0;
}

#endif

광고좀 꾹 눌러주시면 고맙겠습니다. 


위의 내용을 참조용으로만 사용해주세요. 무단 도용이나 무단 복제는 불허합니다.

기타 문의 사항은 gigasound@naver.com에 남겨 주시면 고맙겠습니다.

'Embedded' 카테고리의 다른 글

Arduino, FreeRTOS, LED Toggle  (0) 2021.10.23
라즈베리파이에서 UART 사용  (0) 2021.10.10
RaspberryPi-온도에 따라 제어되는 FAN 구성  (0) 2021.08.14
RaspberryPi-한글 설정  (0) 2021.08.11
MobaXterm, WinSCP의 설치와 활용  (0) 2021.08.11