오늘은 Context Switching을 하기 위한 PendSV Handler 구현을 다뤄보도록 하겠습니다. 대부분의 RTOS들은 PendSV Handler를 내에서 Context Switching을 하게 되는데 이는 Cortex-M core의 권장사항입니다. PendSV Interrupt 핸들러는 아래 명령어로 쉽게 발생하게 됩니다. #define schedule() SCB_ICSR |= (1 sp)); /* restore context */ restore_context(); asm volatile("mov lr, %0" ::"r"(0xFFFFFFF9)); asm volatile("bx lr"); /* USER CODE END PendSV_IRQn 0 */ /* USER CODE BEGIN PendSV..
Handling of context switching in a RTOS Cortex-M4F를 지원하는 RTOS를 설계할 때 컨텍스트 스위칭 코드가 lazy stacking 메커니즘을 인식하는 것이 중요합니다. 응용 프로그램 작업의 부동 소수점 사용에 따라 부동 소수점 컨텍스트 스위칭을 위한 가능한 예시는 세 가지 다른 경우로 나눌 수 있습니다. 모든 애플리케이션 작업에서 부동 소수점 연산 없음 하나의 애플리케이션 작업만 FPU를 사용합니다. 여러 애플리케이션 작업에서 FPU를 사용합니다. 사례 1: 애플리케이션 작업에서 부동 소수점 연산 없음 애플리케이션 작업이 FPU를 사용하지 않은 경우(EXC_RETURN[4]=1로 표시됨) 부동 소수점 컨텍스트 저장을 처리할 필요가 없습니다(그림 7 참조). 일..
이번 포스팅에서는 Interrupt 디버깅이나 RTOS 개발에 필요한 Cortex-M4(F) Lazy Stacking and Context Switching에 대한 Application note를 번역기를 돌린 내용입니다. Introduction Cortex-M4 프로세서는 ARMv7E-M 아키텍처를 기반으로 하며 Cortex-M3와 유사합니다. ARM Cortex-M3와 동일한 일반적인 데이터 처리를 위한 정수(integer) 레지스터 뱅크와 스택 기반 예외 모델을 가지고 있습니다. Cortex-M4 제품은 다음과 같이 제공됩니다. FPU가 없는 Cortex-M4 FPU가 있는 Cortex-M4F. Cortex-M4F를 Cortex-M4 또는 Cortex-M3과 비교하면 Cortex-M4F에..
지난 포스팅에서 Interrupt 발생시 Core 에서 어떻게 Stacking하는지에 대해 알아보았습니다. 이번 포스팅에서는 Task Context 스위칭시 R4 ~ R11 까지 Core Register들을 Stack에 쌓기 위해 기본적으로 알아야 할 ASM(assembler) 코드에 대해서 알아보겠습다. Task Context 스위칭시 사용되는 ASM 코드는 크게 아래와 같습니다. MRS : 레지스터의 값을 읽는다. mrs r0, msp : msp의 내용을 읽어 r0에 로드 STMDB : 여러개의 레지스터 값을 읽어 메모리의 위치에 저장한다. stmdb r0!, {r4-r11} : r0의 포인터에 r4 ~ r10의 내용을 내림차순으로 저장 MSR : 레지스터에 값을 저장한다. msr msp, r0 : ..
Context 스위칭을 하기 위해서는 우선 Cortex-M Core의 Stacking에 대해서 먼저 이해해야 합니다. Stacking은 Core가 interrupt 에 진입했을 때 정해진 Stackpointer에 Core registers의 내용을 저장하는 것을 말합니다.아래 그림은 Core registers 인데 우리는 이 레지스터를 통해 CPU의 현재 상태를 알 수 있습니다. 아래 예시는 while 구문 Context 에서의 Core registers입니다. 현재 Stack pointer는 0x20007ff8 입니다. 인터럽트가 걸리면 현재의 Core register를 Stacking하게 되며 따라서 Stack pointer 값이 0x20007ff8 + (8 * 4bytes) = 0x20007fd8 ..
RTOS를 사용하는 이유는 여러가지 업무(Task)를 동시에 처리하기 위해서입니다. MP3 플레이어를 예를 들어 보겠습니다. MP3 플레이어의 기본적인 기능은 다음과 같습니다. MP3 파일 입/출력 처리 MP3 파일 Decoding Decoding 음원 출력 Button 입력 처리 GUI 화면 처리 배터리 모니터링 기타등등 간단한 MP3 플레이어라고 해도 꽤 많은 업무를 동시에 처리해야 합니다. 위의 업무중에서는 파일 입/출력, Decoding 과 같은 CPU의 로드가 상당히 많이 필요한 업무들이 있습니다. 이러한 업무들을 순차처리 할 경우에 CPU의 리소스를 하나의 업무에서 독점하므로 음원이 끊어지는 상황이나 Button이 간헐적으로 동작하지 않는 상황, GUI 업데이트 되지 않는 등의 문제가 발생할 ..
에이콘 출판사에서 나온 책 "임베디드 시스템 아키텍쳐"의 내용을 토대로 STM32에 아주 기초적인 RTOS를 구현해보고자 합니다. 실제 상용제품에 이용할 수준은 아니고 다른 RTOS를 쉽게 이해하는 용도로 생각해 주시면 좋을 것 같습니다. 그리고 책 "임베디드 시스템 아키텍쳐"에는 다른 내용도 많으니 한번 읽어보시는 걸 추천드립니다(광고아님). https://product.kyobobook.co.kr/detail/S000001804798 다음 장 부터는 RTOS 커널에서 가장 중요한 Task 스케줄러 구현을 천천히 진행해 보도록 하겠습니다. 이상입니다. 임베디드 시스템 아키텍처 | 다니엘 라카메라 - 교보문고 임베디드 시스템 아키텍처 | product.kyobobook.co.kr