Chapter 3 작업 관리(FreeRTOS 자습서)

10431 단어 FreeRTOS

이 보도에 관하여


Mastering the Freertos Real Time Kernel-A Hands-on Tutorial Guild의 일본어 번역

Chapter3 임무 관리


3.1 리드 역할 영역


이 장절의 목적은 다음과 같다.
- FreeRTOS에서 각 작업에 수행 시간을 할당하는 방법
- FreeRTOS 이동 방법, 작업 선택
- 우선 순위 관계가 시스템 동작에 미치는 영향
- 존재 가능한 작업의 상태 유형
독자는 다음과 같은 내용을 이해할 수 있다.
- 임무 수행 방법
- 하나 이상의 작업 생성 방법
- 작업 매개변수 사용 방법
- 생성된 작업의 우선순위 변경 방법
- 작업 취소 방법
- 주기적 처리의 실현 방법
- 유휴 작업 수행 시기, 사용 방법
이 장의 개념은 FreeRTOS의 기본적인 이해와 FreeRTOS 응용이 어떻게 진행될지 이해하는 데 있다.
그래서 이 책에서 가장 상세한 장과 절이 되었다.

3.1 작업 함수


임무는 C의 함수로 이루어진다.특별한 실현은void를 되돌려서voidpointer를 얻는 것이다.
Listing11
void ATaskFunction(void *pvParameters);
모든 임무 자체가 하나의 작은 프로그램이다.신청 지점을 가지고 무한 순환 중 집행되며 끝나지 않습니다.
일반적인 작업은 Listing 12에 표시됩니다.
Listing12
void ATaskFunction( void *pvParameters ) 
{ 
/* Variables can be declared just as per a normal function.  Each instance of a task 
created using this example function will have its own copy of the lVariableExample 
variable.  This would not be true if the variable was declared static – in which case 
only one copy of the variable would exist, and this copy would be shared by each 
created instance of the task. (The prefixes added to variable names are described in 
section 1.5, Data Types and Coding Style Guide.) */ 
int32_t lVariableExample = 0; 

    /* A task will normally be implemented as an infinite loop. */ 
    for( ;; ) 
    { 
        /* The code to implement the task functionality will go here. */ 
    } 

    /* Should the task implementation ever break out of the above loop, then the task  
    must be deleted before reaching the end of its implementing function.  The NULL  
    parameter passed to the vTaskDelete() API function indicates that the task to be  
    deleted is the calling (this) task.  The convention used to name API functions is  
    described in section 0, Projects that use a FreeRTOS version older than V9.0.0 
must build one of the heap_n.c files.  From FreeRTOS V9.0.0 a heap_n.c file is only 
required if configSUPPORT_DYNAMIC_ALLOCATION is set to 1 in FreeRTOSConfig.h or if 
configSUPPORT_DYNAMIC_ALLOCATION is left undefined.  Refer to Chapter 2, Heap Memory 
Management, for more information. 
Data Types and Coding Style Guide. */ 
    vTaskDelete( NULL ); 
} 
FreeRTOS 작업은 반환할 수 없습니다.작업에return을 포함해서는 안 됩니다.함수의 끝까지 실행할 수 없습니다.
작업이 필요하지 않으면 명확하게 delete 대체를 해야 합니다.
하나의 작업 정의에서 여러 개의 작업을 생성할 수 있습니다.각 작업은 별도의 스택, 로컬 변수의 다른 인스턴스에서 수행됩니다.

3.3 최고 작업 상태


하나의 응용 프로그램은 여러 개의 작업으로 구성되어 있다.프로세서가 싱글 코어인 경우 언제든지 하나의 작업만 수행할 수 있습니다.
이것은 하나의 임무가 두 상태 중의 한 상태에서 존재할 수 있음을 나타낸다.우선 이 간단한 모형을 고려하고, 이것은 상당히 간략한 예이다.
이 장 뒤에 여러 개의 비운행 상태가 있음을 나타낸다.
작업이 실행 중일 때 프로세서가 이 작업의 코드를 실행하고 있습니다.실행 상태가 아닐 때, 이 작업은 휴면 상태에 있습니다.
스케줄러는 실행 상태로 결정하고 다시 실행할 때까지 Ready 상태를 유지합니다.작업을 다시 시작할 때, 실행 상태에서 벗어날 때 실행할 명령을 실행합니다.

"Not Running 상태에서 Running 상태로 작업을 마이그레이션하는 것을""switched in""또는""swapped in""이라고 합니다."
반대로 작업을 실행 상태에서 Not 실행 상태로 바꾸는 것을'switched out'또는'swapped out'이라고 한다
FreeRTOS 스케줄러는 in 및 out 작업을 수행할 수 있는 유일한 실제 상태입니다.

3.4 퀘스트 생성


xTaskCreate() API 함수


FreeRTOS V9.0.0 메모리를 컴파일할 때 static에서 추출한 xTaskCreateStatic 함수를 포함합니다.
xTaskCreate를 사용하여 작업을 생성합니다.이 함수는 API에서 가장 복잡하지만 다중 임무 시스템에서 임무는 가장 기본적인 구성 요소라는 것을 이해해야 한다.
이 책에 첨부된 모든 example는 xTaskCreate를 이용했기 때문에 많은 참고가 있는 example입니다.
1.5

Tutorial 3.5 작업 우선 순위


가격의 최대치는 configMAX이다PRIORITIES(FreeRTOSConfig.h)로 정의됩니다.
우선 순위 0이 가장 낮습니다.따라서 configMAXPRIORITIES-1이 가장 큰 우선 순위입니다.
FreeRTOS 스케줄러는 두 가지 방법으로 실행 상태를 확인할 수 있다

①Generic Method


configMAX_PRIORITIES 값은 상한이 없습니다.
하지만 최소한의 필요치를 추천합니다.확대되면 램의 소비량이 증가하기 때문이다.더 확대하면 실행 시간이 늘어난다.
사용 시configUSE_PORT_OPTIMISED_TASK_SELECTION를 0으로 설정하거나 정의하지 않습니다.

②Architecture Optimized Method


구성 요소 코드를 사용하여 최적화되므로 Generic Method보다 빠릅니다.
configMAX_PRIORITIES의 크기는 성능에 영향을 주지 않습니다.
근데 32보다 크면 안돼.Generic Method와 마찬가지로 RAM 사용량을 고려해 사용량을 최소화하는 것이 좋다.
사용configUSE_PORT_OPTIMISED_TASK_SELECTION: 1
FreeRTOS 스케줄러는 우선 순위가 가장 높은 작업을 수행할 수 있도록 보장합니다.
같은 우선 순위의 작업이 여러 개 있을 때, 순서대로 실행 상태로 들어간다

Tutorial 3.12 Scheduling Algorithm



스케줄러가 Ready 상태에서 작업을 선택하여 실행을 시작합니다.
스케줄러는 항상 Ready 상태의 작업 중 가장 우선순위가 높은 작업을 선택합니다.
Blocked 상태의 작업이 제거할 이벤트를 받으면 자동으로 Ready 상태로 바뀝니다.
scheduring algorithm은 Ready 상태의 작업을 런닝 상태로 전환하는 방법을 결정합니다.
알고리즘은 FreeRTOSConfig입니다.h에 기재된 configUSE_PREEMPTION,configUSE_TIME_SLICING에 의해 결정된다.
세 번째 설정configUSE_TICKLESS_IDLE으로서 알고리즘에도 영향을 미친다.
이걸 사용하면 tick 인터럽트는 extended period입니다. (네?)를 참고하십시오.configUSE_TICKLESS_IDLE는 advanced option에서 절전에 사용됩니다.
모든 설정 가능한 모드에서 FreeRTOS 스케줄러는 우선순위가 같은 여러 개의 작업이 순서대로 런닝 상태에 들어갈 것을 보장한다.
같은 시간에 집행하는 것이 아니라 순서대로 집행하는 것을 보증한다.

Prioritized Pre-emptive Scheduling with Time Slicing


다음 설정 알고리즘
Config
값 설정
configUSE_PREEMPTION
1
configUSE_TIME_SLICING
1
'Fixed Prority Pre-emptive Scheduring with Time Sclicing'으로 불리며 규모가 작은 RTOS Application에 사용된다.

Fixed Priority


스케줄링 알고리즘은 스케줄링 작업의 Prority를 바꾸지 않습니다.
단, 퀘스트 자신 또는 기타 퀘스트의 우선도 변경에 방해가 되지 않습니다

Pre-emptive


Runnig 상태의 임무보다 우선순위가 높은 임무가 Ready 상태가 되면 즉시 우선순위가 높은 임무에 Running 상태를 양보합니다.
Pre-emptive란 다른 작업을 위해 선택의 여지가 없는(불분명한) 작동 상태에서 Ready 상태로 옮기는 것을 말한다.

Time Slicing


타임슬립이란 블록드와 런닝 상태를 명확히 내주지 않고 같은 우선순위의 임무가 수행 상태를 공유하는 구조를 말한다.
각 시간대마다 수행할 작업을 전환합니다.
time slice는 두 tick interrupt 사이에서 발생합니다.

서로 다른 우선 순위 작업의 작업 예


이것은 이해하기 쉽기 때문에 해설을 생략한다.해설을 읽고 싶으면 강좌를 참조하세요.

우선 순위가 같은 작업의 작업 예


tick의 중단은't1, t2, t3, t4, t5, t8, t9, t10과 t11'로 들어갑니다.타임 슬라이스입니다.
시간 슬라이스 간에 동일한 우선 순위를 갖는 Idle task 및 Task2 전환
우선순위가 높은 Task1이 Ready가 되면 IDLE 작업을 pre empts, Task1로 이동합니다.

configIDLE_SHOULD_YELD의 역할


Figure.27에서 idle 작업과Task2는 실행 시간을 공유하지만 개발자는 때때로 실행 시간을 Task2에 많이 분배하려고 합니다.
configIDLE_SHOULD_YIELD는 idle 작업의 스케줄링을 구성할 수 있습니다.
- configIDLE_SHOULD_YELD가 0이면 idle 퀘스트는 타임 슬라이스를 모두 소모합니다.※Figure 27이 이거예요.
- configIDLE_SHOULD_YIELD가 1이면, idle 퀘스트와 같은 priority 퀘스트가 있다면, 각 loop은 실행 상태를 유지합니다. ※↓ 이거예요.

Prioritized Pre-emptive Scheduling (without Time Slicing)


Prioritized Pre-emptive Scheduling with Time Slicing의 무시간 슬라이스 버전.
다음 설정 알고리즘
Config
값 설정
configUSE_PREEMPTION
1
configUSE_TIME_SLICING
0
시간 슬라이스가 없기 때문에 다음과 같은 상황에서 Runnig 상태로 들어가는 작업을 선택하십시오
• 우선 순위가 높은 작업이 Ready인 경우
• 우선 순위가 같은 작업이 Blocked 또는 suspended 상태일 경우
임무 스위치를 통한 지출이 없는 것이 장점이지만 같은 우선도의 임무 수행 시간이 크게 다르기 때문에 숙련자를 대상으로 한다.

t1에서 시작하는 idle 작업은 슬라이드할 시간이 없기 때문에Task1이 도착하기 전에 런닝 상태가 지속됩니다.
※ 명시적으로 기재되지는 않았지만, 같은 우선순위의 의뢰는 줄을 서서 FIFO를 통해 전환됩니다.그럼요.

Co-operative Scheduling


다음 설정 알고리즘
Config
값 설정
configUSE_PREEMPTION
0
configUSE_TIME_SLICING
any value
기본 강좌는pre-emptive에 집중되어 있고 조율 스케줄링도 가능하다.
컨텍스트 스위치는 Runniig->Blocked로 변환되거나 taskYEID에서 현저하게 양보될 때 발생합니다.
임무는 절대 pre-empted에서 처리되지 않습니다.시간 절단도 안 하고.
별로 안 쓰는 것 같아서 안 쓸게요.

FreeRTOSConfig.h의 규격


configUSE_PORT_OPTIMISED_TASK_SELECTION


https://www.freertos.org/a00110.html
Tutorial의 설명 이외에는 별로 쓰지 않았다
"Is more efficient than the generic method."좌우
그리고 kernel의tasks입니다.c밖에 못 봐요.

configUSE_PREEMPTION, configUSE_TIME_SLICING


Tutorial 3.12 Scheduling Algorithm에 기재

configUSE_TICKLESS_IDLE

좋은 웹페이지 즐겨찾기