본문 바로가기
코스웨어/14년 스마트컨트롤러

2014년 04월 09일 업무일지 김대희 [출석번호 3번]

by 알 수 없는 사용자 2014. 4. 9.
728x90
반응형

ATMEL사의 ATMEGA



메모리 제조회사 ATMEL

CPU를 만들게되는데

ARM사에서 설계도를 사와서

AVR시리즈

AT91시리즈

등을 만든다


AVR시리즈중에 ' MAGA '라는 놈이 있는데


제조회사 이름을 따서 ATMega128

ATMega128A

ATMega128L 로 나뉜다.


'A'는 5v 전력으로 작동되고

'L'은 3.3v 전력으로 작동된다

현재 128은 단종되었고, 요새는 ATMega2560을 쓴다


이는 8bit CPU로써 8개의 BUS를 필요로 한다.

하지만, 설계를 조작하면 16개의 BUS까지 사용가능.





ATMAEL 홈페이지 이동







  • ATMEGA128A 의 Data sheet 








메모리의 종류는 크게

RAM(Random Access Memory) ROM(Read Only Memory)이 있다.


ROM은 전력공급을 중단해도 자료가 손실되지 않는다.

RAM은 반대로 전력이 끊기면 자료가 손실된다.


요즘은 RAM과 ROM의 기능을 함께 가지는 장치를

개발중에도 있음

'EEP(Electronic Eraser Program)ROM' 이란게 있는데 너무 비쌈

이를 절충해서 나온게 플래시(Flash)







RAM에도 SRAM(Static RAM), DRAM(Dynamic RAM)이 있다.


SRAM(static RAM) 

DRAM(Dynamic RAM) 


전원이 공급되는 동안은 내용이 유지됨

소비전력이 크다

DRAM보다 비싸고 구조가 복잡하다

주로 CPU의 캐시메모리로 사용된다.

 

전원이 공급되는 중에도 일정시간이 지나면 데이터휘발

Refresh(충전)이 필요함

SRAM보다 소비전력이 작다

SRAM보다 구조가 간단하고 저렴하다.

주로 PC의 주기억장치로 사용된다.



SDRAM은 DRAM의 Refresh를 보완

SRAM과 유사한 동작을 하는 저가형 RAM이다.








범용 마이크로프로세서를 구성하는 요소에는 명령세트, 레지스터, 메모리공간 등이 있는데

여기서 명령세트에는 RISCCISC가 있다.



RISC(reduced instruction set compute)


CPU의 명령어 갯수를 줄여 구조를 간단하게 만드는 방식

적은수의 명령어들로 명령어를 집함한다

복잡한 연산도 적은수의 명령어를 조합해 수행한다

슈퍼컴퓨터에 내장되는 칩에 사용된다



 SISC(complex instruction set computer)


복잡한 명령어들의 집합을 가진다

명령어를 해석하는데 오래걸린다

주로 개인용 PC에 내장되는 Intel 칩에 사용된다




원문 보기 클릭














구조체의 메모리할당




  • 구조체의 메모리 할당
#include <stdio.h>
struct smart // 구조체생성
{
  int A; // 4
  int B; // 4
  char C; // 1
  char D; // 1
  char E; // 1
  short F; // 2
  char G; // 1
  int H; // 4
  char I; // 1
  short J; // 2
  char K; // 1
};

int main()
{
  printf("%d\n",sizeof(struct smart));
  
  return 0;
}



주석에 달아놓은 숫자는 각 Type의 범위를 써놓은 것이다.

예를들어 int 는 4, char는 1


계산을 해보면 struct smart 의 sizeof() 는 '22'가 되어야 정상이다.

그런데 struct smart의 크기가 '28'이 나온 이유는 무엇일까





#include <stdio.h>
struct smart // 구조체생성
{
  int A; // 4
  int B; // 4
  char C; // 1

};
int main()
{
  printf("%d\n",sizeof(struct smart));
  
  return 0;
}



int A;

int B;

까지 선언했을때 sizeof()를 했을때 '8'이 나오는 것은 맞는데


char C; 를 선언하고 sizeof()를 출력했을때에는 '9'가 나와야 하는데

'12'라는 결과가 출력됬다.


그 이유는 32bit CPU기준으로 모두 구조체의 변수가 4byte씩 할당되기 때문이다.

char C;

라고 선언한 순간부터 4byte가 더 할당된다.



하지만 ' char C '가 4byte라는 얘기가 아니다.

할당된 범위가 4byte이고 위 그림처럼

' char C '는 그 4byte공간 안에서 1byte만 차지하고 있다.


전체 소스의 그림을 그리면 다음과 같다.




위 그림에서 char E 다음의 short F 에 주목할 필요있다


4byte가 할당된 세번째 칸에 자리하고 있는 char E 다음에

1byte의 여유공간이 남아있는데, 여기에는 범위가 2byte인 short 타입이 들어갈 수가 없다.

그래서 새로운 4byte를 할당해서 short F를 넣어준다.

그리고 남는 1byte는 버려진다.


그리고 char I 가 선언되고 4byte가 새로이 할당 되엇고

short J 가 선언되었는데 4byte 의 3번째와 4번째자리에 들어갔다

short J 는 할당된 4byte의 중간에 걸칠 수 없기 때문


이런 방식의 구조로 인해 struct smart 의 크기는 ' 28byte '를 가지는데

결국 버려지는 메모리가 많아지고

그만큼 비효율 적이 되버린다.




이를 보완하기 위해 다음과같은 구문을 입력한다.


#include <stdio.h>

#pragma pack(1// 1byte씩 할당, 메모리 손실이 없지만, 속도 느려짐

struct smart // 구조체생성
{
  int A; // 4
  int B; // 4
  char C; // 1
  char D; // 1
  char E; // 1
  short F; // 2
  char G; // 1
  int H; // 4
  char I; // 1
  short J; // 2
  char K; // 1
};

int main()
{
  printf("%d\n",sizeof(struct smart));
  
  return 0;
}



' # '을 쓴다는건 전처리언어로 쓰인다는 말이다.


위 그림에서 보였던 것 처럼 '4byte'씩 말고 ' 1byte '씩 할당해라.. 라는 말을

컴파일러에게 미리 경고를 해두는 구문이다.


하지만 이는 1byte 씩 할당을 일일히 하다보니 속도가 

저하될 수 밖에 없는 단점이 있다.



그러므로 구조체의 소스코드를 짜는 경우에는

되도록 Type이 같은 멤버변수를 묶어서 여러개의 구조체를 만들던가


그것도 아니면 아래와 같이


#include <stdio.h>
struct smart // 구조체생성
{
  int A; // 4
  int B; // 4
  short C; // 2
  short D; // 2
  char E; // 1
  char F; // 1
  char G; // 1
  char H; // 1
};
int main()
{
  printf("%d\n",sizeof(struct smart));
  
  return 0;
}




메모리 손실없이 위와 같은 방법으로

계산적인 할당을 하는것이 좋다.




원문 보기








많이놓침









728x90