상세 컨텐츠

본문 제목

RTOS 맛보기 (5) - Task 생성하기(최종 실습)

펌웨어 설계

by Zin9 2023. 1. 27. 23:37

본문

728x90

 

 

RTOS 맛보기 (4) - 인터럽트로 문자열 출력하기

RTOS 맛보기 (3) - 인터럽트 발생하기 RTOS 맛보기 (2) - CubeMX 설정하기 RTOS 맛보기 (1) - 인터럽트로 시작하기 우리는 드라이버를 사용할 때 MCU를 사용한다. MCU를 사용하면서 일반적인 인터럽트나 타

zin9.tistory.com

 

중간에 main.c 코드 있으니 바로 다운받아서 컴파일 해도 좋다!

 

이전 시간에 사용했던 인터럽트 코드를 지우자.
stm32fxx_it.c에 작성된 callback 함수를 주석처리하거나 삭제한다.
필자는 주석처리하고 RTOS로만 코드를 실행했다.

 

RTOS를 구현하기 위해 3개의 Task를 생성한다.

 

RTOS는 1[ms] 주기로 정의된 Task가 전부 실행된다.
단, 모든 Task의 실행 시간의 합이 1[ms]를 넘지 않아야 한다.
1[ms]가 넘어도 되는 경우도 있지만, 다음에 설명하도록 한다.

 

CubeMX를 켜보자.

 

 

FREERTOS 항목에서 3개의 태스크를 추가해준다.

1. TskMain - 기본 Task로 우선 순위가 가장 높다. 100[ms]마다 적색 LED를 토글한다.

2. TskUART_200ms - 매 200[ms]마다 UART 통신로 문자열을 송신하고, 녹색 LED를 토글한다.

3. TskUART_PinB1 - 파란 버튼이 눌리면 1회 UART로 문자열을 송신한다.(인터럽트로 구현하고 싶었지만 아직 공부가 안 되어 있다..)

 

 

"GENERATE CODE"를 클릭하면 Task가 생성된다.

main.c의 상단에 가면, 각종 핸들러 변수 정의와 함께 태스크에 대한 정의가 생성된다.

 

(기본 설정값으로 했을 때 잘 안 되었던 점)
1. 맨 왼쪽의 디폴트 태스크는 사이즈가 4096이었지만, 실행 오류로 인해 128로 수정했다. UART 통신 기능이 동작하지 않았었다.
2. TskUART_200ms의 우선순위를 osPriorityLow로 했을 때 기능이 동작하지 않아서 osPriorityLow1으로 변경했다.

두 가지 어려움에 부딪쳤었는데, 아직 freeRTOS를 이해하지 못 해서 잘못 설정한 거라 생각한다.
RTOS의 우선 순위를 설정할 때 가장 높은 4순위, 가장 낮은 4순위를 제외하고 우선순위를 선정하라는 책도 있다.
아마 이런 비슷한 개념 때문에 발생한게 아닐까 싶다

 

 

이제 태스크 정의 함수를 소개한다.

main 함수 앞, 즉 main 함수 바깥으로 이동시킨다.

수정할 부분은 main 함수 뿐이므로 코드를 첨부한다.

그림하고 다르다면 수정하면서 하길 바란다 ㅠㅠ

 

main.c
0.02MB

 

코드 자동 생성으로 태스크 생성을 위한 파라미터가 main.c 상단에 자동으로 생성된다.

밑에서 다시 소개한다.

 

 

 

코드 상단에 있는 SemaphoreHandle_t로 정의된 변수는 세마포어가 생성되는지 확인하기 위한 용도로 사용한다.

세마포어가 생성되지 않으면 태스크는 동작하지 않도록 되어있다.

 

SendMessage_MainTask()에서는 초기에 "Task Start!"을 출력하고, 매 100[ms]마다 적색 LED(PG14)를 토글한다.

vTaskDelayUntil() 함수를 사용하여 거의 정확한 100[ms] 주기로 실행하도록 설정한다.

 

 

SendMessage_200ms()에서는 매 200[ms]마다 녹색 LED를 토글하고, "Hello world!"를 출력한다.

SendMessage_BlueButton()에서는 파란 버튼이 눌려지는 순간에 "Interrupt!"를 출력한다.

(통신하다보면 버튼을 눌렀는데도 동작하지 않는 경우가 있다. 아마 UART 통신으로 인한 타임 아웃이나, 우선순위 높은 태스크 작업으로 인해 무시되는 듯 하다. 아직 해결 방법을 잘 모르니 넘어간다.)

 

 

 

그 다음으로 main.c 안에 태스크를 생성하는 코드를 작성한다.

기존에 LED 상태를 초기화 한 코드 밑에 작성했다.

위에서 봤었던 태스크 파라미터를 사용하여 태스크 생성 코드를 작성하면 모든 준비가 완료되었다.

 

 

ctrl+F7으로 컴파일 후, ctrl+D 로 다운로드 해보자.

(컴파일 하면 waring 메시지가 1개 있을텐데, 그냥 무시한다.)

디버깅 모드에 진입하면, "Go" 버튼을 눌러준다.

 

MCU가 동작하고 나서 파란 버튼을 눌러보았다.

아래 그림을 보면 초기 메인 태스크에서 "Task Start!"를 정상적으로 출력하고,

중간에 인터럽트(버튼 상태 변경)로 인한 태스크 응답도 잘 실행되는 것을 볼 수 있다.

 

 

이상으로 RTOS 맛보기가 종료되었다.

정말 RTOS로 동작하는지 알아보길 원한다면, "time.h" 를 포함하여 clock() 함수로 측정해보길 바란다.

반환되는 값은 [ms]이다.

다음 글에선 RTOS를 이해하기 위한 개념을 소개하고자 한다.

회사에서는 sys/bios를 사용하지만, 개념을 알고 이해하는 게 중요하니까 집에서 사용 가능한 freeRTOS로 글을 작성한다.

728x90

관련글 더보기