일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- OCPP
- homeassistant
- lambda
- 파이썬
- 완속충전기
- 충전기
- 보안
- IOT Core
- 플라스크
- 전기차충전
- STM32
- Android
- AWS
- esp8266
- 전기차충전기
- 홈어시스턴트
- flask
- thread
- YMODEM
- dynamodb
- 펌웨어
- raspberry
- 서버리스
- 안드로이드
- 에버온
- 급속충전기
- 전기차
- 디자인패턴
- everon
- 라즈베리파이
- Today
- Total
Louie NRT Story
[펌웨어] FreeRTOS - MessageQueue 본문
작성일: 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:
'전기차충전기' 카테고리의 다른 글
[펌웨어] RealTime 데이터 구조 (0) | 2022.03.08 |
---|---|
[펌웨어] printf 사용법 (0) | 2022.03.07 |
[안드로이드] WorkManager (0) | 2022.01.18 |
[안드로이드] Okhttp (0) | 2022.01.12 |
[전기차 충전기] 서울시 보조금 충전기 OCPP 1.6 연동 - 02 (0) | 2022.01.12 |