임베디드 시스템을 위한 SW 구조설계 6

2023. 4. 18. 12:55[Harman] 세미콘(semiconductor) 아카데미-반도체설계/임베디드 시스템을 위한 SW 구조설계

728x90

기초 CS 및 구조체, 포인터 특징 공부하였다.


  • 메모리 구조

출처 = http://www.tcpschool.com/c/c_memory_structure

  • 코드(Code) 영역 
  1. 코드 영역은 실행할 프로그램의 코드가 저장되는 영역
  2. CPU는 코드 영역에 저장된 명령어를 하나씩 가져가 처리하게 된다.

 

  • 데이터(Data) 영역
  1. 프로그램의 전역변수, 정적(Static)변수가 저장되는 영역
  2. 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸
  3. 스택영역의 지역변수에 메모리가 부족하여 스택 오버플로우가 발생할 때, 해당 지역변수를 데이터영역(전역변수로)으로 선언하여 컴파일 시 오버플로우해결할 수 있다.(데이터영역이 스택영역보다 크기 때문)

 

  • 힙(Heap) 영역
  1. 사용자가 malloc등의 함수로 메모리를 동적으로 할당한 영역
  2. 스택, 데이터 영역은 프로그램이 실행되는 동안 메모리 공간이 지정되어 있지만, 힙 영역은 프로그램이 실행되는 동안 유동적으로 할당 및 해제가 가능하다. 
  3. 할당해야 할 메모리의 크기를 프로그램이 실행되는 동안 결정해야 하는 경우(런타임일때) 사용되는 공간

 

  • 스택(Stack) 영역
  1. 함수내에 사용되는 지역변수와 매개변수가 저장되는 영역
  2. main함수에 선언되는 변수 또한 전부 스택 영역에 저장된다.
  3. 스택 영역은 함수 선언과 함께 할당되며, 함수를 벗어나면 소멸한다.
  4. 스택영역은 높은 주소에서 낮은 주소의 방향으로 할당된다.
  5. LIFO(Last In First Out)의 후입선출 개념으로 데이터가 저장된다.
  6. 스택영역에 할당될 메모리의 크기는 컴파일타임(컴파일 하는 동안)에 결정된다.
코드 영역 사용자가 작성한 코드
데이터 영역 전역변수, 정적(Static)변수
힙 영역 malloc, calloc등의 동적으로 할당 받은 변수
스택 영역 main함수 내부 변수, 함수 내의 지역변수

 


 

  • 변수의 종류
  • 지역변수 
  1. 선언된 함수 내에서만 사용 가능한 변수
  2. 함수가 시작될 때 스택영역에 메모리가 할당되고 함수가 끝날 때 스택에서 빠져나와 메모리가 해제된다.

 

  • 전역변수
  1. 함수 밖에 선언되어 프로그램 내에 어디서든 사용 가능한 변수
  2. 프로그램의 어디에서나 접근할 수 있으며, 프로그램이 종료되어야만 메모리에서 사라진다.
  3. 메모리의 데이터(Data)영역에 저장되며, 초기화하지 않아도 0으로 자동 초기화된다.

 

  • 정적(Static)변수

C언어에서 기본적으로 변수는 동적(Dynamic)변수로써 변수 선언과 동시에 메모리가 할당되고, 변수가 선언된 함수를 벗어날 시 메모리가 해제된다. 그러나 정적변수는 

  1. static변수(정적변수)는 함수 내부에도 사용가능하고, 함수를 벗어나서도 사용가능한 변수이다.
  2. 처음에 초기화해주지 않아도 자동으로 0으로 초기화 된다.
  3. 전역변수와 동일하게 프로그램이 시작될 때 할당되며, 프로그램이 종료하면 해제된다.

 


  • 구조체

여러 자료형을 가진 변수들을 하나로 묶어 자료형으로 사용할 수 있도록 정의한 것

 

struct newtype_t{
   char cx;
   int iy;
   float fz;
};

newtype_t abc;

test라는 구조체를 만들어, test구조체 변수 abc를 만들 수 있다. 

 

//main.h 

int sum_ab(int  , int);                // sum_ab함수 선언
int sum_abG(void);                     // sum_abG함수 선언
struct newtype_t{
   char cx;
   int iy;
   float fz;
};
int sum_abSp(struct newtype_t *);      // sum_abSp함수 선언
//mian.c 
#include "main.h"

int val_a = 100;
int val_b = 200;
int result;
newtype_t data;

int main(){

    result = sum_ab(val_a,val_b);
    result = sum_abG();
    result = sum_abS(data);
    
    return 0;
}

int sum_ab(int val_a, int val_b)
{
   int sum;
   sum = val_a + val_b;
   return sum;
}

int sum_abG(void)
{

   return va+vb;
}

int sum_abS(struct newtype_t test)
{

   test.cx ='0';
   return test.cx;
}

함수의 매개변수는 초기 선언 시, 함수명(자료형)의 형태로 쓰일 수 있다. 

 

현재