반응형
01. 모든 개발자가 ARM 프로세서를 배워야 하는 이유
이제 조금 더 깊게 들어가서 왜 임베디드개발자 혹은 일반개발자들도 ARM 프로세서를 배워야 하는지 알아보자.
임베디드 개발자가 ARM 프로세서를 배워야 하는 이유
보드 브링업을 제대로 수행하기 위해
- 임베디드 개발자들이 진행하는 프로젝트의 단계는
보드 브링업 - 기능안정화 - 유지보수
정도로 분류될 수 있다. 이 중보드 브링업
단계에서는 구체적으로 어떤 일을 할까?- 부트로더에서 스타트업 코드를 작성
- 스타트업코드란 전원이 시스템에 들어오면 가장먼저 실행되는 주소에 코드를 위치시켜서 시스템을 초기화하는 코드이다.
- 스타트업 코드는 기본적인 메모리 설정을 초기화하고 ARM 모드 별로 스택 사이즈를 지정해야 한다
- 이 스타트업 코드를 제대로 작성하기 위해선
ARM 어셈블리 명령어
를 알아야 한다. ARM 동작 모드 별로 스택 주소를 설정하고, ARM 프로세서를 초기화 하는 코드는 C 언어가 아니라 어셈블리어를 이용해 설정할 수 밖에 없기 때문이다.
- 메모리와 같은 하드웨어 초기화
MMU(Memory Management Unit)
과 같은 ARM의 구성요소도 어셈블리 명령어로만 설정할 수 있다.- ARM 명령어는 기본으로 알아야 하고 ARM 아키텍쳐를 알고 있어야 한다.
- 부트로더에서 스타트업 코드를 작성
- 임베디드 개발자들이 진행하는 프로젝트의 단계는
RTOS나 리눅스 커널에 대한 깊이있는 이해를 위해
리눅스 커널
이나RTOS
를 깊이 있게 배우려면 ARM 프로세서의 동작 원리를 제대로 알아야 한다. 커널을 구성하는 세부 시스템의 핵심 루틴은 ARM 어셈블리 명령어로 구현되어 있기 때문이다. 더 구체적으로는 리눅스 운영체제나 RTOS는 ARM의 익셉션을 활용한 기능들이 많다.- 리눅스 커널의 다음 서브 시스템은 어셈블리 명령어로 구현돼 있으며 ARM의 익셉션 기능을 활용해 동작한다.
- 인터럽트 벡터
- 컨텍스트 스위칭 루틴
- Preemption 처리 루틴
- 시그널을 받아 처리하는 루틴
- 시스템 콜 핸들러를 처리하는 루틴
디버깅을 잘 해 뛰어난 문제해결을 위해
난이도나 복잡도가 높은 드라이버를 맡으면
커널 패닉
이나 심하면와치독 리셋
과 같은 문제를 만날 가능성이 높다. 이런 크래시 문제를 디버깅하기 위해서는 ARM 프로세서를 제대로 알고 있어야 한다.실전 프로젝트를 진행하다보면 수 많은 버그를 만나게 된다. 이 중에서 개발자들이 가장 어려워하는 버그는 커널 패닉인데, 커널 패닉이 발생하면 커널 로그는 커널 패닉이 발생한 코드의 위치를 ARM 레지스터 세트와 함꼐 출력합니다. 다음은 커널 패닉이 발생할 때의 커널 로그의 한 예이다.
pc : [<0x0051c760>] lr : [<0x0051c740>] sp : 0x03851c08 ip : 0x2e76278a fp : 0x03851c2c r10: 0x03b57edc r9 : 0x03b57e94 r8 : 0x03b57e7c r7 : 0x03b61d54 r6 : 0x03b57f24 r5 : 0x2e762758 r4 : 0x00000022 r3 : 0x00000022 r2 : 0x00000000 r1 : 0x009b4560 r0 : 0x2e762788
보다시피 ARM 코어의 레지스터 세트가 출력되는데 각 레지스터의 역할과 동작 원리를 파악하고 있어야, 커널 크래시가 발생한 원인을 분석할 수 있다.
그 외의 개발자가 ARM 프로세서를 배워야 하는 이유
- 사실 예전과 달리 소프트웨어 분야가 다양해졌고, 한 프로젝트에 탑재되는 소프트웨어의 계층 구조도 복잡해졌기 때문에 모든 SW 개발자가
ARM 프로세서
를 잘 배울 필요는 없다. - 하지만 아래의 안드로이드 시스템 아키텍쳐를 보자.
- 그림의 윗 부분부터 보면 "
Application
" - "Application Framework
" - "Libraries
" - "Linux Kernel
" 이란 계층이 보입니다. "Application" 계층에 있는 코드는 대부분 Java란 언어로 구현되며, 이 계층에서 실행되는 애플리케이션을 개발하는 개발자 분들은 애플리케이션의 시나리오나 안드로이드 프레임워크에서 제공하는 함수의 용법을 파악한다. Java로 애플리케이션을 개발하는 분들은 ARM 프로세서의 동작 원리에 대해서 잘 알 필요는 없다. - 하지만 C나 C++언어로 구현된 Application Framework이나 Libraries를 개발하는 개발자들은 ARM 프로세서에 대해 잘 알 필요가 있다.
- 시스템 소프트웨어 개발자와 마찬가지로 C/C++로 구현된 코드를 작성하거나 다른 라이브러리를 링크해 어떤 기능을 구현하다보면 여러가지 버그를 만날 가능성이 높습니다. 그 중에 대표적인 케이스를 예로 들면 다음과 같다.
- 크래시가 발생하면 코어 덤프와 같은 메모리 덤프 파일을 받아 디버깅을 수행
- 특정 시점에서 성능이 안 나오는 문제가 나와 성능을 키우기 위한 코드 작성
- 이와 같은 실전 문제를 빨리 디버깅하고 최적의 코드를 작성하기 위해서는 ARM 프로세서의 동작 원리를 파악할 필요가 있다.
- 사실 예전과 달리 소프트웨어 분야가 다양해졌고, 한 프로젝트에 탑재되는 소프트웨어의 계층 구조도 복잡해졌기 때문에 모든 SW 개발자가
결론은 코딩을 하는 모든 개발자들은 자신이 작성한 코드를 실제 실행하는 CPU가 어떻게 작동하는지 잘 알아야 더 좋은 코드를 작성할 수 있다.
반응형
'임베디드 > [ ARM ]' 카테고리의 다른 글
[ ARM ] 00. ARM 프로세서와 우리가 이를 배워야 하는 이유 (0) | 2021.03.09 |
---|