CORTEX-M 프로세서를 체계적으로 학습하고 싶으신가요? 임베디드 시스템의 가장 중요한 토픽 2가지 어셈블리어와 인터럽트를 확실히 정리해드립니다.
이런 걸
배워요!
비정렬 액세스를 써도 좋을까요?
어셈블리어의 중요성
파이프라인의 동작원리
인라인 어셈블러
링커스크립트
NVIC 장치의 동작원리
익셉션 처리 절차 시작부터 종료까지 완벽 분석
클럭제어기
부트 코드 분석
강의 하나로 정리하는 ARM Cortex-M 프로세서
개념부터 실제 노하우까지 확인하세요.
가장 인기있는 임베디드 시스템용 32비트 마이크로 프로세서입니다
대표적인 프로세서로 CORTEX-M3 , CORTEX-M4 , CORTEX-M0 , CORTEX-M33 이 있습니다
소비전력이 적고 가격 경쟁력도 있어서 다양한 분야의 제품에 적용되고 있습니다
출처: ARM
CORTEX-M 프로세서는 드론, 스마트 팩토리, 자율주행차, 우주항공, 의료진단기기, 가전, 사물인터넷, 환경 에너지를 비롯한 다양한 분야의 임베디드 시스템에서 사용되는 가장 인기있고 주목받는 32비트 마이크로 프로세서입니다.
CORTEX-M 프로세서는 성능보다는 가격, 소비전력의 효율을 중시하는 애플리케이션에 적합하고요. 낮은 게이트 수, 낮은 인터럽트 대기 시간 및 디버그 기능을 갖춘 프로세서입니다.
기본 인스트럭션 세트로 THUMB2 명령어를 지원합니다.
NVIC는 프로세서 코어와 밀접하게 통합되어 대기 시간이 짧은 인터럽트 처리를 구현해주고 있습니다.
인터럽트 응답 시간 개선을 위한 '테일 체인' 및 'LATE ARRIVING' 인터럽트를 지원합니다.
원자적 액세스 지원을 위한 비트 밴드 쓰기 및 읽기 작업을 포함하는 비트 밴드를 지원해줍니다.
STmicro 사의 $100 미만의 마이크로컨트롤러 보드를 쉽게 구할 수 있습니다.
과거 수십 년간 지금만큼 개발자의 가치가 존중받는 때는 없었다고 생각합니다. 장래 희망이 무엇이냐고 청소년들에 물었을 때 의사, 검사라는 대답과 함께 '개발자' 라는 말을 들을 수도 있으니 말입니다.
개발자가 귀해지고 그에 따라 몸값도 올라가니, 덩달아 대학 인기순위에 컴공, 전자공이 상위 랭크되는 것을 보면 영화 제목 '이보다 더 좋을 순 없다' 라는 말처럼 19세기 미국 서부 시대 황금을 찾아 엘도라도로 떠나는 사람들이 오버랩됩니다. 가히 개발자 전성 시대라고 불러도 좋을 것 같습니다.
2016년 국내 M 사 내부에서 흘러나온 이 멘트가 뉴스에도 오르며 한동안 회자된 적이 있었죠. 그리고, 이런 일이 없었더라도 누구나 한 번씩은 살아오면서 들어보았을 만한 단어입니다. 그런데 문제 해결 능력을 갖춘 개발자라뇨? 이게 왜 이슈가 되었던 것일까요.
제가 이해하는 이 문장의 뜻은 단순한 시각으로 보면 이겁니다. 예를 들어보죠. 이 코드는 분명히 내가 짠 코드입니다. 이 프로그램에는 틀림없이 버그가 있습니다. 나도 그것을 압니다. 그런데 이것을 해결하지 못하는 겁니다. 짧게는 몇시간, 몇일, 길게는 수개월 동안이나요.
진짜 이런 일이 일어날 수 있냐고 물어보신다면, 당연히 이런 상황이 얼마든지 가능하다고 말씀드리고 싶네요. 그러니까 이슈화까지 되었던 거겠죠.
코딩은 약간의 지식만 가지면 누구나 할 수 있습니다. 하지만 문제 해결은 다른 차원의 문제입니다.
임베디드 시스템에서 작동하는 소프트웨어는 만드는 것도 어렵지만, 드물게 발생하는 까다로운 문제를 해결하는 것은 더더욱 어렵습니다. 왜냐하면 사안에 따라서는 소프트웨어로만 문제의 범위를 좁혀서 생각하면 문제 해결이 안 될 수도 있기 때문인데요. 임베디드 시스템의 구성 요소가 '하드웨어+소프트웨어' 임을 생각해 볼 필요가 있습니다.
지금도 매년 새로운 많은 종류의 실리콘들이 세상에 나오고 있습니다. 또한 이 칩들을 적용한 보다 많은 종류의 하드웨어들이 만들어집니다. 이 모든것이 하드웨어적으로 완벽하다고 믿을 수 있을까요?
문제 해결에 있어서는 하드웨어 버그의 가능성도 고려하여야 합니다. 어떤 문제가 쉽게 해결되지 않는다면 소프트웨어 개발자는 이것이 하드웨어 문제인가, 소프트웨어 문제인가를 한번 생각할 수 있어야 합니다.
그런데 이것이 평소에 훈련이 되어 있어야 한다는 점이죠. 아무런 근거 없이 "이건 하드웨어 문제야" 혹은 "소프트웨어 문제야"라고 주장하는 것은 누구도 설득하기 어렵습니다.
제가 겪어보았던 적지 않은 소프트웨어 개발자들이 자의든 타의든 하드웨어에 대한 지식이 빈약하고, 심지어는 아예 관심이 없었죠. 그렇기 때문에 문제 해결 능력을 갖춘 개발자는 이 분야에서는 더욱 더 귀하고 중할 수 밖에 없습니다.
결론은 이미 나온 것이죠. 하드웨어를 이해하려고 해야 합니다.
하드웨어를 이해한다는 것이 꼭 인쇄회로기판에 전자 부품을 납땜해보는 것을 의미하지는 않습니다. LED 나 버튼키를 완벽하게 제어하는 것을 의미하지도 않습니다.
그보다는 어셈블리어를 공부하면서 임베디드 시스템이 동작하는 기본 원리를 이해해야 합니다. 제가 믿고 이해하는 임베디드 소프트웨어를 풀어나가는 2가지 핵심 키워드는 어셈블리어와 인터럽트입니다.
어셈블리어는 하드웨어를 이해하기 위해서이며, 인터럽트는 비동기적으로 실행되는 소프트웨어 메커니즘인만큼 시스템의 안정성을 해칠 가능성이 높습니다. 따라서 신뢰도가 높은 소프트웨어를 만들기 위해서 잘 학습해 두어야 합니다.
개발자들 사이에서는 어셈블리 언어를 바라보는 다양한 시각이 있습니다. 우선 여기 국내 유명 개발자 커뮤니티 게시판의 글을 한번 읽어보세요
현대 컴파일러는 과거에 비해 더욱 똑똑해졌습니다. 최적화된 코드를 잘 만들어줍니다. 시스템 성능을 좋게 만들기 위해 어셈블리어로 코딩하는 것은 과거의 이야기일 뿐입니다. 그렇다면 제가 어셈블리어를 진심 강조하는 이유는 어디있을까요?
어셈블리어를 우리가 배우는 이유는 임베디드 시스템의 동작 원리를 더 잘 이해하기 위해서라고 봐야하죠. 어셈블리어는 개발자가 임베디드 시스템의 속살을 들여다 볼 수 있도록 도와줍니다.
나무를 보지 말고 숲을 보라는 말처럼, 어떤 공부를 하던지 끊임없이 학습 대상의 구조(체계)를 이해하려고 노력해야 합니다. 임베디드 시스템은 '하드웨어+소프트웨어' 임을 다시 한번 생각해 볼 필요가 있습니다.
2년 이상 개발하였는데도 임베디드 시스템 개발 능력이 비약적으로 향상되지 않았다면, 이제는 당신의 학습 방법을 근본적으로 바꾸어 보세요.
'어떤 분야든 10,000시간을 투자하면 그 분야의 전문가가 된다'는 말이 있죠. 저도 공감하는 말입니다만, 이 문장을 조금 바꾸고 싶네요. 이렇게요. '어떤 분야든 효과적인 방법으로 10,000시간을 투자하면 그 분야의 전문가가 된다'.
위에서 언급한 장점 외에도 어셈블리어를 공부해두면 부수적으로 여러 가지 이득이 있습니다.
첫째, 어떤 소프트웨어이던 1~5% 정도의 어셈블리 코드는 무조건적으로 포함됩니다(그 이유는 어셈블리어를 공부해 보시면 압니다). 그 내재된 어셈블리 코드까지 이해하면 해당 소프트웨어의 100% 완전한 통제가 가능하게 됩니다.
둘째, 어셈블리어로 작성되어 있는 부트코드(부트로더 아님)를 이해하고 스스로 코딩할 수 있는 토대를 만듭니다
셋째, 디버깅(문제해결) 도구 사용 능력의 스펙트럼이 넓어지고, 깊어집니다
넷째, 소프트웨어를 질적으로 개선하여 시스템 성능을 좋게 만들고 메모리를 효율적으로 활용할 수 있습니다.
다섯째, 어떤 하드웨어에서 동작하는 소프트웨어를 다른 하드웨어에서도 동작하게 하는 것을 포팅(Porting)이라고 부르는데, 이때 어셈블리어의 사용 능력은 필수적입니다.
여섯째, C언어의 포인터를 쉽게 이해할 수 있습니다.(어셈블리어로 메모리나 I/O 장치를 제어할 때 어드레스라는 개념은 필수입니다)
이 교육(ARM Cortex-M 프로세서 프로그래밍)에서 이 두 가지(어셈블리어, 인터럽트)를 확실히 다룹니다.
나는 어셈블리 언어에 관심없다고 생각하시는 분들은 이 강좌를 무시하고 걸러주세요. 진정한 가치를 이해하시는 분들과만 함께 가고 싶습니다.
오프라인 ARM 프로세서 교육에서는 개인적인 신념으로 수강생 분들에게 이 내용을 줄곧 강조해 오고 있습니다. 이 강좌를 통해 임베디드 시스템을 다른 관점으로 바라보는 시각을 제공해드리고 싶습니다.
위의 내용은 모두 이번 강의의 핵심 주제입니다. 자, 세부 내용을 알아볼까요.
비정렬 액세스를 허용하지 않던 과거 ARM 프로세서와 달리, CORTEX-M 프로세서에서는 기본적으로 비정렬 액세스를 사용할 수 있게 되었는데요. 비정렬 액세스를 사용하는 것의 득과 실을 따져봅니다
임베디드 소프트웨어를 개발할 때 하드웨어는 문제가 없다고 미리 단정짓고, 소프트웨어를 개발하게 될 경우 누구나 언제든 예기치 않은 함정에 빠질 수가 있습니다. 이와 같은 문제점을 찾아내고 해결하기 위해선 일정 수준 하드웨어에 대한 이해를 필요로 합니다. 메모리를 포함한 개별적인 하드웨어 장치들은 각각 고유의 동작 특성이 있고, 그것에 대한 이해를 말합니다. 하드웨어에 대한 이해도를 높이기 위해 쉽게 할 수 있는 첫번째 실천 내용은 어셈블리어에 대한 학습입니다. 어셈블리 언어를 통해서 하드웨어를 간접적으로 체험하는 것이 소프트웨어 엔지니어가 하드웨어에 대한 이해를 할 수 있는 시작점임을 다시 한 번 말씀드리고 싶습니다.
파이프라인 프로세서가 파이프라인을 지원하지 않는 프로세서보다 더 효율이 좋습니다. 파이프라인 기술을 사용하지 않는 ARM 프로세서를 상상하기 어려운데요. CORTEX-M 프로세서의 파이프라인 동작 원리와 그 의미에 대해서 공부합니다
인라인 어셈블리라고 하는 것은 어떤 것일까요. 간단하게 말씀드리면 어셈블리 코드를 C 함수의 형태를 빌어서 작성하는 것을 의미합니다. 인라인 어셈블리의 외관적인 형태는 C 언어의 함수 모습을 가지고 있으나, 실제 내용은 어셈블리 명령어이죠. 어셈블리 명령어는 C 함수 내 로컬 변수들과 또한 긴밀히 연동됩니다. C 언어로 대체할 수 없는 MSR, MRS 명령어의 경우 인라인 어셈블리어로 구현하여 사용하게 되면 그때 인라인 어셈블리어의 사용 가치는 빛을 발합니다.
STM32CubeIDE 컴파일러는 많은 소스들을 자동으로 생성해내게 되며, 컴파일 하기 위해 필요한 메이크 파일을 비롯한 다양한 파일들을 자동화 프로세스에 의해 만들어주게 됩니다. 링커 스크립트라고 하는 파일도 또한 자동 생성되는 파일 중에 하나로써 링커는 항상 이 파일을 참조해서 사용자가 원하는 최종적인 실행 파일을 만들어주게 됩니다. 링커의 역할과 링커 스크립트 문법에 대해서 알아봅니다.
ARM7, ARM9, ARM11 프로세서의 경우와 달리 CORTEX-M 프로세서에서는 인터럽트 컨트롤러 장치인 NVIC를 CORTEX-M 프로세서의 내부에 포함시킴으로 해서 좀 더 밀접하게 연결성을 갖도록 설계되어 있습니다. NVIC의 동작 원리를 이해하는 것은 임베디드 시스템에서 중요한 역할을 담당하는 인터럽트를 이해하는 시작점이기도 합니다.
하드웨어 인터럽트를 포함한 익셉션이 발생했을 때 익셉션 핸들러가 실행되기까지의 과정. 익셉션 핸들러 코드의 실행 이후 익셉션이 발생되기 직전의 프로그램 코드로 복원되기까지의 전 과정을 설명합니다.
STM32 CORTEX 프로세서 내부에서 CORTEX-M 코어를 비롯한 AHB, APB 인터페이스 되는 다양한 하드웨어 장치들에 클럭을 공급하는 장치인 클럭 시스템의 동작 원리를 학습하고, 실습 과정을 통해서 직접 시스템 클럭 주파수를 바꾸어 봄으로써 클럭제어에 대한 자신감을 강화합니다.
CORTEX-M 프로세서에서는 익셉션 처리 속도의 효율을 기하기 위하여 이른바 '테일 체이닝' 기술을 지원합니다. 이 기술이 인터럽트 응답성 개선에 얼마만큼의 기여를 하는지 동작 원리를 배우고 실습해봅니다. 또한 인터럽트 중첩도 함께 살펴봅니다.
어떤 소프트웨어의 부트 코드를 이해하려는 노력은 임베디드 시스템 소프트웨어의 전체적인 구조를 이해하는 데도 큰 도움이 되기 마련입니다. 부트 코드를 실제로 단순히 사용만 하는 것보다는 부트 코드에 담겨져 있는 의미를 해석해봄으로써 우리가 좀 더 발전적인 소프트웨어의 방향을 이끌어낼 수 있습니다. 물론 이는 부트로더나 RTOS 포팅과 같은 작업을 위한 필수 선행 지식의 중요성도 갖습니다.
여러분의 시간을 내 시간처럼 소중히 생각하며 강의를 만들었습니다.
14년동안 총 수강자 수 1000명 이상을 대상으로 ARM 프로세서 현장 강의를 해오면서 쌓은 경험으로, 더 많은 학습자들과 만남을 갖기 위해서 이렇게 온라인에서도 강의를 만들게 되었습니다. 현장 강의 기준 5일 분량의 내용을 15시간 내로 최적화한 온라인 강의로 여러분을 찾아갑니다.
임베디드 시스템
입문자
이미 CORTEX-M을
사용하고 있지만
체계적인 정리를
필요로 하는 분
임베디드 소프트웨어에
대한 이해도를 높이려는
하드웨어 개발자
성공적인 RTOS 포팅 및
운용을 위한
마이컴 지식을
필요로 하는 분
📢 선수 지식을 확인해주세요!
강의에서 사용된 400여 개의 슬라이드로 구성된 교재(pdf)가 함께 제공됩니다.
주요 이력
기타
Q. C언어를 모르는 사람이 수강해도 좋을까요?
C언어를 모르시면 수업 중 실습과 관계된 부분에 대해서는 이해하기 어려우실 수도 있습니다.
Q. 중급자도 이 강의를 수강해도 좋을까요?
임베디드 시스템 개발에 입문하시려는 분들은 물론, 이미 CORTEX-M 을 사용하고 계시는 중급자 분들까지도 커버할 수 있도록 강의를 기획했습니다. 14년간 삼성전자, SK하이닉스, 한컴아카데미, 한국전파진흥원, KEA, 모토롤라반도체, 폴리텍(인천) 등에서 ARM 프로세서 강의를 한 경험으로 나름대로 ARM 프로세서 내장 프로그래밍에서 특히 까다로운 부분, 중요한 주제들을 심도있게 다루고 있습니다.
Q. 실습을 위한 STM32 보드 종류가 다양한데, 아무거나 상관없나요?
영상에선 현재 STM32F429I-DISC1 보드 기준으로 수업을 진행합니다.
추가적으로 NUCLEO-F103RB, NUCLEO-F401RE 보드도 지원합니다. 이외 보드 추가 지원 계획 없습니다. 이 교육을 위해 보드를 새로 구매하실 분은 STM32F429I-DISC1 보드를 강력히 추천합니다.
📢 수강 전 확인해주세요! (라이센스)
학습 대상은
누구일까요?
임베디드 시스템 입문자
임베디드 시스템의 최적화를 고민하고 계신 분
이미 CORTEX-M 을 사용하고 있지만 체계적인 정리를 필요로 하는 분
임베디드 소프트웨어에 대한 이해도를 높이려는 하드웨어 개발자
성공적인 RTOS 포팅 및 운용을 위한 마이컴 지식을 필요로 하는 분
ARM 어셈블리 언어를 학습하려는 분
인라인 어셈블리, 링커스크립트, 부트코드 학습을 필요로 하는 분
임베디드 시스템 소프트웨어의 전문적인 디버깅 기법을 필요로 하는 분
선수 지식,
필요할까요?
C 언어
인하대학교 공과대학에서 전자공학 학사 학위를 받았으며 임베디드 시스템용 소프트웨어 개발자로써 수년간의 경력을 쌓았습니다. 임베디드 시스템 및 프로그래밍을 위한 전문 강사로도 활동 중입니다. 아이폰 3GS 등장과 같은 시기에 맥(북)에 입문하였고, 그때부터 맥(북) 자동화에 관심을 갖게 되었습니다. '맥(북)에서 사용할 수 있는 시리 리모트', '키보드마에스트로를 이용한 구글번역기' 같은 오픈 소스를 깃허브(https://github.com/guileschool) 에 두고 개발 및 유지보수하고 있습니다. 오픈 소스 하드웨어 '비글본블랙' 에도 많은 관심을 가지고 있습니다. 맥(북) 자동화를 이용하여 생산성을 높일 수 있는 컴퓨터를 사용하는 모든 분야에 관심을 가지고 있고, 이를 필요로 하는 사람들을 돕고 있습니다.
강의 요청 및 기타 문의사항은 guileschool@gmail.com으로 보내주세요 :)
전체
111개 ∙ (15시간 10분)
가 제공되는 강의입니다.
s202_LED 점멸해보기
05:09
s205_THUMB2 명령어
09:00
s207_핸들러모드와 쓰레드모드
11:21
s208_프로그램 카운터 레지스터
06:43
s209_파이프라인과 플래시 메모리
08:40
s210_LR 레지스터와 함수호출
28:57
s211_AAPCS
14:29
s212_데이터 타입과 ADD 명령어
04:14
s213_레지스터 기본 구조
06:39
s214_xPSR 레지스터
27:54
s215_특수 레지스터
26:43
s216_빅엔디언과 리틀엔디언
03:14
s301_CORTEX-M 명령어
06:27
s302_비교와 분기 명령어
11:51
s303_CONDITION CODE
14:27
s304_IT 명령어
10:03
s305_쉬프터와 비트 연산 명령어
14:21
s306_루프문 만들기
06:58
s307_다양한 로드 스토어 명령어
15:20
s312_블럭 전송 명령어
03:47
s314_하드웨어를 이해한다는 것
05:42
s315_CBZ 명령어와 루프문
03:40
s316_유용한 BYTE 스왑 명령어
03:52
s317_REV 명령어
05:09
s318_CLZ 명령어
04:01
s320_로컬레이블과 전역레이블
03:13
s321_데이터 프로세싱 명령어
05:03
s322_ADR 과 레이블
01:26
s323_비트 연산 명령어
05:52
s324_비교 명령어
09:27
s325_BRANCH 명령어
04:19
s326_쉬프트 명령어
06:31
s327_곱셈 명령어
02:53
s328_포화 연산 명령어
11:49
s329_PACK, UNPACK
01:35
s330_나눗셈 명령어
03:57
s331_병렬 연산 명령어
02:49
s333_특수 명령어
05:40
s334_LDR, STR 명령어
16:25
s335_LDR 명령어의 주소 해석법
06:12
s336_비정렬 액세스의 득과 실
13:25
s337_인라인 어셈블러
21:49