RTOS를 사용하지 않는 베어메탈 Firmware의 프로그램 절차는 무한루프와 인터럽트로 이루어져 있습니다. 이번장에서는 무한루프의 구조를 어떻게 바꾸며 보다 효율적이고 좀 더 그럴듯하게 만들 수 있는지 알아보겠습니다. 우선 우리가 알고 있는 기본적인 while 무한루프입니다. /* main.c */ void main(void) { while(1) { process1(); process2(); switch(key) { case button1: break; case button2: break; case button3: break; default: break; ... } } } 위의 코드는 간단해보이지만 실제적으로는 훨씬 더 복잡해 질 가능성이 있습니다. 만약 설정(#ifdef)에 따른 process 유무가..
이번에 Azure RTOS에 대한 기사가 떴네요. 본문 번역해서 올려봅니다. 이제 Azuer RTOS가 MS를 떠나 Eclipse Foundation 관리 하에 오픈소스 모델로 전환된다는 것이 핵심입니다. -- 구글번역 -- 전 세계적으로 120억 개 이상의 장치에 배포된 ThreadX 실시간 운영 체제가 포함된 개발 제품군인 Azure RTOS에 관한 중요한 업데이트를 공유하게 된 것을 기쁘게 생각합니다. 혁신과 커뮤니티 협업에 대한 약속을 강화하기 위해 Azure RTOS는 오픈 소스 IoT 프로젝트 호스팅 분야의 리더로 인정받는 Eclipse Foundation의 관리 하에 오픈 소스 모델로 전환할 예정입니다. Eclipse Foundation을 새로운 홈으로 사용하면 Azure RTOS는 리소스가..
오늘은 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 업데이트 되지 않는 등의 문제가 발생할 ..