ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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부터 시작하는 것을 볼 수 있다.

     

     

     

     

     

     

     

     

     

     

Designed by Tistory.