anhy0923
HY's Embedded LAB
anhy0923
전체 방문자
오늘
어제
  • 분류 전체보기 (67)
    • UDS 진단통신 (1)
    • FreeRTOS (2)
    • ROS2 (5)
    • [EH전공] CAN 통신 (1)
    • C언어 튜터링: C로 로봇을 파헤쳐보자! (4)
    • [졸업작품] 외벽 균열 검사 로봇 (8)
      • 2021-2 <종합설계기획> (7)
      • 2022-1 <종합설계1> (1)
      • 2022-2 <종합설계2> (0)
    • TCP 기반 제어시스템 (7)
      • Robot Arm Control (5)
      • RPi CCTV Server (2)
    • Embedded System (6)
      • Linux (3)
      • Linux - Ubuntu (2)
      • RPi (1)
    • Drone FW using STM32CubeIDE (25)
      • 0. Intro (2)
      • 1. Debug (3)
      • 2. Sensor Interface (4)
      • 3. GPS (4)
      • 4. Transmitter_Receiver (3)
      • 5. Drone Body Asb (1)
      • 6. ESC Protocol (4)
      • 7. EEPROM (2)
      • 8. GCS (1)
      • PID Control (1)
    • Elec Academy (3)
    • HAL & LL Driver (1)
    • OpenCV - Lane Detection (1)

블로그 메뉴

  • 홈
  • 방명록

티스토리

hELLO · Designed By 정상우.
anhy0923

HY's Embedded LAB

FreeRTOS - 1. 태스크 생성과 운용
FreeRTOS

FreeRTOS - 1. 태스크 생성과 운용

2022. 8. 12. 01:26
전자공학부 임베디드운영체제 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
    'FreeRTOS' 카테고리의 다른 글
    • FreeRTOS - 2. 태스크와 메모리
    anhy0923
    anhy0923

    티스토리툴바