전역변수
변수
①전역변수 : 함수 밖 선언,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)인 것이다.
'코스웨어 > 16년 스마트컨트롤러' 카테고리의 다른 글
20160316-조재찬-업무일지-LCD출력 (0) | 2016.03.17 |
---|---|
20160315-조재찬-업무일지-펌웨어 분석 및 학습 (0) | 2016.03.17 |
Zenmate PC 클라이언트 (0) | 2016.03.16 |
20160311_노유찬_펌웨어실습 (0) | 2016.03.16 |
팀뷰어 보안 문제 있는거 같습니다... (0) | 2016.03.16 |
20160316-이보원-ATMega2560 -LCD 실험 2 (1) | 2016.03.16 |
20160314-허도경-업무일지-펌웨어분석2 (0) | 2016.03.16 |
LCD_Str (0) | 2016.03.16 |