Louie NRT Story

[펌웨어] FreeRTOS - MessageQueue 본문

전기차충전기

[펌웨어] FreeRTOS - MessageQueue

hyeok0724.kim@gmail.com 2022. 3. 7. 20:04
반응형

작성일: 22년 7월 29일

 

Contents

1. Message Queue 개념도

2. Message Queue 만들기

3. Message Queue 보내는 Task01 코드

4. Message Queue 수신 Task02 코드

5. Message Queue 수신 데이터 출력 화면

6. Queue 버퍼 꽉 찬 상태에서 확인

 

 

1. Message Queue 개념도

 - Task끼리 데이터를 주고 받는데 여기서 중요한 것은 포인터 변수를 전송하는 것을 확인해야함

 - xQueueSendToFront() 함수를 사용하면 메시지를 맨 앞으로 보낼 수도 있고, xQueueSendFromISR()은 ISR 영역에서 사용하는 것으로 MessageQueue 보내는 방법을 선택 할 수 있음

 

 

 

2. Message Queue 만들기

 - Task 사이에서 데이터를 교환할 수 있는 Message Queue를 생성함

 - Message의 형태는 cmd -> 메시지 종류, Length -> 데이터 길이, Data -> 전달하고자 하는 데이터

 - Message Queue의 사이즈와 Item Size를 정의해줌

typedef struct s_msgqueue_def {
  uint8_t cmd;
  uint8_t length;
  uint8_t data[20];
}s_MSGQUEUE_DEF;

 

 

 

3. Message Queue 보내는 Task01 코드

 - 1초 간격으로 data[0] 의 값이 1씩 증가 시켜서 전달함

e_MSGQUEUE_DEF mqSnd  = {0, 0, {0,}};
uint32_t cnt = 0;

void task01_main() {
    mqSnd.cmd = 10;
    mqSnd.length = 1;
    mqSnd.data[0] = cnt++;
	osMessageQueuePut(MQ_SYSHandle, &mqSnd, 0U, 0U);
    osDelay(1000);
}

 

 

4. Message Queue 수신 Task02 코드

 - 0.5초 간격으로 Queue를 확인하여 데이터가 있다면 mqRec에 복사하여 수신받은 데이터를 출력함

 - 수신 받을때는 Buffer에 받은 데이터를 memcpy 하는 것을 확인 할 수 있음

e_MSGQUEUE_DEF mqRec  = {0,0,{0,}};

void task02_main() {
    if (osOK == osMessageQueuePut(MQ_SYSHandle, &mqRec, 0U, 0U)) {
    	printf("cmd: %d, data: %d \n\r", mqRec.cmd, mqRec.data[0]);
    }
    osDelay(500);
}

 

 

5. Message Queue 수신 데이터 출력 화면

 

 

6. Queue 버퍼 꽉 찬 상태에서 확인

  - 보내는 주기를 1초로 유지하고 받는 주기를 2초로 변경함

  - Queue가 꽉 차면 데이터를 더이상 보내지 못함

  - 2초에 한번씩 Queue가 비어지면 그때마다 Queue에 넣음을 알 수 있음

 

 1) 수신데이터 출력

 

 2) Queue 상태 확인

  - osMessageQueueGetCount(): 현재 Queue에 존재하는 데이터의 개수

  - osMessageQueueGetSpace(): 현재 Queue에 비어있는 데이터의 개수

  - osMessageQueueGetCapacity(): Queue의 전체 공간 크기

e_MSGQUEUE_DEF mqRec  = {0,0,{0,}};

void task02_main() {
	printf("GetCnt: %d\n", osMessageQueueGetCount(MQ_SYSHandle));
	printf("GetSpace: %d\n", osMessageQueueGetSpace(MQ_SYSHandle));
	printf("GetCapa: %d\n", osMessageQueueGetCapacity(MQ_SYSHandle));
    if (osOK == osMessageQueuePut(MQ_SYSHandle, &mqRec, 0U, 0U)) {
    	printf("cmd: %d, data: %d \n\r", mqRec.cmd, mqRec.data[0]);
    }
    osDelay(500);
}

 

 3) Queue 상태 출력 화면

 

Referece:

https://inf.run/u6Zp

 

FreeRTOS 프로그래밍 - 인프런 | 강의

RTOS를 사용하기만 하면 실시간 처리가 된다고 믿고 계시나요? 이 강의를 보시고 확인해보세요. 까다로운 인터럽트, 우선순위, 상호배제, 포팅에 대한 통찰력을 만들어드립니다., - 강의 소개 | 인

www.inflearn.com

 

반응형
Comments