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

20160315_노유찬_펌웨어실습(LCD출력준비및전역변수)

by 알 수 없는 사용자 2016. 3. 16.
728x90
반응형

전역변수

변수

①전역변수 : 함수 밖 선언,Data 영역에 저장

②지역변수 : 함수 내 선언(우리가 주로 쓰던 변수),Stack영역에 저장

 메모리영역

 code(text)-기계어

 Data-전역변수

 BSS-전역변수

 Heap

 Stack-지역변수

 

 전역변수와 지역변수의 주소값을 통한 저장공간의 차이확인

①소스코드

#include<stdio.h>

int D;
int
 E;
int
 F;
int
 G;
int
 H;

int
 main()
{
  
int A = 0
;
  int
 B;
  int C = 100
;

  printf("A's ADD :  %p\n",&
A);
  printf("B's ADD :  %p\n",&
B);
  printf("C's ADD :  %p\n",&
C);
  printf("----------stack----------\n"
);
  printf("D's ADD :  %p\n",&
D);
  printf("E's ADD :  %p\n",&
E);
  printf("F's ADD :  %p\n",&
F);
  printf("G's ADD :  %p\n",&
G);
  printf("H's ADD :  %p\n",&
H);
  printf("-----------data-----------\n"
);
  printf("printf's ADD  %p\n"
,printf);  
  printf("main's ADD  %p\n"
,main);

  return 0
;
}

②실행결과

지역변수인 'A','B','C'는 0018로 주소가 시작되는반면 전역변수인 'D' ~ 'H'는 0041로 주소가 시작되므로 저장되는 공간이 다름을 알 수 있다.

전역변수끼리도 저장주소가 다르다!?

①소스코드

#include<stdio.h>

int D = 98;
int
 E;
int F = 99
;
int
 G;
int
 H;

int
 main()
{
  
int A = 0
;
  int
 B;
  int C = 100
;

/*  printf("A's ADD :  %p\n",&A);
  printf("B's ADD :  %p\n",&
B);
  printf("C's ADD :  %p\n",&
C);
  printf("----------stack----------\n");
*/

  printf("D's ADD :  %p\n",&D);
  printf("F's ADD :  %p\n",&
F);
  printf("-----------data-----------\n"
);
  printf("E's ADD :  %p\n",&
E);
  printf("G's ADD :  %p\n",&
G);
  printf("H's ADD :  %p\n",&
H);
  printf("-----------BSS-----------\n"
);
/*
  printf("printf's ADD  %p\n",printf);  
  printf("main's ADD  %p\n",main);

*/


  return 0;
}

②실행결과

초기화된 전역변수는 Data영역에 초기화 되지않은 전역변수는 BSS영역에 저장된다.

전역변수의 특징

①초기화하지 않으면 바이너리제로(0으로 다채워짐)  ※지역변수의 경우 쓰레기 값

②전역변수와 지역변의 변수명이 겹칠경우 출력함수(printf)가 속해있는 영역의 변수가  우선

#include<stdio.h>


int A;

int
 main()
{
  
int A = 100
;
  
  printf(
"A = %d\n"
,A);

  return 0
;
}

결과 값

전역변수의 문제점

①여러변수가 사용하므로 변수관리가 어렵다.

②지역변수의 경우 해당 함수가 종료되면 사라지지만 전역변수의 경우 사리지지않으므로  메모리를 낭비할 수 있다.

③메모리가 증가되므로 실행파일의 용량또한 증가한다. ∴지역변수를 사용하도록 하자!

아는것이 힘이다 !

①빠름~빠름~빠름~

변수의형(type)중 int가 가장빠르고(bus관련 32bit) 그중에서 음수,양수를 따질필요없는 unsigned int형이 가장 빠른 type되시겠다.

②어머~ 얜 꼭 챙겨야되 (헤더3종세트)

#ifndef__MAIN_H__
#define__MAIN_H__



#endif //MAIN_H

MAIN자리에 함수명 오시면 되겠다 ~ 오늘은 여기까지

LCD 시트

 No.

 Symbol

Function 

 1

 VSS

 GND

 2

 VDD

 +5.0V

 3

 V0

 power supply for LCD drive

 4

 RS

 Register selection(H:Data ,L:Instruction)

 5

 R/W

 Read/Write selection(H:Read ,L:Write)

 6

 E

 Enable signal for LCM

 7-14

 DB0~DB7

 Data Bus line

 15

 LEDA

 +5.0V

 16

 LEDK

 GND

1(VSS),2(VDD),15(LEDA),16(LEDK)번은 각 GND와 5V에 연결 15,16번은 LCD 백라이트

3(V0)번은 글자를 찍는 점의 세기

4(RS)번은 레지스터 모드 H일 경우 값이고 L일 경우 명령어이다

5(R/W)번은 H일 경우 읽기 L일 경우 쓰기

6(E)번은 버스가 LCD패널 연결전 마지막 관문 L일 경우 닫히고 H일 경우 연결

7-14번은 버스

타이밍 표(Timing Diagram)

 

RS,RW등 High와Low 두줄로 시작하는곳은 어떤 상태여도 상관없다는 Don't Care상태 이다EN의 경우 버스를 연결시킬지 말지 최종적으로 결정하므로 특정 값(Valid Data)이 나타날 시점에 High(연결)시켜줘야 하므로 시작이 L(Low)인 것이다.

 

 

728x90