MPU setting example with STM32Cube HAL on Armv6 and Armv7 architectures 아래 표는 내부 SRAM, 플래시 메모리 및 주변 장치와 같은 메모리 영역으로 MPU를 설정하는 예를 설명합니다. 기본 메모리 맵은 권한 있는 액세스에 백그라운드 영역으로 사용되며 MPU는 HardFault 핸들러 및 NMI에 대해 활성화되지 않습니다. Internal SRAM: 8 Kbytes of internal SRAM is configured as Region0 내부 SRAM: 8KB의 내부 SRAM이 Region0으로 구성됨 Memory attributes: shareable memory, write through with no write allocate, fu..
Cortex-M33 memory types, registers and attributes MPU 작업에 대한 개념은 유사하지만 Armv8-M 아키텍처의 MPU는 이전 버전의 M-profile Arm 아키텍처의 MPU와 다른 프로그래머 모델을 가지고 있습니다. 모든 MPU 레지스터가 뱅크된다는 사실을 깨닫는 것이 중요합니다. Arm TrustZone®이 활성화된 경우 보안 상태에 대한 MPU 레지스터 세트와 비보안 상태에 대한 미러 세트가 있습니다. 0xE000 ED90과 0xE000 EDC4 사이의 MPU 주소에 액세스할 때 액세스되는 MPU 레지스터의 유형은 프로세서의 현재 상태에 의해 결정됩니다. 비보안 코드는 비보안 MPU 레지스터에 액세스할 수 있고 보안 코드는 보안 MPU 레지스터에 액세스할..
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
먼저 우리가 구현해야 할 app controller의 extern 함수들을 확인하겠습니다. extern int app_init_app(app_t *app); extern void app_process(void); extern int app_set_msg(msg_t msg, uint32_t param1, uint32_t param2); extern int app_start_app(app_id_t id); extern int app_switch_app(app_id_t id); extern app_t *app_get_current_app(void); 각각의 역할은 지난 포스트에서 기록한 대로입니다. app_init_app - app 등록 app_process - 현재 active app의 loop 실행, 메시..
펌웨어를 처음 개발할 때 수많은 절차와 처리들을 어떻게 일목요연하고 보기 쉽게 코딩해야하는지 막막하게 느껴집니다. 이럴 때 보통 디자인 패턴이라는 프로그래밍의 오래된 습관 혹은 관습을 이용하여 해결할 수 있습니다. state machine은 이런 디자인 패턴중에 하나로 아주 사용하기 쉽고 유용하며 소프트웨어 개발자라면 꼭 알아야 할 디자인 패턴 기법입니다. single core 안에서 동작 중인 application은 반드시 하나의 상태(state)안에 있습니다. 각각의 이벤트나 어떠한 처리는 state 안에서 이루어 지며 여러개의 state 끼리 서로 전환하며 프로그램이 동작하게 됩니다. 아래 다이어그램에서 우리가 만들 app state machine 을 좀 더 구체적으로 알아보겠습니다. a..