๐ ๊ณต๋ถํ๋ ์ง์ง์ํ์นด๋ ์ฒ์์ด์ง?
์ค์๊ฐ(Real Time) ์ด์์ฒด์ (OS) ์ RTOS์ FreeRTOS ์ฌ์ฉํด๋ณด๊ธฐ ๋ณธ๋ฌธ
์ค์๊ฐ(Real Time) ์ด์์ฒด์ (OS) ์ RTOS์ FreeRTOS ์ฌ์ฉํด๋ณด๊ธฐ
์ง์ง์ํ์นด 2023. 11. 29. 11:43<๋ณธ ๋ธ๋ก๊ทธ๋ ์ฝฉ์ด์ ์ผ์๊ณผ ์๋ฒ ๋๋ blog , EmbeddedJune์ Festival ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํด์ ๊ณต๋ถํ๋ฉฐ ์์ฑํ์์ต๋๋ค :-)>
โญ RTOS
์ค์๊ฐ(Real Time) ์ด์์ฒด์ (Operating System)์ ์ฝ์
์ ํ๋ ์๊ฐ๋ด์ ์ํ๋ ์์ ์ ๋ชจ๋ ์ฒ๋ฆฌํ๋๊ฒ์ ๋ณด์ฅํ๋ ์ด์์ฒด์
๋ฉํฐํ์คํน ํ๊ฒฝ์์ Task ์ฒ๋ฆฌ์๊ฐ์ ์ผ๊ด๋๊ฒ ์ ์งํ๊ธฐ ์ํ ์ฉ๋๋ก ์ฌ์ฉ
์๋ถํ ์์คํ ํ์์ ์ฐ์ ์์ ๊ธฐ๋ฐ ์ค์ผ์ค๋ง์ ํตํด ์ฐ์ ์์๊ฐ ๋์ task๊ฐ ๋จผ์ ์์ ์ ์ฒ๋ฆฌํ ์ ์๊ฒ ํจ
์ค์ผ์ค๋ง : ํ๋ก์ธ์ค๋ค์๊ฒ CPU ๋ฑ ์์์ ๋ฐฐ์ ํ๋ ๊ฒ์ ๋งํจ
๋์์ ์ฌ๋ฌ๊ฐ์ง ์์ฉ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํ๋ค๋ณด๋ฉด ์ฒ๋ฆฌ์๋๊ฐ ์ง์ฐ๋๊ฑฐ๋ ํ๋ก๊ทธ๋จ์คํ์ด 1์ด ์ด์ ์ง์ฐ๋จ
RTOS๋ฅผ ์ฌ์ฉํ ๊ธฐ๊ธฐ๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ต๋ 1์ด์์ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋ณด์ฅํ๋ค
์๋์ฐ๋ ๋ฆฌ๋ ์ค์์๋ millisecond, microsecond ๋จ์๋ก ํ๋ก๊ทธ๋จ์ ์ ์ดํ๋ ๊ฒ์ ์ด๋ ต์ง๋ง, RTOS์์๋ ๊ฐ๋ฅ
โญ FreeRTOS
RTOS์ ์ข ๋ฅ๊ฐ ์๋๋ฐ RTOS์์ Free ๋ผ๋ ์์์ด๊ฐ ๋ถ์ ์ด์ ๋ ๋๊ตฌ๋ ์ฌ์ฉ๊ฐ๋ฅ
์ํ ์ ์ถ๋ ฅ ์ฃ์ง ๋๋ฐ์ด์ค๋ฅผ ์ฝ๊ฒ ํ๋ก๊ทธ๋๋ฐ, ๋ฐฐํฌ, ๋ณดํธ, ์ฐ๊ฒฐ ๋ฐ ๊ด๋ฆฌํ ์ ์๋ ๋ง์ดํฌ๋ก ์ปจํธ๋กค๋ฌ์ฉ ์ค์๊ฐ ์คํ ์์ค ์ด์ ์ฒด์
2003๋ Richard Barry๊ฐ ๋ง๋ ANSI C ๊ธฐ๋ฐ RTOS
์๋ง์กด AWS IoT ์๋น์ค ํ์ฅ์ ์ํด 2017๋ 11์์ ์ธ์
- ๊ธฐํ ๊ณ ์ฑ๋ฅ OS(Linux, Windows, iOS, Android ๋ฑ)์๋ ๋ค๋ฅด๊ฒ 1์ด ๋ด์ Task์ ์์ ์ ๋๋ด๋ ๊ฒ์ ๋ณด์ฅ
(๋จ์ํ ๋นจ๋ฆฌ ๋๋ด๋๊ฒ์ด ์๋๋ผ ์์ ์ ์ฒ๋ฆฌ๋ฅผ ๋ณด์ฅ)
- ์ค์๊ฐ ์ฒ๋ฆฌ๊ฐ ํ์ํ ์์คํ (๊ตญ๋ฐฉ ์์คํ , ์์ ๋ณด์กฐ์ฅ์น ๋ฑ)์ ๋ง์ด ์ฌ์ฉ
- RTOS๊ฐ ํ์ฉ๋๋ ๊ธฐ๊ธฐ๋ ๊ฑฐ์ ๋๋ถ๋ถ ์๋ฒ ๋๋ ์์คํ
- ์์ฉ ํ๋ก๊ทธ๋จ์ ์ฒ๋ฆฌ ์์ฒญ์ ์ ํด์ง ์๊ฐ๋ด์ ๋๋ง์น ์ ์๋ ์ฑ๋ฅ์ ์ค์
- ์ ์ ํ ๋ฉํฐ ํ์คํน์ ์ง์ํ๊ณ ๊ฐ ํ๋ก์ธ์ค์ ์คํ ์์๋ฅผ ์ง์ ํด ํจ์จ์ ์ธ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅ
- 100% ์์ ๋ฌด๋ฃ์ด๊ณ , ๋ณด์ฆ ๋ฐ ๊ธฐ์ ์ ์ธ ๋ฒ์ ๋ณดํธ๋ ์ง์ํ์ง ์๋๋ค
๐ณ ํ์คํฌ (Task)
FreeRTOS์์ ํ๋์ task๋ ํ๋์ ์ค๋ ๋(thread)๋ฅผ ์๋ฏธ
1๏ธโฃ ๊ฐ task์๋ ์ฐ์ ์์๋ฅผ ํ ๋นํ๋ฉฐ ์ซ์๊ฐ ๋์์๋ก ํฐ ์ฐ์ ์์๋ฅผ ์๋ฏธํ๋ค.
์ฐ์ ์์๋ 0๋ถํฐ configMAX_PRIORITIES๊น์ง ํ ๋น์ด ๊ฐ๋ฅํ๋ค.
์ฐ์ ์์๊ฐ ๋์ task๋ ๋ฎ์ task๋ฅผ ์ ์ (preemption)ํ ์ ์๊ณ , ์ด๋ context switching์ด ๋ฐ์
๋์ผํ ์ฐ์ ์์ ์ฌ์ด์์๋ round robin์ ์ฌ์ฉ
2๏ธโฃ Task๋ return value๊ฐ ์์ผ๋ฉฐ (void*) ํ์ ์ผ๋ก ์ฌ๋ฌ ์๋ฃํ์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ ์ ์๋ค
3๏ธโฃ Task๋ ์ผํ์ฉ task์ ์ฃผ๊ธฐ์ task 2๊ฐ์ง ์ข ๋ฅ
1) ์ผํ์ฉ task๋ ๊ธฐ๋ฅ์ ํ ๋ฒ ์ํํ ๋ค ๋ง์ง๋ง์ ์ค์ค๋ก๋ฅผ ์ญ์ ํ๋ค (๊ผญ)
void ํ์คํฌ์ด๋ฆ( void* pvParameters ) { /* ~~~ */ vTaskDelete(NULL); }
2) ์ฃผ๊ธฐ์ task๋ ๋ฌดํ loop๊ฐ ๋ค์ด์๋ค
Delay ๋๋ suspend ํจ์ ๋ฑ์ผ๋ก task์ state๊ฐ blocked(waiting)๋ก ๋ณํ์ง ์๋ ์ด์ ๊ณ์ํด์ ๊ธฐ๋ฅ์ ๋น ๋ฅด๊ฒ ๋ฐ๋ณต ์คํ
void ํ์คํฌ์ด๋ฆ( void* pvParameters ) { while(true) { /* ~~~~~ */ } }
4๏ธโฃ ๊ฐ task๋ง๋ค local stack ๊ณต๊ฐ์ด ํ ๋น
์ด ๊ณต๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ .bss์์ญ ๋๋ .heap ์์ญ์ ๋ค์ด๊ฐ๋ค
Stack ๋ฉ๋ชจ๋ฆฌ๋ ์ ์ ๋๋ ๋์ ์ผ๋ก ํ ๋น์ด ๊ฐ๋ฅ
๐ณํ์คํฌ (Task) ๊ด๋ จ API
1๏ธโฃ xTaskCreate
/* Create our tasks. */
xTaskCreate(
vTaskBlink, /* Pointer to the Task implementation. */
"Blink", /* Internal name of the task. */
configMINIMAL_STACK_SIZE, /* Wanted task stack size. */
NULL, /* Task parameter (optional). */
1, /* Task priority. */
NULL /* Task handle (optional). */
);
freertos.ino - VxWorks
pvTaskCode : task์ ๊ธฐ๋ฅ์ด ์ ์ธ๋ ํจ์์ ํจ์ํฌ์ธํฐ
pcName : ๋๋ฒ๊น ์ฉ๋๋ก ์ฌ์ฉํ๋ ๋ฌธ์์ด์ด๋ฉฐ task์ ์ด๋ฆ
usStackDepth : task๋ง๋ค ํ ๋น๋๋ stack ๋ฉ๋ชจ๋ฆฌ
(๋จ์๋ WORD์ด๋ฉฐ ARM Cortex-M๋ณด๋์์๋ 1WORD == 4Byte)
pvParameters : task ํจ์๋ก ์ ๋ฌํ ๋งค๊ฐ๋ณ์
์๋ค๋ฉด NULL
์ ๋ฌํ ๋งค๊ฐ๋ณ์๋ฅผ (void*) ํ์ ์ผ๋ก ์บ์คํ ํ ๋ค ์ฌ๊ธฐ๋ค๊ฐ ๋ฃ์ด์ฃผ๋ฉด task ํจ์์์ ์ฌ์ฉ
pxCreatedTaskV : task๋ฅผ ์ ์ดํ๊ธฐ ์ํ TaskHandle_t ํ์ ํธ๋ค
Task์ ์ฐ์ ์์๋ฅผ ๋ฐ๊พธ๊ฑฐ๋, task๋ฅผ ๋ฉ์ถ๊ฑฐ๋ ๋ฑ task์ ๋ํ ์ค์ ์ ๋ชจ๋ ์ด ํธ๋ค์ ํตํด์ ์ด๋ค์ง๋ค.
2๏ธโฃ vTaskDelay
/* Delay the task 1000ms to create a 1Hz blinking. */
vTaskDelay( 1000 / portTICK_PERIOD_MS );
Task์ ์ํ๋ฅผ running์์ blocked(waiting)์ผ๋ก ๋ณ๊ฒฝํ๋ ํจ์
์ค์ ๋ ์๊ฐ xTicksToDelay๋์ ํด๋น task๋ blocked task๊ฐ ๋๋ฉฐ, ๋ค์ ์ฐ์ ์์๋ฅผ ๊ฐ์ง task๊ฐ ์คํ
ํ์ฅ์ฑ ๋ฐ ์ด์์ฑ ์ข์ ์ฝ๋๋ฅผ ๋ง๋ค๊ธฐ ์ํด์ tick๋จ์ ์๊ฐ์ ์ฌ์ฉํ๋ ๊ฒ ๋ณด๋ค pdMS_TO_TICKS() ๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํด์ ์ฐ๋ฆฌ์๊ฒ ํธํ ms(๋ฐ๋ฆฌ์ด) ๋จ์๋ฅผ tick์ผ๋ก ๋ณํํด์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค
=> ์๋ํ๋ฉด, ์ฌ์ฉํ๋ ๋ณด๋์ ์ฌ์ฉ์ ํ๊ฒฝ์ค์ ๊ฐ์ ๋ฐ๋ผ 1 Tick์ด ์๋ฏธํ๋ ์๊ฐ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ
๐ณ CODE ( freertos.ino - VxWorks)
// ๋ฉํฐํ์คํน ํ๊ฒฝ์์ Task ์ฒ๋ฆฌ์๊ฐ์ ์ผ๊ด๋๊ฒ ์ ์งํ๊ธฐ ์ํ ์ฉ๋๋ก ์ฌ์ฉ
// ์ค์๊ฐ(Real Time) ์ด์์ฒด์ (Operating System)์ ์ฝ์
#include <Arduino_FreeRTOS.h>
/*-----------------------------------------------------------*/
void vTaskBlink( void * pvParameters );
void vTaskAnalogRead( void * pvParameters );
/*-----------------------------------------------------------*/
void setup( void )
{
/* Initialize the serial port. */
Serial.begin( 9600 );
/* Create our tasks. */
xTaskCreate(
vTaskBlink, /* Pointer to the Task implementation. */
"Blink", /* Internal name of the task. */
configMINIMAL_STACK_SIZE, /* Wanted task stack size. */
NULL, /* Task parameter (optional). */
1, /* Task priority. */
NULL /* Task handle (optional). */
);
xTaskCreate( vTaskAnalogRead, "Analog", configMINIMAL_STACK_SIZE, NULL, 1, NULL );
/* Start the kernel sheduler. */
vTaskStartScheduler();
}
/*-----------------------------------------------------------*/
void loop( void )
{
/* The Arduino loop function is used as the idle hook. In FreeRTOSConfig.h
configUSE_IDLE_HOOK must be set because there are (serial) events that were
processed in the backround of the Arduino core implementation of loop(). */
}
/*-----------------------------------------------------------*/
void vTaskBlink( void * pvParameters )
{
/* Initialize the built in LED. */
pinMode( LED_BUILTIN, OUTPUT );
/* Keep the compiler happy because pvParameters is not used here. */
( void ) pvParameters;
for( ;; )
{
/* Toggle the built in LED. */
digitalWrite( LED_BUILTIN, digitalRead( LED_BUILTIN ) ^ 1 );
/* Delay the task 1000ms to create a 1Hz blinking. */
vTaskDelay( 1000 / portTICK_PERIOD_MS );
}
}
/*-----------------------------------------------------------*/
void vTaskAnalogRead( void * pvParameters )
{
int16_t sAnalogValue;
/* Keep the compiler happy because pvParameters is not used here. */
( void ) pvParameters;
for( ;; )
{
/* Read the analog value from A0 print it out. */
sAnalogValue = analogRead( A0 );
Serial.println( sAnalogValue );
/* Short delay for stability. */
vTaskDelay( 1 );
}
}
'๐ฉโ๐ป IoT (Embedded) > Arduino' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ultrasonic sensor ๋ก ๋ชจ๋ํฐ๋ง ํ๊ธฐ with processing (1) | 2023.12.07 |
---|---|
CAN (Controller Area Network) ์ด๋? with Arduino UNO R4 WIFI (0) | 2023.11.30 |
[UNO R4 WIFI example] Digital-to-Analog Converter (DAC) (0) | 2023.11.28 |
[UNO R4 WIFI example] Real-Time ClockRTCAlarm (0) | 2023.11.28 |
[UNO R4 WIFI example] WiFi Web Server LED Blink (1) | 2023.11.28 |