-
임베디드 OS 개발 [8,9,10장] 요약Share/OS 2021. 3. 27. 21:03
*이만우 선생님의 임베디드OS 개발 프로젝트 책을 기반으로 요약하였습니다.
목표
- 지난 시간까지 해왔던 작업들
- 태스크 생성 및 태스크 컨트럴 블럭 초기화
- 스케쥴러 만들기
- 컨텍스트 스위칭 백업/복구 그리고 커널 시작
지난시간까지 했던것들
아~주 간단하게 정리하자면
하드웨어 (ARM x86)기반의 펌웨어가 이루어지는 과정을 작성해가고있다.
지금까지는 타이머, uart 등을 포함하여 qemu를 이용하여 arm의 register 및 memory map 을 구조체로 추상화하여 직접 메모리에 접근하여, HAL_Library 등을 만들어서 main에서 함수를 호출하여 작성할 수 있도록 비슷~한 프로세스를 밟아가고 있었음.
이때 makefile을 수정하여 sp(Stack Pointer)가 변화되는 과정을 직접 실습하면서, 데이터가 저장되거나 실행되고 있는 메모리의 주소를 print 해보기도 하였다.
태스크 생성
이제부터는 실제로 태스크를 만들어보자,
먼저 왜 태스크가 필요할까?!
이 질문이 반드시 필요하다. 왜냐하면 ?!
태스크, 스케쥴링, 커널 등 이러한 이름들 정의들은 결국에 개발자들이 만들어가면서 "각 기능이 필요함에따라" "편의를 위해" 어느정도 교통질서가 이루어졌고 정의되어진 개념이기때문에 왜 필요했을까를 생각해보자.
사용자(철수)가 게임(응용프로그램)을 하고 있는데, 컴퓨터로 음악을 들으면서, 마우스 클릭(외부 interrupt)으로 총도 쏘고, 주식창도 웹으로 보고있다. 즉 여러 일(Task)가 동시에? 이루어지고 있는 것 처럼 보인다. 혹은 정말 동시에? 이루어지고 있다?.
이때 동시에 라는 것이 어떤 의미인가. 그리고 게임을 하는 중에 다른 작업을 하다가 다시 돌아올때 컴퓨터는(CPU)는 이것을어떻게 기억하고 있을까.
그렇다.
흔히 어떠한 작업 을 프로세스라 하고 RTOS 라고 하면 이러한 프로세스 혹은 태스크를 어떻게 ~ 자알~ 작업을 하게 할지 설계하는 일이다.
그 첫번째로 용어를 TCB(Task Control Block) 태스크 컨트롤 블록 이라고 한단다.
정의는 " 개별 태스크 자체를 추상화하는 자료구조" 이다.
그야말로 자료구조이다. 어떤 자료구조 ? 개별 태스크 자체를 !
그 개별 태스크 자체는 context를 의미한다.
이해는 가물가물 언뜻 많이보던 그림. 이게 바로 context 이다. 어떠한 프로그램의 현재 상태 정보를 의미한다.
더 자세히 얘기하면 user mode register에 R14-R13 . .. 등이 있고,~ System mode 레지스터 등등 깊히 얘기하면 끝도 없으니 일단 생략하자.
어쨋든, 저 컨텍스트라는 레지스터 덩어리 속에 현재 프로그램 상태 정보가 들어가 있다는 것이다
int example (void)
{
int a = 1;
int b = 2;
result a + b;
}
이러한 현 상태의 프로그램이 있다면, 저 변수 a,b를 저장하고 있는 레지스터가 어딘가에 쏙쏙 들어가서 현상태를 저장 하고있다는 것이다. 당연히 return 되는 값도 마찬가지.
저 밑에 SPSR은 (Saved Program Status Register) 이고 이 친구가 CPSR(Current Program Status Register) 이란 것인데, 둘의 차이점과 의미는 일단 생략. (메모리를 공유한다거나, ARM core에 하나씩 밖에없다거나 등등)
무튼, 각 기능을 하는 레지스터들이 각자가 다 할일과 맡은 바가 있다. 이렇게 똑똑한 공학자들이 이렇게 만들어 놨다는 것을 받아들이는것도 필요한듯하다.
쨌든, 결국 정보는 저러한 레지스터에 각가 밖혀있는것인데, 저 한줄을 context라고 했고,
그 context의 자료구조를 추상화하는 자료구조가 TCB 라는 것이다 !
조금 감이 오지않는가.
TCB는 자료구조 of 개별 태스크 자체
그 개별 태스크는 레지스터(R0~R14, SPSR) 에 어떠한 현재 프로그램의 값/정보들이 들어가있는 Context
결국 TCB는 각 태스크 별로 태스크의 이름, 스택포인터, 어떤 시그널이 올지 등의 정보를 지니는 자료구조라는 것.
TCB와 CPU 그리고 Stack의 관계는 구글링 ! 숙제 ! 더 깊게 알 수가 있다.
어쨋든 ~!
이러한 구조(?)로 만들어 놨으니, 받아들이고 우리는 TCB를 직접 작성해보자.
이것이 RTOS 커널을 만드는 첫번째 작업이다.
폴더 구조를 이렇게 생성하고 task 파일을 각각 만들자.
task 헤더의 핵심은
ARM의 프로그램 상태 레지스터 와 범용 레지스터를 백업할 수 있는 영역을 구조체로 확보 해 놓은 것.
태스크 컨텍스트 = 레지스터 + 스택 포인터
이를 task.c 에서 구현하자.
핵심은
태스크 컨트롤 블록 배열을 모두 순휘하면서 초기화 해주고
스택포인터를 할당하고
결국 Kernel_task_create() 함수를 생성하는 것이다 .
뭔가 개념이 왔다갔다 하는데
결국은 TCB란 무엇이고 어떤 역할을 할것이며, task와 stack pointer 할당 및 CPU와의 관계가 어떻~~하기때문에 를 알아야 작성이 가능하다.
task.c
스케쥴러
이제 밑바탕을 대략? 해놨으니, (TCB가 하나의 자료구조, 즉 태스크의 청사진 이라면)
그 다음은 실제로 떠한 스케쥴, 즉 이거처리하고다음은 이거 , 그리고 저거 를 효율적 ! 으로 녀석이다.
그 효율적이라는 것은 메모리를 아름답게 사용하는 것을 의미하며
라운드 로빈 알고리즘을 적용하여 스케쥴러를 작성해보자,.
라운드 로빈 알고리즘은 추가계산없이 인덱스를 계속 증가시키면서 대상을 선택하는 알고리즘
더 자세한건 구글링 고고
task.c에 스케쥴러 부분 추가 작성해보자
스케쥴러가 이안에 있단다.
이번장의 코드는
1. 위에서언급한 라운드 로빈 알고리즘 반영
2. 우선순위 스케쥴러
즉, 우선순위를 태스크 컨트롤 블록에 추가해주고, 우선순위를 TCB에 등록하는 것이 사실 끝이다.
컨텍스트 스위칭
말그대로 지금까지 지지고 볶았던 TCB,
컨텍스트를 전환 하겠다는 것.
다시 말하자면, 태스크란 동작하는 프로그램이고, 동작하는 프로그램의 정보가 컨텍스트 이다
느낀점
- 태스크, 프로세스, 스택포인터, CPU등 서로의 관계나 필요성을 알아야 된다.
- 우선순위와 컨텍스트 스위칭에 대해서는 코드를 봐도 잘 이해가 되지 않는다. 현재까지는........ㅠ
- TI의 자체 RTOS 나 STM으로 FreeRTOS의 경험으로는, 이러한 우선순위를 정하는 등의 대부분의 과정을 API로 만들어놔서, TCB개념조차 흔들렸다.
- TCB를 포함하여 커널까지, 각 기능과 필요성을 그림으로 완벽하게 그릴 줄 알고 코드로 작성하다면 금상첨화 일것같다.
- FreeRTOS 에서는 어떻게 구현이 되어있는지 비교를 해봐야 될 것 같다.
- 이 책에서 가장 어렵다고 저자 선생님도 말하고있지만, 어려운 것에 비해 설명이나 내용이 부족하여 아쉽다.
- 임베디드 레시피를 통해 조금 보강을 하였지만도 여전히 "나의 것" 이 된 것은 아니다.
작성중..
'Share > OS' 카테고리의 다른 글
[error] apt-get update 에러 , apt install net-tools 설치 에러, could not get lock /var/lib/dpkg/lock (2) 2021.11.23 VirtualBox 해상도 및 복사붙여넣기 에러 (could not get lock dpkg ) dpkg 오류 (0) 2021.10.01 임베디드 OS 개발 [5장] (0) 2021.03.06 임베디드 OS 개발프로젝트 [4장] (0) 2021.03.03 임베디드 OS개발 CH3 (5) 2021.02.20