본문 바로가기

FreeRTOS

(18)
Critical Section이란 무엇일까? Critical SectionCritical Section은 (임계구역 또는 공유변수 영역) 병렬프로그래밍에서 둘 이상의 스레드 (멀티스레드)가 동시에접근해서는 안되는 공유 자원(파일, 입출력, 공유 데이터 등) 을 접근하는 명령문 또는 코드의 일부 영역을 말합니다. 병렬프로그래밍에서 A라는 스레드가 공유 데이터의 값 변경을 시도하는 순간 B라는 스레드가 그 값을 읽는다면그 값이 변경된 값인지 변경되기 전 값인지 예측할 수 없습니다. 이러한 문제로 동기화 처리 (synchronized)를반드시 해줘야하며, 임계구역에 실행되는 스레드는 lock을 획득하게 되는데 이 lock은 오직 하나의 스레드만 가질 수 있습니다. 임계 구역 문제를 해결하기 위해서는 아래와 같이 3가지 조건을 충족해야합니다. 상호 배제 ..
Hard Real-Time Task에서 Deadline에 도달하면 어떻게 될까? RTOS를 다루다보면 이러한 궁금증이 생길 때가 있다. 'RTOS를 실시간성이 보장되어야 하는 시스템 구현에 사용하게 되는데, 테스크가 데드라인 안에 작업을 수행하지 못한다면 어떻게 되지?' 정답을 말하면 그냥 넘어간다고 할 수 있다. RTOS 커널은 테스크가 Deadline 안으로 구현을 하게 해주는 매개체가 아니라 'deterministic Scheduling'을 보장하는 OS이기 때문이다. 그러므로 진부한 말이지만 실시간성을 보장하는 시스템을 만들기 위해선 시스템의 요구사양과 이에 맞게 어플리케이션을 디자인 하는 것이 핵심이라 할 수 있겠다. 더 자세한 내용은 아래 링크를 통해 공부해보자 https://stackoverflow.com/questions/45958888/what-happens-if-a..
FreeRTOS - 힙 메모리 관리 글의 맨 밑에 출처로 이동하시면 Amazon FreeRTOS 사이트에서 더 깔끔하게 보실 수 있습니다. 힙 메모리 관리 V9.0.0부터는 힙 메모리를 FreeRTOS 애플리케이션에 완전히 정적으로 할당할 수 있습니다. 이 말은 힙 메모리 관리자를 추가할 필요가 없다는 것을 의미합니다. 이번 단원에서 다루는 내용은 다음과 같습니다. ● FreeRTOS의 RAM 할당 시점 ● FreeRTOS와 함께 제공되는 5가지 메모리 할당 체계 예제 ● 각 메모리 할당 체계의 사용 사례 전제 조건 FreeRTOS를 사용하려면 C 프로그래밍에 대해 잘 알고 있어야 합니다. 특히 다음 사항에 정통해야 합니다. ● 컴파일 및 링크 단계를 포함한 C 프로젝트의 빌드 방식 ● 스택 및 힙에 대한 개념 ● 표준 C 라이브러리 ma..
14 FreeRTOS Tutorial: Mutex https://www.youtube.com/watch?v=rqpbQlzgws0 /* Includes ------------------------------------------------------------------*/ #include "main.h" #include "cmsis_os.h" #include "usb_host.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "FreeRTOS.h" #include #include #include "semphr.h" /* USER CODE END Includes */ TaskHandle..
12 FreeRTOS Tutorial: Direct To Task Notifications part2 https://www.youtube.com/watch?v=cv9VIotr4Ms&list=PLEfMFrwVdbPYzMgeaLiFRb4ogjV8m3lt6&index=13&t=0s TaskHandle_t myTask1Handle = NULL; TaskHandle_t myTask2Handle = NULL; int notificationValue; void myTask1(void *pvParameters) { TickType_t xDelay = pdMS_TO_TICKS(1000); TickType_t myLastUnblock; myLastUnblock = xTaskGetTickCount(); for(;;) { xTaskNotify(myTask2Handle , 0 , eNoAction); //notification..
11 FreeRTOS Tutorial: Direct To Task Notifications part1 https://www.youtube.com/watch?v=Ht7QRfUvWsI&list=PLEfMFrwVdbPYzMgeaLiFRb4ogjV8m3lt6&index=12&t=0s /* USER CODE BEGIN 0 */ TaskHandle_t myTask1Handle = NULL; TaskHandle_t myTask2Handle = NULL; void myTask1(void *pvParameters) { TickType_t xDelay = pdMS_TO_TICKS(1000); TickType_t myLastUnblock; myLastUnblock = xTaskGetTickCount(); for(;;) { xTaskNotifyGive(myTask2Handle); vTaskDelay(1000); } } voi..
10 FreeRTOS Tutorial: Queues part2 https://www.youtube.com/watch?v=Z-XD3Q7Hqps&list=PLEfMFrwVdbPYzMgeaLiFRb4ogjV8m3lt6&index=10 TaskHandle_t myTask1Handle = NULL; TaskHandle_t myTask2Handle = NULL; QueueHandle_t myQueue; void myTask1(void *pvParameters) { TickType_t xDelay = pdMS_TO_TICKS(1000); TickType_t myLastUnblock; myLastUnblock = xTaskGetTickCount(); char myTxBuff[30]; myQueue = xQueueCreate( 5 , sizeof(myTxBuff) ); //size..
09 FreeRTOS Tutorial: Queues part1 https://www.youtube.com/watch?v=elgkseFUpmk TaskHandle_t myTask1Handle = NULL; TaskHandle_t myTask2Handle = NULL; QueueHandle_t myQueue; void myTask1(void *pvParameters) { TickType_t xDelay = pdMS_TO_TICKS(1000); TickType_t myLastUnblock; myLastUnblock = xTaskGetTickCount(); char myTxBuff[30]; myQueue = xQueueCreate( 5 , sizeof(myTxBuff) ); //size of queue (number of block), size of each block s..