고성능 STM32에 포함되어 있는 MPU(Memory protection unit) 를 설명하고 있는 어플리케이션 노트 AN4838을 번역기를 돌려 올리도록 하겠습니다. Managing memory protection unit in STM32 MCUs Introduction 이 애플리케이션 노트는 STM32 제품에서 메모리 보호 장치(MPU)를 관리하는 방법을 설명합니다. MPU는 메모리 보호를 위한 선택적 구성 요소입니다. STM32 마이크로컨트롤러(MCU)에 MPU를 포함하면 더 강력하고 안정적입니다. MPU를 사용하기 전에 프로그래밍하고 활성화해야 합니다. MPU가 활성화되지 않은 경우 메모리 시스템 동작에는 변경 사항이 없습니다. 이 애플리케이션 노트는 MPU를 지원하는 Cortex®-..
Cortex-M7 아키텍쳐는 MPU를 통해 각 메모리의 유형(Type)과 속성(Attributes)를 지정할 수 있습니다. 여기서 메모리는 Internal or External 메모리를 말합니다. 메모리 맵과 MPU는 메모리 맵을 영역으로 분할합니다. 각 영역에는 정의 된 메모리 유형(type)을 가지고 있으며 일부 영역은 추가 메모리 속성(attributes)이 가지고 있습니다. 메모리 유형 및 속성은 영역에 대한 액세스 동작을 결정합니다. 다음은 STM32F7, H7 Programming manual을 번역하여 올립니다. 1. Type - Normal : 프로세서는 효율성을 위해 트랜잭션을 재정렬하거나 추측 읽기를 수행 할 수 있습니다. 즉, 순차적으로 정렬된 Instruction 대로 실행이..
오늘은 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 업데이트 되지 않는 등의 문제가 발생할 ..