본문 바로가기

SW 개발 공부/OS 개발 프로젝트

(6)
[나빌로스] RTOS 컨텍스트 스위칭 정리 (Round Robin + 선점형 기반) 최근에 RTOS 기반의 태스크 스케줄링을 공부하면서, Round Robin 방식으로 동작하는 선점형 RTOS의 컨텍스트 스위칭 구조를 정리해봤다. 실제로 구현한 코드를 바탕으로 전체 흐름과 필요한 함수, 구조 등을 아래와 같이 요약함.● 기본 구조1. 모든 태스크는 TCB(Task Control Block)로 관리각 태스크는 독립적인 스택 영역과 레지스터 정보를 갖고 있어야 한다. 이를 위해 TCB 구조체에는 보통 다음과 같은 정보가 들어간다: typedef struct { uint32_t sp; uint8_t* stack_base; } KernelTcb_t; sp는 현재 태스크의 스택 포인터, stack_base는 할당된 스택의 시작 주소2. TCB 리스트 선언여러 개의 태스크를 관리하기 위해, TCB..
[나빌로스] 10.컨텍스트 스위칭 컨텍스트 스위칭(Context Switching) 과정 정리컨텍스트 스위칭은 현재 실행 중인 태스크(Task)의 실행 상태(레지스터 값, 스택 포인터 등)를 저장하고, 다음 실행할 태스크의 상태를 복구하여 실행을 이어가는 과정이다.아래는 Task1 → Task2로 전환되는 과정을 상세히 설명한 것이다.1. Task1이 실행 중Task1이 실행 중이며, Task1의 스택에는 현재 실행 중이던 함수 호출 정보, 지역 변수 등이 저장되어 있다.Task1의 레지스터(r0~r12, lr, cpsr)는 현재 Task1의 연산 상태를 유지하고 있다.2. 컨텍스트 저장 (Save_context)라운드 로빈 스케줄러가 Task1의 실행을 중단하고 Task2로 전환하려고 할 때,현재 Task1의 컨텍스트를 저장하는 과정이..
[나빌로스] 8.태스크 RealViewPB에서 Task Control Block (TCB) 설계 및 제어 개념RealViewPB에서 태스크를 관리하기 위해 **Task Control Block (TCB)**를 사용하며, 이를 기반으로 태스크의 상태, 레지스터 컨텍스트, 스택 정보 등을 관리해야 한다. 1. Task Control Block (TCB)란?TCB는 각 태스크를 관리하는 자료구조이다.운영체제가 여러 개의 태스크를 관리하고, **태스크 간 전환(Context Switch)**이 가능하도록 하기 위해 사용된다..🔹 TCB의 주요 구성 요소:컨텍스트(Context)실행 중인 태스크의 현재 상태를 저장 (CPU 레지스터 값)spsr, r0-r12, pc, sp 등이 포함됨태스크 정보태스크 ID, 태스크 이름, 우선순위 정..
[나빌로스] 7.타이머 모든 작업 순서하드웨어 레지스터 구조체 선언 & 주소 define // periperal.h레지스터 접근할 인스턴스 선언 // Regs.c인스턴스가 구동할 API 선언 // Halperiperal.hAPI 정의 // periperal.c + 응용 API 정의 ( stdlib.h/c or stdio.h/c)Main 에서 동작 추가 정의 RealViewPB에는 SP804 타이머 내장됨. SP804 Timer 개요 (RealViewPB)RealView Platform Baseboard (RealViewPB)에는 SP804 Timer가 포함되어 있으며, 이는 Dual Timer Module로 동작하는 ARM의 범용 타이머 컨트롤러이다.SP804는 32-bit 다운 카운트 타이머이며, 인터럽트를 발생시킬 수도 있..
[나빌로스] 5-1. UART printf 구현하기 debug_printf 함수는 가변 인자 처리기능을 구현한다.함수의 매개변수로 받는 ...는 가변인자를 의미한다. #ifndef LIB_STDIO_H_#define LIB_STDIO_H_uint32_t putstr(const char* s);uint32_t debug_printf(const char* format, ...);#endif  stdio.c 에 debug_printf를 선언해준다.#include "stdint.h"#include "HalUart.h"#include "stdio.h"#define PRINTF_BUF_LEN 1024static char printf_buf[PRINTF_BUF_LEN]; // 1KBuint32_t putstr(const char* s){ uint32_t c..
[나빌로스] 5. UART 1. 개요UART를 사용하기 위해서는 하드웨어의 레지스터를 코드로 구현해야 한다. 우리가 사용할 UART는 RealViewPB의 PL011이며, 해당 UART의 동작을 코드로 작성하는 방법을 알아본다.2. 레지스터 접근 방법ARM은 메모리 매핑된 I/O 방식을 사용하므로, 정의된 주소에 접근하여 각 레지스터를 제어할 수 있다. 이를 용이하게 하기 위해 다음과 같은 방법을 사용할 수 있다. 2.1 매크로를 이용한 방법  #define UART_BASE_ADDR 0x10009000 // PL011 base address#define UARTDR_OFFSET 0x00#define UARTDR_DATA (0)#define UARTDR_FE (8) // 8번째 offset#define UARTDR_PE (9) /..