-
20140409 (CPU, Microcontroller, RAM, ROM, RISC, CISC, 구조체, #pragma pack)부산IT학원/스마트컨트롤러 2014. 4. 9. 17:34
38일차
------------
상 식
------------
----------------------------
--- CPU, Microcontroller
- CPU는 위의 그림과 같이 core만 있고
RAM, ROM, I/O... 다른 것들은 외부에 있는 개인컴퓨터의 것과 같은 것.
- Microcontroller는 칩에 core, SDRAM, EEPRAM,... 등등 다른 것들이 함께 들어 있는 것.
----------------------------
- RAM, ROM 등등 메모리
- RAM (Ramdom Access Memory)
읽기 쓰기가 언제나 가능하다.
휘발성 ( 전기가 끊기면 내용이 다 날아감 )
- ROM (Read Only Memory)
읽기만 가능
비휘발성 ( 전기가 끊겨도 내용이 저장되어 있다 )
- EEPROM (Electrically Erasable Programmable ROM)
읽기 쓰기 가능
비휘발성
RAM보다 비싸다
- Flash Memory
읽기 쓰기 가능
비휘발성
RAM, ROM보다 느리다
RAM보다 가격이 비싸, EEPROM보다 싸다
- SRAM (Static RAM)
전기가 가해지면 안에 내용을 유지해서 정적이라고 함.
주로 캐시메모리
DRAM에 비해 비싸다
- DRAM (Dynamic RAM)
전기가 가해져도 일정시간이 지나면 내용이 바뀌므로
주기적으로 전기를 다시 공급해 줘야한다. Reflesh 그래서 동적이라고 함.
주로 주기억장치
SRAM에 비해 싸다
- SDRAM
DRAM 업그레이드 판.
-----------------
--- RISC, CISC
구조, 명령어 주 사용 비유?
RISC 단순 서버, 슈퍼컴퓨터 물 끓이고, 스프넣고, 라면 넣고...
CISC 복잡 PC 라면 끓여 끝.
명령세트의 종류로 CPU에 기계어 코드이다
CISC 가 먼저 세상에 나왔는데 명령어가 엄청나게 많았다.
하지만 그 중에 실제로 자주 쓰이는 것은 10%미만에 불과하다는 것을 알아내고
자주 쓰는 것을 모아서 만든 것이 RISC 방식이라고 한다
현재에는 둘 다 서로의 장점을 수용하게 되서 경계가 무너지고 있다고들 한다...
------------------
--- WinAVR
AVR에 넣는 프로그램짜는 컴파일러
폴더 내에 main.c와 makefile이 함께 있어야 한다.
- make
컴파일 명령어
- make clean
컴파일한 파일 다 지우기
- main.hex
실행 파일
C 언어
---------------
구 조 체
---------------
- 구조체 사이즈 출력
ex)
#include <stdio.h>
struct smart
{
int a;
};
int main()
{
printf("%d \n", sizeof(struct smart));
return 0;
}- struct smart 이것 자체가 자료형이다.
여기서 알 수 없는 것이 있었다....
ex)
#include <stdio.h>
struct smart
{
int a; // 4 4
int b; // 8 8
};
int main()
{
printf("%d \n", sizeof(struct smart) );
return 0;
}출력 화면
문제가 없다.
아래를 더 보자
#include <stdio.h>
struct smart
{
int a; // 4 4
int b; // 8 8
char c; // 9 12
};
int main()
{
printf("%d \n", sizeof(struct smart) );
return 0;
}출력 화면
??? 9가 나와야 하는데 12가 나왔다.
변수 // 예상크기 결과크기
#include <stdio.h>
struct smart
{
int a; // 4 4
int b; // 8 8
char c; // 9 12
char d; // 10 12
char e; // 11 12
short f; // 13 16
char g; // 14 16
int h; // 18 20
char i; // 19 24
short j; // 21 24
char k; // 22 28
};
int main()
{
printf("%d \n", sizeof(struct smart) );
return 0;
}왜 그러냐면 컴파일러는 4byte or 2byte로 잡는게 편하기 때문에? 컴파일 편한대로? 메모리를 잡기 때문에 저런 현상이 나타난다고 한다.
아래 그림을 통해 메모리 구조를 보자.
①번은 위에서 선언한 변수 순서 그대로 했을 경우 메모리가 잡히고 빈칸은 버리는 공간이 되어버렸다. 그래서 6byte 낭비.
②번은 변수 선언을 메모리가 잡히는 구조를 생각해서 A, B, F, J, C, D, E, G, H, I, K 순으로 선언 했을 경우 2번과 같이 메모리가 잡힌다. 2byte낭비.
③번은 메모리 위에 #pragma pack(1) 이라는 것이 있는데, 구조체 선언 위에 선언할 경우 컴파일러가 메모리를 잡을 때 1byte단위씩 잡게된다. 딱 맞다.
④번은 구조체 선언 위에 #pragma pack(1), 구조체 선언 밑에 #pragma pack(4) 를 선언한 경우이다. 딱 맞다.
장단점 비교
①번이 제일 쓰레기 코드다. 대신 프로그래머가 편하다.
②번은 ①번에 비해 메모리를 4byte를 확보. 프로그래머가 신경을 좀 써야된다.
③번은 ①번에 비해 메모리를 6byte나 확보했지만, 속도가 느리다. 편하다.
④번은 ①번에 비해 메모리 6byte 확보, 속도도 확보 가장 좋은 코드. 프로그래머가 신경 좀 써야된다.
- #pragma pack( )
위에서 한 번 언급 했듯이 컴파일시 메모리 단위를 바꾼다.
ex)
#include <stdio.h>
#pragma pack(1)struct smart
{
int a; // 4 4
int b; // 8 8
char c; // 9 12
char d; // 10 12
char e; // 11 12
short f; // 13 16
char g; // 14 16
int h; // 18 20
char i; // 19 24
short j; // 21 24
char k; // 22 28
};#pragma pack(4)
struct smart1
{
int a;
int b;
char c;
char d;
char e;
short f;
char g;
int h;
char i;
short j;
char k; // 28
};int main()
{
printf("smart : %d \n", sizeof(struct smart) );
printf("smart1: %d \n", sizeof(struct smart1) );
return 0;
}출력 화면
- 메모리에 진짜로 위와 같이 저장되는지 변수들의 주소값 확인
1번의 경우로 확인.
ex)
#include <stdio.h>
struct smart
{
int a; // 4 4
int b; // 8 8
char c; // 9 12
char d; // 10 12
char e; // 11 12
short f; // 13 16
char g; // 14 16
int h; // 18 20
char i; // 19 24
short j; // 21 24
char k; // 22 28
};int main()
{
struct smart ass;printf("int a\t: 0x%08X \n", &ass.a);
printf("int b\t: 0x%08X \n", &ass.b);
printf("char c\t: 0x%08X \n", &ass.c);
printf("char d\t: 0x%08X \n", &ass.d);
printf("char e\t: 0x%08X \n", &ass.e);
printf("short f\t: 0x%08X \n", &ass.f);
printf("char g\t: 0x%08X \n", &ass.g);
printf("int h\t: 0x%08X \n", &ass.h);
printf("char i\t: 0x%08X \n", &ass.i);
printf("short j\t: 0x%08X \n", &ass.j);
printf("char k\t: 0x%08X \n", &ass.k);return 0;
}출력 화면
메모리 구조와 비교
- e 다음에 f 가 한칸 37비우고 38부터 시작하는 것을 볼 수 있다.
j 도 i 다음에 41부터 시작이 아니라 42부터 시작하는 것을 볼 수 있다.
'부산IT학원 > 스마트컨트롤러' 카테고리의 다른 글
20140411 (용어, Register Summary, volatile, 구조체 복사, 공용체) (0) 2014.04.11 20140410 (프로그램 실행 구조, AvrStudio4 실행, 구조체 포인터, typedef struct) (0) 2014.04.10 20140408 (회로도 최적화, 4bit 덧셈, 구조체) (0) 2014.04.08 20140407 (반가산기 XOR없이, 회로도 최적화 공식, typedef, strlen, strcpy, strcat) (0) 2014.04.07 20140404 (Adder, NOT, NAND, puts, fputs, gets, fgets, fflush) (0) 2014.04.04