메모리(RAM)의 구조/지역변수&전역변수/AVR makefile

 

학습목표

 

메모리의 구조의 대하여 이해하고 변수생성 시 어느 영역에 저장되는지 안다.

폰 노이만 구조와 하버드 구조의 차이점을 이해한다.

지역변수와 전역변수의 차이와 활용에 대해서 안다.

재귀함수에 대해 안다.

Makefile에 있는 문법에 대해 안다.

 

//Intel이나 ATmega에서 메모리 영역의 사용은 동일하다.

 

명령어들은 메모리의 Code영역에 저장된다.

폰 노이만 방식은 Code영역과 저장용 메모리 영역의 버스를 달리함으로써 속도를 향상 시킨다.

 

전역 변수를 쓰면 함수의 인자가 필요하지 않게 된다.

 

전역변수는 프로그램을 복잡하게 만드는 주범임으로 가능한 한 사용을 최소화해야 한다.

또한 전역변수는 해당 프로그램이 시작될 때부터 종료할 때까지 메모리를 차지하게 된다. 때문에 RAM의 메모리를 지속적으로 사용하게 된다.

 

지역변수를 사용하면 변수의 생성과 소멸에 의해 CPU에 부하가 발생할 수 있지만 이것은 메모리 사용보다는 낮은 우선순위이다.

 

Static 지역변수


 

Static변수는 한 번만 초기화되는 전역변수이다.

 

p/234 예제 static 변수)

 

 

Static 변수도 전역변수의 일종임으로 가능한 한 지역변수를 사용하자!

 

사용해야 하는 우선 순위(왼쪽이 순위 높음)

 

지역변수 - static 지역변수 - 전역변수

 

레지스터 변수

 

레지스터 변수 선언하면 CPU내 레지스터에 저장될 확률이 높아진다. 때문에 빠른 변수의 처리를 원할 경우 register 변수를 선언하면 처리가 빨라질 수도 있다.

 

// register명령어와 비슷한 명령어는 volatile이다. 둘 다 compiler 실행에 간섭한다.

 

전역변수는 register 변수로 선언할 수 없다.

 

p/238 재귀함수

 

재귀함수는 만들지 말아라! 메모리를 많이 사용하기 때문이다.

 

무한 재귀함수의 문제점은 변수를 무한대로 생성하여 메모리를 지속적으로 차지하게 된다. Window운영체제에서는 이러한 프로그램을 강제종료 시키지만 이러한 재귀함수를 제한하지 않은 환경에서는 오작동이 발생할 수 있다.

 

// 지역 변수를 다른 용어로 buffer라고도 부른다.

 

// 할당된 메모리를 넘어가서 다른 영역까지 메모리를 침범하는 경우를 oveflow라고 부른다.

 

// 해킹의 용도로 고의적으로 stack을 넘치게 하여 컴퓨터에 오류를 일으키게 할 수 있다.

 

makefile에 대한 설명

 

line44 MCU = atmega128 //변수타입 없이 선언 되었다. MCU의 값 atmega128

line65 F_CPU = 16000000 //전에 800000이던 것을 수정하였다.

 

line83 SRC = $(TARGET).c //변수를 사용할 때는 $(TARGET)을 사용해해야 한다.

 

#을 넣으면 주석처리 된다.

$(*)을 넣으면 변수처리 된다.











 

반응형
Posted by newind2000