목록RTOS (8)
꾸준히
컨텍스트 스위칭이란 태스크란 동작하는 프로그램이고, 동작하는 프로그램의 정보는 컨텍스트이다 이 컨텍스트를 어딘가에 저장하고 다른 어딘가에서 컨텍스트를 가져다가 프로세서 코어의 레지스터에 복구하는 작업이 컨텍스트 스위칭이며 컨텍스트 스위칭이 완료되면 다른 프로그램(태스크)가 실행되는 것이다 * 컨텍스트 컨텍스트 스위칭 과정 1. 현재 동작하고 있는 태스크의 컨텍스트를 현재 스택에 백업한다 2. 다음에 동작할 태스크 컨트롤 블록을 스케줄러에서 받는다 3. 2에서 받은 태스크 컨트롤 블록을에서 스택 포인터를 읽는다 4. 3에서 읽은 스택포인터로 태스크 스택의 컨텍스트를 읽어 ARM코어에 복구한다 5. 다음에 동작할 태스크의 직전 프로그램 실행 위치로 이동한다 6. 태스크가 전환 된다 Task1이 현재 동작 중..
동기화란 어떤 작업이 크리티컬 섹션이라고 판단되었을 경우, 해당 크리티컬 섹션을 아토믹 오퍼레이션으로 만들어 주는 것입니다 어떤 작업이 아토믹하다는 것을 쉽게 표현하면 해당 작업이 끝날 때까지 컨텍스트 스위칭이 발생하지 않는다는 것을 의미합니다 즉, 해당 작업을 원자처럼 더 이상 쪼갤 수 없다는 의미를 살리기 위해 아토믹이라는 이름이 붙은 것입니다 어떤 작업이 아토믹하게 구현되어야만 한다면 해당 작업을 크리티컬 섹션이라고 부릅니다 크리티컬 섹션을 만들려면 여러 태스크 혹은 여러 코어가 공유하는 공유 자원이 있어야 합니다 동기화를 구현하는 알고리즘에는 여러 종류가 있습니다 첫 번째는 가장 많이 쓰는 세마포어, 두 번째는 뮤텍스, 세 번째는 스핀락입니다 세마포어 void Kernel_sem_init(int3..
이벤트 이벤트는 인터럽트와 태스크 간의 연결 매체가 필요할 때 사용한다 RTOS 커널이 태스크를 관리하고 있으므로 좀 더 유연하게 동작하려면 인터럽트 핸들러의 구체적인 기능을 태스크로 옮기는 것이 좋기 때문이다 뿐만 아니라 태스크 간 연결 매체가 필요할 때도 이벤트를 사용한다 이벤트 플래그 이벤트는 개발자가 정한 어떤 값으로 전달된다 개발자가 처리할 수 있는 어떤 형태로든 이벤트를 만들 수 있다 이벤트를 비트맵으로 만들면 각각의 이벤트를 명확하게 구분할 수 있고 이벤트를 구분하는 코드를 간단하게 구현할 수 있다 이벤트를 처리할 수 있는 방법중 하나인 이벤트 플래그란 해당 비트 위치에 깃발을 올렸다 내렸다를 표시하는 것과 같아서 붙여진 이름이다 Code 이벤트 플래그 정의 typedef enum Kerne..
Task 태스크는 운영체제에서 동작하는 프로그램 단위이다 태스크 간 전환이 생길 때 프로그램의 흐름에 문제가 생기면 안되기 때문에 태크스 컨트롤 블록은 현재 진행 중인 프로그램의 현재 상태 정보를 기록하고 있어야한다 Task Control Block (TCB) 개별 태스크 자체를 추상화하는 자료구조 무엇을 포함하고 있어야 태스크를 추상화 할 수 있는가는 사람마다 다르므로 개발자가 필요하다고 생각하는 정보들로 추상화하면 된다 typedef struct KernelTcb_t { uint32_t sp; uint8_t* stack_base; } KernelTcb_t; Context 프로그램의 현재 상태 정보 = 현재 레지스터 값 태스크 컨텍스트는 결국 레지스터와 스택 포인터의 값이다. 스택포인터도 레지스터의 일..
인터럽트 처리 과정 인터럽트 컨트롤러를 초기화하고 사용하는 코드를 작성 실제 인터럽트를 발생시키는 하드웨어와 인터럽트 컨트롤러를 연결 하드웨어가 인터럽트를 발생시키면 인터럽트컨트롤러로 인터럽트 신호를 보냄 인터럽트 컨트롤러는 ARM 코어로 인터럽트를 보냄 펌웨어에서 cpsr의 IRQ 혹은 FIQ 마스크를 끄면 IRQ나 FIQ가 발생했을 때 코어가 자동으로 익셉션 핸들러를 호출 익셉션 핸들러에서 적절한 인터럽트 핸들러를 호출 인터럽트 핸들러에서 인터럽트를 처리하면 완료 Block Diagram Code 1. 인터럽트 컨트롤러를 초기화하고 사용하는 코드를 작성 static InterHdlr_fptr sHandlers[INTERRUPT_HANDLER_NUM]; // initialize interrupt con..
HAL (Hardware Abstraction Layer) - 개별 하드웨어는 각자의 방식으로 동작하더라도 이를 사용하는 코드는 공용 인터페이스를 통해서 같은 방식으로 사용할 수 있어야 한다 - 공용 인터페이스 API만 정의해 놓고 해당 API를 각자의 하드웨어가 구현하는 식으로 범용성을 추구한다 - 이런 공용 인터페이스 혹은 API 설계를 HAL이라고 한다 => 서로 다른 하드웨어를 추상화 계층이 중계해 준다 - HAL 공용 인터페이스 개요 구분 내용 기능코드 main(); API UART, Timer, GPIO Init (); 선언 HW UART, Timer, GPIO Init (); 정의
Startup.s 파일이란 arm 코어에 전원이 들어가면 arm 코어는 가장 먼저 리셋 벡터에 있는 명령을 실행한다 리셋벡터란 메모리 주소 0x00000000를 의미하며 startup.s 파일은 리셋 벡터에서 실행하는 명령어들을 담고있는 파일이다 보통 startup.s 파일은 시스템 클럭 설정, 익셉션 벡터 지정, 익셉션 핸들러 정의, 메모리 컨트롤러 설정, 스택영역 할당을 해준 뒤, main 함수를 call 한다 Startup.s 작성 Step 1. 메모리 설계 메모리 영역 메모리 사이즈 동적 할당 영역 0x4900000 ~ 0x7FFFFFF (55MB) 전역 변수 영역 0x4800000 ~ 0x48FFFFF (1MB) 태스크 스택 영역 0x800000 ~ 0x47FFFFF UND 모드 스택 0x100..
1. RTOS란 - Real Time Operation System - 운영체제의 응답과 동작이 즉각적이고 실시간이라서 붙여진 이름 2. RTOS를 만들기위해 필요한 기술 - 개발 환경 설정 - 컴파일러에 대한 이해 - 링커에 대한 이해 - 부트로더에 대한 이해 - 레지스터 사용에 대한 이해 - 인터럽트 처리 - 메모리 관리 - 주변장치 제어 - 멀티코어 동기화 - 멀티코어 간 메세지 처리 - 코어 아키텍처 (ARM, ...) 3. F/W vs RTOS - F/W는 규모가 작거나 극단적인 최적화가 필요한 임베디드 장치에서 사용 => 아무리 잘 만든다해도 임베디드 운영체제가 동작하면 그만큼 성능이 떨어짐 => 이 작은 성능조차 최적화하려고 임베디드 운영체제 없이 F/W만 사용 - RTOS는 시스템의 자원과..