전자공학부 임베디드운영체제 A+
컴퓨터공학부 운영체제 A+
이젠 RTOS 공부다!
osKernelStart(); // 멀티태스크 시작 함수
생성된 태스크의 스케줄링을 시작하는 함수
xTaskCreate()
태스크 하나를 생성
/* 함수 원형 */
BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,
const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
const configSTACK_DEPTH_TYPE usStackDepth,
void * const pvParameters,
UBaseType_t uxPriority,
TaskHandle_t * const pxCreatedTask );
/* Example */
xTaskCreate( (TaskFunction_t)TaskMain, /* Pointer to the function that implements the task. */
"TaskMain", /* Text name for the task. This is to facilitate debugging only. */
256, /* Stack depth - most small microcontrollers will use much less stack than this. */
NULL, /* We are not using the task parameter. */
TASK_MAIN_PRIO, /* This task will run at this priority */
&xHandleMain ); /* We are not using the task handle. */
TaskFunction_t = 함수 이름, (메모리 주소)
256word = 1024byte
entry
스택에 데이터를 push pop 할때 4byte(1word) 단위로 함.
vTaskDelete()
태스크를 삭제 (Kill state)
vTaskDelete( TaskHandle_t xTaskToDelete )
vTaskSuspend()
태스크를 중지 (Block state)
vTaskSuspend( TaskHandle_t xTaskToSuspend )
프로그램의 논리적인 메모리구조
.stack : main 스택
.heap : 힙 : 태스크 스택 위치
.bss : 전역변수 : 태스크 스택 위치
.data : 전역변수
.text : 코드
태스크 상태도
Blocked(vTaskSuspend()로 블록된 태스크) --- Running(실행 중) --- Ready(준비 상태) -+- Kill(vTaskDelete()로 삭제된 태스크)
Running 상태의 태스크 종료 시, Ready 상태에 있는 태스크 중 하나를 실행
생성된 태스크 중 우선순위 높은 태스크를 먼저 실행
우선순위가 높다고 오래 실행되는 것은 아니다!
--> Block 상태 시간이 적을수록 오래 실행 됨
기아 현상을 막기 위해 우선 순위가 높은 태스크를 적절히 block 상태로 전이하여 ready 상태에 있는 다른 태스크들을 계속하여 running 상태에 올려줘야 한다.
★vTaskDelay()
일정 시간동안 Block state
태스크를 일정 시간 동안 블록 상태에 머무르게 함 --> 그 후엔 준비 상태로
IDLE 태스크 = running 공백기가 생길 때 실행
= 우선순위 0 (가장 낮음)
vTaskDelay (pdMS_TO_TICKS (1000));
중요!! : 멀티태스킹을 위해선 실행 중인 태스크를 적절하게 블록 상태로 이동하고 준비 상태에 있는 태스크를 실행시켜 줘야 함
vTaskPrioritySet()
태스크의 우선순위를 변경
vTaskPrioritySet(xHandle1, TASK_3_PRIO);
vTaskResume()
Block --> Ready 상태로
vTaskResume(xHandle1);
FreeRTOSConfig.h
FreeRTOSConfig_base.h가 원래는 FreeRTOSConfig.h 여기에 있어야함
#include "FreeRTOSConfig_base.h"
--> 원하는 것만 바꿈
동일한 우선순위 사용시 ROUND ROBIN 스케줄링에 의해 스케줄링 됨
선점, 슬라이싱
configUSE_PREEMPTION, configUSE_TIME_SLICING 이 모두 1이어야 선점이 일어남
// tasks.c 2818 line ~
/* Tasks of equal priority to the currently running task will share
processing time (time slice) if preemption is on, and the application
writer has not explicitly turned time slicing off. */
#if ( ( configUSE_PREEMPTION == 1 ) && ( configUSE_TIME_SLICING == 1 ) )
{
if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ pxCurrentTCB->uxPriority ] ) ) > ( UBaseType_t ) 1 )
{
xSwitchRequired = pdTRUE;
}
else
{
mtCOVERAGE_TEST_MARKER();
}
}
#endif /* ( ( configUSE_PREEMPTION == 1 ) && ( configUSE_TIME_SLICING == 1 ) ) */
printf 와 fflush
printf
내부 문자열 버퍼
fflush
강제로 버퍼를 비워라
이것을 넣어야 실시간으로 화면에 출력됨
IDLE Task
우선순위가 0인 태스크
configUSE_IDLE_HOOK = 1 로 설정 시 IDLE Hook 태스크(vApplicationIdleHook)가 실행됨
void vApplicationIdleHook (void)
{
printf("."); fflush(stdout);
}
※ main.c의 osKernal Start() --> vTaskStartScheduler() 함수를 호출하여 FreeRTOS 멀티태스킹을 시작
'FreeRTOS' 카테고리의 다른 글
FreeRTOS - 2. 태스크와 메모리 (0) | 2022.08.27 |
---|