오늘은 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 입니다. 이제 interrupt에서 0x20007ff4 번지의 Stack 에 backup 되어 있는 내용을 확인 하도록 하겠습니다. 아래 그림에서 Memory를 확인해 보면 Interrupt ..
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