๐ ์ค์ต ๋ชฉํ
FreeRTOS๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๊ฐ์ ์ค๋ ๋ ๊ฐ ํต์ ์์ ๊ตฌํ
1.1 ๋ ๊ฐ์ Task ์์ฑ ๋ฐ osEventFlags, osThreadFlags
(FreeRTOS์์ ์ ๊ณตํ๋ ์ด๋ฒคํธ ํ๋๊ทธ ๊ด๋ฆฌ API) ์์ฑ
1.1 EventFlag๊ฐ define ๋์ด์์ ๊ฒฝ์ฐ thread1_Task() ์์ osEventFlags ์์ฑ
1.2 EventFlag๊ฐ define ๋์ด์์ง ์์ ๊ฒฝ์ฐ thread1_Task() ์์ osThreadFlags ์์ฑ
1.3 EventFlag๊ฐ define ๋์ด์์ ๊ฒฝ์ฐ thread2_Task() ์์ ์ด๋ฒคํธ ํ๋๊ทธ ๊ฐ์ฒด ๋๊ธฐ
1.4 EventFlag๊ฐ define ๋์ด์์ง ์์ ๊ฒฝ์ฐ thread2_Task() ์์ thread1์ ํ๋๊ทธ ๋๊ธฐ
1.2 LED2, LED3 ํ ๊ธ ๋ฐ flag๋ฅผ ์ถ๋ ฅ์์ผ ๋ ๊ฐ์ task(์ค๋ ๋) ๊ฐ ํต์ ์ํ ํ์ธ
๐ RTOS ์ธํ
์ต์ด ์ค์ ๊ณผ ๋์ผํ๊ฒ ์ฌ์ฉํ์์ผ๋ฉฐ ์ธํ
์์๋ค์ ๋ํด ์กฐ์ฌ๋ ์๊ฐ ๊ด๊ณ์ ํ์ง ์์์ต๋๋ค.
๐ ์ค์ต ๊ฒฐ๊ณผ
https://github.com/Tobbyvv/stm32-project/tree/main/rtos_cli
1. ์ค๋ ๋ 1์์ ์ด๋ฒคํธ ํ๋๊ทธ๊ฐ ์ ์๋์ด ์์ผ๋ฏ๋ก 100ms๋ง๋ค 0 ๋ถํฐ 3์ ์ด๋ฒคํธ ํ๋๊ทธ๋ฅผ ์์ฑ
2. ์ค๋ ๋ 2์์ 1์ด ๊ฐ๊ฒฉ์ผ๋ก ์ด๋ฒคํธ ํ๋๊ทธ ์์ ์ฒดํฌ
3. ์ค๋ ๋ 2์์ ์ด๋ฒคํธ ํ๋๊ทธ๊ฐ ์ฒดํฌ๋๋ฉด ํด๋น ์ด๋ฒคํธ ํ๋๊ทธ ์ซ์๋ฅผ ์ถ๋ ฅ
flags ๋ณ์์ 0๋ฒ์งธ๋ถํฐ 3๋ฒ์งธ ๋นํธ๋ฅผ ์ฐจ๋ก๋ก 1๋ก ์ค์ ํ๊ธฐ ๋๋ฌธ์ 1,2,4,8 ์ด๋ผ๋ ๊ฐ์ด ๋์ด
4. i๊ฐ 0์ผ ๋ ๋ฐ์ํ๋ delay ๋ ์ด๋ฒคํธ ํ๋๊ทธ๋ฅผ ์์ ๋ฐ์ง ๋ชปํด flags timeout ๋ฐ์
#include <stdio.h>
#include "main.h"
#include "string.h"
#include "cmsis_os.h"
#include "app.h"
#define EVENT_FLAGS
// ์ค๋ ๋1, ์ค๋ ๋2 ID ๋ณ์
osThreadId_t thread1_handle, thread2_handle;
const osThreadAttr_t thread1_attributes = {
.name = "thread1", // ์ค๋ ๋ ์ด๋ฆ ์ง์
.stack_size = 256 * 4, // ์ค๋ ๋ ์คํ ํฌ๊ธฐ 256๋ฐ์ดํธ๋ก ์ค์
.priority = (osPriority_t) osPriorityNormal, // ์ค๊ฐ ์ฐ์ ์์๋ก ์ค์
};
const osThreadAttr_t thread2_attributes = {
.name = "thread2",
.stack_size = 256 * 4,
.priority = (osPriority_t) osPriorityNormal,
};
static void thread1_Task(void *arg)
{
uint8_t i = 0;
/*
EVENT_FLAGS๊ฐ define ๋์ด ์์ ๊ฒฝ์ฐ
osEventFlagsNew๋ฅผ ํตํด ์ด๋ฒคํธ ํ๋๊ทธ ๊ฐ์ฒด ์์ฑ
*/
#if defined(EVENT_FLAGS)
osEventFlagsId_t evt_handle = osEventFlagsNew(NULL);
#endif
for(;;) {
osDelay(100);
#if defined(EVENT_FLAGS)
osEventFlagsSet(evt_handle, 1 << i); // ์ด๋ฒคํธ ํ๋๊ทธ ์ค์
#else
osThreadFlagsSet(thread2_handle, 1 << i); // ๋ค๋ฅธ ์ค๋ ๋์ ํ๋๊ทธ ์ค์
#endif
i++; i%=4; //i ๊ฐ -> 0~3
if (i==0) osDelay(1000);
//i๊ฐ 0์ผ๋ 1์ด ํ toggle 0์ด ์๋๋ 0.1์ด ํ toggle
HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
}}
static void thread2_Task(void *arg)
{
uint32_t flags;
for(;;) {
#if defined(EVENT_FLAGS)
// ์ด๋ฒคํธ ํ๋๊ทธ ๋๊ธฐ
flags = osEventFlagsWait(evt_handle, 0x000f, osFlagsWaitAny, 1000); //osWaitForever);
#else
// ๋ค๋ฅธ ์ค๋ ๋๋ก๋ถํฐ ํ๋๊ทธ ๋๊ธฐ
flags = osThreadFlagsWait(0x000f, osFlagsWaitAny, 1000);
#endif
printf("flags : %08x : ", flags);
if (flags != osFlagsErrorTimeout ) {
// flags์ ๊ฐ ๋นํธ๋ฅผ ๊ฒ์ฌํ์ฌ ์ค์ ๋ ํ๋๊ทธ๋ฅผ ์ถ๋ ฅ
if (flags & 0x0001) { printf("1\r\n"); }
if (flags & 0x0002) { printf("2\r\n"); }
if (flags & 0x0004) { printf("4\r\n"); }
if (flags & 0x0008) { printf("8\r\n"); }
} else {
printf("flags timeout\r\n");
}
// LED ํ ๊ธ
HAL_GPIO_TogglePin(LD3_GPIO_Port, LD3_Pin);
}}
void app(void)
{
// ์ด์์ฒด์ ์ด๊ธฐํ
osKernelInitialize();
// ์ค๋ ๋ ์์ฑ
thread1_handle = osThreadNew(thread1_Task, NULL, &thread2_attributes);
thread2_handle = osThreadNew(thread2_Task, NULL, &thread2_attributes);
// ์ด์์ฒด์ ์์
osKernelStart();
}
'embedded' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[protocol] UDS ์ด๋ก ์ ๋ฆฌ (0) | 2023.10.13 |
---|---|
[stm32] Bluetooth ์ด๋ก ๋ฐ ์ค์ต (0) | 2023.10.11 |
[stm32] RTOS ์ด๋ก ์ ๋ฆฌ (0) | 2023.09.11 |
[stm32] I2C ํต์ ์ค์ต (0) | 2023.09.11 |
[stm32] I2C ํต์ ์ด๋ก ์ ๋ฆฌ (0) | 2023.09.11 |