ARM-Cortex M 시리즈에서는 컴파일러의 최적화에 따라서 다르지만 서브루틴을 호출하면 원래의 위치로 복귀하기 위해서 LR(Link Register)에 PC의 내용을 저장하게 됩니다. 하지만 Exception(혹은 Interrupt)상황에서는 LR에 아래와 같은 이상한 값들이 저장됩니다. 0xFFFFFFF1 0xFFFFFFF9 0xFFFFFFFD 0xFFFFFFE1 0xFFFFFFE9 0xFFFFFFED 왜 이럴까요? 결론적으로 말씀드리자면 Exception 해제시 Handler/Thread Mode, MSP/PSP를 시스템이 알기 위해서 입니다. 위의 값을 EXC_RETURN 값이라고 하는데 이 값들이 LR에 저장이 되고 Exception 해제시 시스템이 LR을 읽어 진입시의 상태로 되돌릴 수 ..
Core Architecture Barrier 우리가 직관적으로 생각하기에는 ARM Core에서 메모리 시스템이 메모리 트랜잭션을 생성한 인스트럭션의 순서와 같은 순서로 트랜잭션이 실행될 것이라고 생각하기 쉬우나 이는 틀린 생각입니다. 메모리 트랜잭션의 순서는 하드웨어의 특성에 적응하기 위해 변경될 수 있습니다. 예를 들어, 기저 물리 메모리에 접근하기 위해 필요한 대기 상태나 마이크로코드 수준에서 구현된 추측 분기 예측 메커니즘 같은 것을 말합니다. Cortex-M 마이크로컨트롤러가 주변장치 및 시스템 구역에 걸쳐 엄격한 트랜잭션 순서를 보장하기는 하지만, 경우에 따라서는 실행 순서를 고려해 코드를 구현해야 합니다. 다음 인스트럭션을 실행하기 전에, 이전 메모리 트랜잭션이 수행됐음을 확인하기 위해 적절..
오늘은 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..