임베디드 교육 18

[28일차] ARM 프로세서 이해 및 활용(ARM 프로세서의 명령어)

◎ 32비트 ARM 명령어 ▷ 모든 ARM 명령은 32비트로 구성되어 있다. - Load/Store와 같은 메모리 참조 명령이나 Branch 명령에서는 모두 상대주소(Indirect Address)방식을 사용한다. - Immediate 상수는 32비트 명령어 내에 표시된다. (32비트 내에 상수 + 기타 상태 명령 등) ▷ 모든 ARM 명령어는 조건부 실행이 가능하다. ▷ Load/Store Architecture를 사용한다. ◎ 16비트 Thumb 명령어 (16비트 데이터라인이 추세이던 시절 32비트 ARM이 호환하기 위해 만든 명령어) ▷ 32비트의 ARM 명령을 16비트로 재구성한 명령 ▷ 조건부 실행 불가능, 상수값의 표현 범위가 적다. ◎ Java 명령 - 유닉스 위에 윈도우 위에 자바VM 을 ..

[27일차] ARM 프로세서 이해 및 활용 (Program Status Register (PSR), Exception)

개념을 이해하기 위해 찾아보다가 정리가 굉장히 잘 되있는 사이트를 발견했다. 찬찬히 읽어보며 이해해봐야지 JK전자와 함께하는 ARM 완전정복 ● Program Status Register (PSR) ▷ ARM의 PSR - 1개의 CPSR(Current Program Status Register) - 5개의 SPSR(Saved Program Status Register) ● PSR 레지스터의 정보 ▷ Condition code flag - ALU의 연산 결과 정보를 가지는 flag 정보를 가지고 있다. -> ALU를 통한 명령의 실행 결과를 나타내는 부분이다. 1) N 비트(Negative flag) - ALU 연산 결과가 마이너스가 발생한 경우(연산결과 맨 꼭대기 비트가 1이 될 경우) set 2) Z ..

[26일차] ARM 프로세서 이해 및 활용 (임베디드 시스템의 구조, ARM Architecture 전반적인 구조)

1. 임베디드 시스템의 구조 프로세서의 구조 1) 레지스터(Register) : ○ 프로세서 내부에서 데이터를 일시적으로 보관하는 기억장치. - Flip-flop와 Latch로 구성되어 있다. ○ 범용 레지스터. (Ground Port Register) - 프로그램 또는 데이터 처리에 필요한 작업을 수행하기 위해 사용. ○ 제어용 레지스터. (control) - 프로그램이나 프로세서를 제어. 프로그램 카운터(PC) 등 ○ 상태 레지스터. (Program Status Register) - 프로세서의 상태를 나타낸다. 2) 산술 논리 연산장치(ALU) - 산술 연산 수행(덧셈 뺄셈 등) - 논리 연산 수행(AND, OR 등) - 상태 레지스터 또는 Flag 레지스터에 연산 결과 기록 - carry 발생, o..

[17일차] 임베디드 C 프로그래밍 2

T32marm 시뮬레이터 기본 사용법 연산자, LED 점등 실습 C언어 고급편 (배열, 포인터) 1. 연산자의 우선순위 2. 비트연산자 : |, &, ^, ~ | : OR연산. 둘 다 0일 때만 0 & : AND연산. 둘다 1일 때만 1 ~ : NOT연산. 단항 연산자. 1개의 데이터의 각 비트를 반전 0->1 // 1->0 ^ : XOR연산. 같으면 0, 다르면 1 > : 쉬프트 연산. 왼쪽, 오른쪽으로 비트를 shift 시킨다. 2의 n승 계산을 할 수 있다. 밀려난 빈자리는 0으로 채워지나, signed 타입에서는 부호 비트가 유지된다. 그 외 : 간접 참조 연산자(*), 레퍼런스 연산자(&), 배열 참조 연산자([]) 등이 있다. - 구조체 직접 참조 연산자 : "." 구조체의 멤버를 직접 참조...

[16일차] 임베디드 C 프로그래밍 1

이번 주부터 임베디드 C 프로그래밍을 배우기 시작하면서 임베디드 시스템 개요, C언어 기본, C언어 심화 이렇게 진도를 나가게 된다. 오늘은 임베디드 시스템 개요부터 C언어 기본까지 배우게 되었다. 앞에서 많이 다루었던 내용이고 특히 C언어교육은 중복되는 내용이 많았기에 그렇게 어렵지 않았고, 때문에 진도 또한 빠르게 나갔다. 1. MCU : CPU(Processor)와 각종 Peripheral Controller(주변장치 컨트롤러)들의 결합 2. CPU core : ALU(산술/논리 연산장치) + CU + Register 만으로 구성된 CPU의 핵심 - CU : 기계어를 분석하고 실행하기 위해 제어 신호를 순차적으로 발생시킴. - Register : 연산이나 기타 목적으로 사용될 저장공간. 코어에 집적..

[13일차] 임베디드 프로그래밍(인터럽트)

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) 시스템 콜 처리 시 - 전원 시작 시 기본 모드 Abo..

[12일차] 임베디드 시스템 아키텍쳐-개발환경, 아키텍쳐

1. FLASH 메모리 : NORF와 NANDF 의 차이 - NANDF : 대용량 가능하나 베드섹터가 존재한다. -> 기존의 A.D.C BUS와 구조가 다른 BUS를 사용한다. (관련 기업 : 도시바, 삼성전자) - NORF : 고용량은 어렵지만 안정적이다. (관련기업 : 인텔) 2. 실습 보드 구조 3. RAM에서의 실행하기 - 대개 ROM보다 RAM에서의 실행이 더 빠르다. 1) memory controller를 성정하여 RAM 초기화. 2) ROM에 저장된 프로그램을 RAM에 복사한다. 3) PC(Program Counter)를 위치시켜 RAM 의 코드를 실행한다. 4) 프로그램을 압축해서 ROM에 저장하기도 한다. ROM에 저장된 .Text 를 RAM에 복사하는 코드가 필요하다. (*.ld (Li..

[11일차] 임베디드 시스템의 이해

저번 주 부로 C언어 강의를 마친 뒤, 이번 주부터 임베디드 시스템에 관해 배우기 시작했다. 강의 내용을 거의 날것 그대로 기록하였는데, 앞으로는 수업을 들으면서 새롭게 알게 된 사실이나, 중요하다 생각되는 내용 위주로 기록해야겠다. 오늘은 전반적으로 새로운 책과 함께 개념적인 부분을 공부하였다. 오후에는 실습키트를 시리얼로 PC와 연결해보았다. cygwin을 설치하여 리눅스 환경에서 소스파일을 작성해보고 컴파일도 해보았다. 그리고 ROM에 저장된 파일이 어떻게 RAM으로 이동되어 MCU에서 구동되는지 직접 메모리의 주소를 찾아가며 낱낱이 알아보았다. 컴파일의 과정에 대해 더 자세히 알 수 있었다. 임베디드 시스템의 이해 1. 임베디드 시스템의 정의 - 특정 역할을 하는 컴퓨터 시스템 - 임베디드 시스템..

[10일차] C언어 교육-(파일 개방과 입출력 함수)

1. 파일 개방과 입출력을 하기 위해선 파일 포인터가 필요하다. FILE = *fp 2. ex) fopen("a.txt", "r"); //읽기 전용으로 개방 3. 함수 원형 FILE *fopen(const char *, const char *); => 반환형 함수명 매개변수 4. 절대 경로 : "..\\source\\b.txt" 상대 경로 : "data\\a.txt" 5. 파일이 존재할 때 파일이 없을 때 r 읽기 위해 개방 NULL 반환 w 지우고 쓰기 위해 개방 새로운 파일 생성 a 파일 끝에 추가하기 위해 개방 새로운 파일 생성 (*append : 덧붙이다) - Stream File 장점 : 1) 입출력 효율 증가. 장치로부터 독립성 증가. => 스트림파일이 없으면 외부 입출력 장치가 바뀔 때마다 ..

[9일차] C언어 교육-(함수 포인터, 동적 할당 메모리, 구조체 등)

1. 함수 포인터 배열 사용 예시 - 포인터 배열을 형 변환하여 함수 포인터로 만들었다. (*괄호 연산자 위치 중요!) #include int sum(int a, int b); int sub(int a, int b); int mul(int a, int b); int main() { int res; void* sub1 = sub; void* mul1 = mul; //void 포인터 void* vpa[3] = {sum, sub, mul1}; //void 포인터 배열 초기화 res = ((int (*)(int, int))vpa[1])(1, 2); printf("result is %d", res); return 0; } int sum(int a, int b){ return a+b; } int sub(int a,..