SW 개발 공부 (77) 썸네일형 리스트형 [나빌로스] 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) /.. [STM32] UART DMA + Ring Buffer 개요통신 구현시 프로토콜의 패킷 구성이 명령어 별로 사이즈가 다른 경우, 정상적으로 데이터를 수신받기 위해서는 추가적인 처리가 필요하다. HAL Library에서 기본적으로 제공하는 HAL_USART_Receive_IT or DMA() 메서드의 동작은 설정한 버퍼 사이즈만큼 데이터가 수신되면 인터럽트가 발생하는 방식이다.따라서 해당 메서드를 사용하여 가변길이의 데이터를 파싱하기 위해선 반드시 1byte씩 데이터를 수신받아 내부 추가 처리를해야한다. HAL_UARTEX_ReceivetoIdle_IT or DMA() 메서드를 사용하면 데이터를 수신받다가 IDLE 상태가 되면 인터럽트가 발생하는 방식이다. 따라서 해당 메서드와 링버퍼를 사용하면 가변 패킷을 수신받아도 추가 파싱 처리 없이 데이터를 수신받을 수.. [STM32] Vector Table & SP & PC Vector Table 정의벡터 테이블은 0x08000000에 위치하는 Flash 영역의 제일 앞부분에 위치하며, Stack Pointer 값을 시작으로 각 exception handler들의 주소값을 포함하고 있다. MSP의 첫번째 주소값은 RAM의 최상단 주소값이 저장되어있다. SP의 초기값이 RAM 메모리의 최상단인 이유RAM의 최 하단값은 FW의 .data, .bss영역(초기화 된/되지 않은 전역,정적 변수영역)이 저장되어 있기 때문이다추가로, Heap 영역은 .data,.bss 영역 이후 부터 주소가 증가하며 업데이트된다.SP는 최상단에서부터 주소가 감소하며 업데이트된다. SP 정의Stack Pointer는 프로그램의 실행 마지막 주소를 저장하는 메모리공간이다. SP값 증감 방식프로그램이.. 이전 1 2 3 4 ··· 10 다음