1. ARM (Advanced RISC Machine) :
1) RISC(Reduced Instruction Set Computer) : CPU 명령어의 개수를 줄여 하드웨어 구조를 좀 더 간단하게 만드는 방식으로, 마이크로프로세서를 설계하는 방법 가운데 하나이다.
2) 개방된 버스 구조
- V.7 부터 Cortex A, R, M시리즈로 나뉨, 그전까진 ARM7, 9, 11
2. 6가지 Operation(동작)모드가 있다.
모드 |
사용 |
|
User |
보통 때 사용 (r15는 PC) |
Non-Previledge (특권 X) |
FIQ |
빠른 인터럽트 처리 시 |
특권 모드 - 하드웨어 건들 수 있다. |
IRQ |
보통 인터럽트 처리 시 |
|
SVC(super visor call) |
시스템 콜 처리 시 - 전원 시작 시 기본 모드 |
|
Abort |
메모리 폴트(fault) 처리 시 |
|
Undef |
정의되지 않은 명령어 발생 시 |
- r13(SP) : 모든 모드에 존재. (Stack Pointer (Stack register))
- r14(LP) : 모든 모드에 존재. (함수를 부를 때 돌아올 위치를 여기에 표시한다.)
- r15(PC) : user모드. Program Counter : 가져올 Instruction의 주소(위치) 표시
- FIQ(Fast 인터럽트)는 Real Time을 고려하여 만들었기 때문에 IRQ에 비해 r8~r12의 레지스터 존재.
3. cpsr(Current Program Status Register) : 현재 Mode가 무엇인지 가리키는 역할. (bit 값이 0x10이면 USR, 0x11이면 FIQ, 0x12이면 IRQ, 0x13이라면 svc 모드 이런 식)
4. spsr(Stored Program Status Register) : Mode가 바뀔 때 이전 모드를 기억하는 temp와 같은 역할
- mode마다 register set을 가지고 있어, 각각의 mode들을 적당하게 사용만 한다면 mode 전환 시에 빠르게 전환이 가능하게 됩니다. 예를 들어, User mode에서 interrupt가 걸려 IRQ mode로 전환이 된다면, User mode에서 쓰던 register들을 모두 저장할 필요가 없고 IRQ mode로 전환된다.
5. 조건부 실행
- 모든 ARM 어셈블리 명령어는 조건부 실행(Conditional Execution)이 가능하다. -> thumb mode 보다 arm mode에서 어셈블리어가 훨씬 간단하다.
6. C 프로그래밍 4가지 저장소 클래스
1) auto
- 디폴트 저장소 클래스
- 스택에 저장소를 잡는다.
- 블록에 들어갈 때 스택에 할당하고, 나갈 때 스택에서 해제한다.
2) register
- 메모리가 아닌, 프로세서 레지스터를 우선적으로 할당한다. (로컬 변수를 스택이 아닌 레지스터에 잡아준다.)
- 메모리를 접근하지 않으므로, 참조 속도가 매우 빠르다.
- 남용하면 컴파일러의 최적화 기능을 저해할 가능성이 있다. (컴파일러가 할당 여부를 결정한다.)
3) static
- 지역변수에 사용 : 전역 변수와 유사하게 변수에 대한 영구적인 저장공간을 할당한다.
- static 지역변수는 프로그램이 시작할 때 한 번만 초기화된다.
4) Volatile
- 해당 변수에 대해 컴파일러의 최적화를 막는다. (작성한 것 그대로 실행함.)
- 메모리에 매핑된 하드웨어 레지스터를 접근할 때 사용한다.
7. 메모리 구성
8. 임베디드 시스템에서의 최적화
- 코드 속도 높이기
- 코드 크기 줄이기
- 데이터 크기 줄이기
- 사용하는 메모리의 사용량을 최소화하면서 최대한 성능을 끌어내기 위함.
9. 코드 효율 높이기
- 컴파일러에 의한 자동 최적화:
실행 속도와 코드 크기의 반비례 관계. 실행속도 높이면 코드 크기 늘어나고, 코드크기 줄이면 실행속도 떨어짐.
- 직접 최적화:
인터럽트 서비스 루틴, 자주 실행되는 함수. 우선순위가 높은 작업의 코드
- 최신의 컴파일러들은 최적화 작업에 뛰어나다.
10. 코드 효율 높이기 - 인라인 함수
: 컴파일러가 해당 함수를 호출하는 부분에 함수의 내용을 직접 삽입시킨다.
- 원래는 함수의 정의로 PC가 점프해서 파이프라인이 깨진다. -> 파이프라인이 안 깨져 속도가 빨라지지만, 함수를 코드 안에 삽입하기 때문에 크기 또한 증가한다. 따라서 함수의 내용이 많지 않은 경우 효율적.
- 왼쪽이 일반 함수 호출, 오른쪽이 inline키워드로 함수 정의
11. 코드 효율 높이기 - 테이블 룩업 방식
: 계산을 하지 않고 테이블을 만들어 참조하도록 하는 방식. 연산량을 줄여 빨라진다.
ex) sin 1 부터 sin 90 까지 미리 다 계산해 둔 뒤 표로 만들어 버리면 나중에 sin 1 값이 필요하면 단순히 표에서 1 번째 값을 찾으면 되니까 아주 편하다.
12. 코드 크기 줄이기
1) 덩치가 큰 표준 라이브러리 루틴 대신, 특정 경우에 맞는 루틴을 직접 작성해서 사용한다.
2) 워드 사이즈의 데이터를 주로 사용한다. (int 형)
13. 메모리(RAM) 사용량 줄이기
1) 스택의 사용량 줄이기 - 재귀 호출의 사용을 주이나. (함수 프레임이 계속 쌓여 스택 오버 프로우가 날 수 있다.)
2) 로컬 변수로 배열을 크게 잡지 않는다.
3) 전역 변수를 const로 선언하면 RAM 이 아닌 ROM에 들어간다.
- 임베디드 시스템 및 ARM 프로세서의 이해 - 인터럽트, DMA, uart
1. ARM에서 인터럽트가 처리되는 과정.

1) 디바이스에서 인터럽트를 요구.
2) 인터럽트 컨트롤러에 의한 선정 및 IRQ 요청
3) IRQ Exception 발생 ( user mode -> IRQ mode로 변경된다.)
4) IRQ 모드 변경 및 IRQ Exception Vector로 분기
5) IRQ Handler로 분기
6) Prologue
7) Get Interrupt Number
8) Get ISR address
9) Call ISR
10) Epilogue
11) Return From exception
2. 인터럽트 익셉션이 발생하면 해당 익셉션 벡터로 분기.
3. 인터럽트 벡터 테이블(IRQ Exception Vector) : 여러 가지 인터럽트에 대해 해당 인터럽트 발생 시 처리해야 할 루틴의 주소를 보관하고 있는 테이블
4. 인터럽트 서비스 루틴 : IRQ Handler라고도 하며 실제 인터럽트를 처리하는 루틴으로 실행 중이던 레지스터와 PC를 저장하여 실행 중이던 CPU의 상태를 보존하고 인터럽트 처리가 끝나면 원래 상태로 복귀한다.
5. 폴링 vs 인터럽트
- 폴링
장점 : 사용하기 편하다. 인터럽트보다 처리 속도가 빠르다.
단점 : 폴링 루프 이외의 코드 실행이 어렵다. 작업에 대한 우선순위를 적용할 수 없다.
- 인터럽트
장점 : 1) 각각의 인터럽트에 대해 우선순위를 적용할 수 있다.
2) 인터럽트 처리 이외의 코드를 병행해서 실행할 수 있다.
3) 처리해야 하는 장치가 많아질 수 록 폴링에 비해 효과가 좋다.
단점 : 1) 폴링보다 사용하기 어렵다.
2) 프로세서에서 하드웨어적으로 인터럽트를 지원해야 한다.
6. 인터럽트 컨트롤러(Interrupt Controller) :
1) 다양한 소스로부터 들어오는 인터럽트에 대한 처리를 담당한다.
2) 인터럽트 소스 별로 발생 여부를 기록
3) 인터럽트 소스 별로 인터럽트 마스크(인터럽트 요구받을지 무시할지 선택) 여부 설정.
4) 인터럽트 간 우선순위 설정.
7. ISR(Interrupt Service Register)
현재 인터럽트 핸들러가 실행 중인 인터럽트의 정보를 나타냅니다. PIC 컨트롤러는 특별한 옵션을 사용하지 않는 한 IRQ 0에 가까울수록 우선순위를 높게 설정하므로 ISR 레지스터에 설정된 비트는 IRR 레지스터에 설정된 비트 중에서 비트 0에 가까운 비트와 같습니다.
## 인터럽트에 대한 더 자세한 정보 : https://kosaf04pyh.tistory.com/197 참고하기. 특히 인터럽트 처리과정 부분!!!
8. DMA(Direct Memory Access)
- 주변 장치와 메인 메모리 사이에 데이터를 직접 전송할 수 있는 기능.
=> 원래는 PIO(Programmed Input/Output) 로서 모든 데이터 전송이 마이크로프로세서를 거친다. 구현 간단, 성능은 떨어짐
- 주변장치에서 메인 메모리, 메인 메모리에서 주변 장치로.
=> 마이크로프로세서는 데이터 전송에 관여하지 않는다.
시스템의 성능을 향상시킬 수 있다.
@ 버스 공유 문제 : 마이크로프로세서와 DMA 컨트롤러가 하나의 버스를 공유한다. -> 한 순간에 마이크로프로세서와 DMA 컨트롤러 중 하나만 메모리 버스를 사용해야 한다.
- 대량의 데이터 처리 : DMA // 소량의 데이터 처리 : PIO - 버스 경쟁할 필요 없어서.
9. DMA 컨트롤러 : DMA에 대한 처리를 전담하는 별도의 컨트롤러
10. UART(Universal Asynchronous Receiver/Transmitter)
- 동기 방식 : 주고받는 거 동시에 함 (CLK에 맞춰)
- 비 동기 방식 : TX와 RX의 세팅이 일치해야 한다. (CLK은 안 맞아도..) 보 레이트는 맞춰..
- RS-232C : 비교적 느린 속도의 직렬 데이터 통신을 하기 위한 물리적 연결과 프로토콜에 대해 기술한 표준.(uart는 이것의 일부분. )
- 보 레이트 : 매 초당 신호 변화의 개수를 표시하는 신호 속도의 단위.(bps)(전자적인 상태의 변화가 1초에 1번 일어나는 것을 의미한다.)
11. UART와 GPIO에 대한 전반적인 개념을 나감.
* 개인적인 학습 목적으로 작성한 글이기에 내용에 잘못된 정보가 있을 수 있습니다.
'임베디드 개발(before) > IoT 임베디드 SW 개발자 양성과정' 카테고리의 다른 글
[15일차] 취업 강의2 (0) | 2020.07.31 |
---|---|
[14일차] 취업 강의 (0) | 2020.07.30 |
[12일차] 임베디드 시스템 아키텍쳐-개발환경, 아키텍쳐 (0) | 2020.07.28 |
[11일차] 임베디드 시스템의 이해 (0) | 2020.07.27 |
[10일차] C언어 교육-(파일 개방과 입출력 함수) (0) | 2020.07.24 |