성엽이
KKIMSSI
성엽이
전체 방문자
오늘
어제
  • 분류 전체보기 (454)
    • :) (2)
    • C프로그래밍이론 (9)
    • C++프로그래밍 (64)
      • STL (1)
    • C# (2)
    • Visual studio 10.0 (9)
    • AT91SAM7S256 (21)
    • 논리회로 (14)
    • AVR2560 (11)
    • TCPIP (16)
    • NetWork (4)
      • Ubuntu Linux (2)
    • Assembly (21)
    • UNIX 프로그래밍 (6)
    • RFID 분석 (1)
    • Win32 API (7)
    • Cortex-M3 (4)
    • Unity (91)
    • Flutter (9)
    • OwnProject (11)
      • It's mine (5)
      • 마인드스톰 실습 (1)
      • 보고서 자료 (2)
      • RPi B+ (2)
    • ETC (25)
      • 상식 (3)
    • MFC (40)
    • PostgeSQL (18)
    • 영상제어 (6)
      • VFW_영상처리 (1)
    • Python (0)
    • Java (30)
      • SpringBoot (2)
      • Javascript (1)
      • JSP (13)
      • Spring (8)
    • Oracle (4)
      • SQL (3)
    • HTML (6)
      • Thymeleaf (1)
      • CSS (1)
      • Bootstrap (3)
    • IDE (1)
      • VS Code (1)
    • Android (2)
    • Privacy Policy (0)
    • MYSQL (2)
      • MariaDB (2)
    • AWS (5)
    • 개인공부 (0)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록
  • 관리자
  • 글쓰기

공지사항

인기 글

태그

  • Boot Code 분석
  • MFC
  • 문자열 나누기
  • WINAPI
  • ARM Reverse Engineering

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
성엽이

KKIMSSI

2013.05.10_전역변수_릴레이를 이용한 토글
C++프로그래밍

2013.05.10_전역변수_릴레이를 이용한 토글

2013. 5. 10. 23:12

________C 수업____________________________________________________________________________

※ Global 변수 (전역변수)

※ stack영역에 만들어지는 변수중에 main() 함수에 만들어지는 지역변수는 메인함수가 종료할때까지 남아있음.

※ {

int a; // 이런 변수는 4바이트를 확보하라는 명령어가 code영역에 들어감, 실제로 파일에 4바이트를 차지하고있지는 않다.

}

※ static 변수는 파일이 만들어 질때 용량이 확보됨.

※ 메모리 영역별 속도차는 없음.

※ 전역변수는 아주 자주 접근해야하는 변수가 있을 경우만 쓰고 웬만하면 안쓰는게 좋음.

※ 여러함수에서 전역변수에 자주 접근을 하는 경우에 코딩이 꼬이는 경우가 있으므로 웬만하면 안쓰는게 좋음.

※ 전역변수 앞에 static을 쓰면 다른 파일에서 접근 불가함.

DATA 영역

초기화 된 전역변수와 static 변수가 들어감

BSS 영역

초기화 되지 않은 전역변수와 static 변수가 들어감

static변수와 전역변수 TEST

#include <stdio.h>

//전역 변수와 static 변수는 0으로 자동 초기화 됨.

int a;
int b;
int c = 100;
int d = 200;
int e;

void test1();
void test2();

int main()

{
int f = 300;
int g = 400;
static int h;
static int i = 500;

test2();
test1();

printf("a : %d\t %08X\n", a, &a);
printf("b : %d\t %08X\n", b, &b);
printf("c : %d\t %08X\n", c, &c);
printf("d : %d\t %08X\n", d, &d);
printf("e : %d\t %08X\n", e, &e);
printf("f : %d\t %08X\n", f, &f);
printf("g : %d\t %08X\n", g, &g);
printf("h : %d\t %08X\n", h, &h);
printf("i : %d\t %08X\n", i, &i);

return 0;

}


void test1()
{
a = 100;
b = 200;
c = 300;
d = 400;
e = 500;

return;
}

void test2()
{
printf("a : %d\t %08X\n", a, &a);
printf("b : %d\t %08X\n", b, &b);
printf("c : %d\t %08X\n", c, &c);
printf("d : %d\t %08X\n", d, &d);
printf("e : %d\t %08X\n\n", e, &e);

return;
}

 

  ※ Data 영역과 BSS 영역에 달리 저장이 되는 것이 확인된다.

static과 extern TEST

---------- file A------------------------------------------

#include <stdio.h>

void test ();

int a;

//전역 변수에 static 을 쓰면 외부파일에서 접근 못함.
//int a; //static없으면 외부에서 접근 가능.


int main()
{
a = 100;

printf("a : %d\n", a);

test();

printf("a : %d\n", a);

return 0;
}


---------file B--------------------------------------------

extern int a; //extern을 붙이면 변수 a의 정의가 외부에 있다는 것을 알려주는것

//변수 a가 이 파일에서 다시 정의되는것은 아니다. 참조만 하는것

// 다른 파일에 있는 변수에 접근 가능

void test()
{
a = 200;


return;
}

--------------------------------------------------------------

13.1 열거형

열거형 : 이름을 갖는 정수형의 상수를 정의하여 프로그램을 이해하기 쉽게 해줌.

예약어 > enum

형식 > enum type_name

{

sun,

mon,

tue,

:

}

※ type_name은 자료형의 이름이고 열거리스트 각원소는 값을 지정 해주지 않으면 0 에서 시작하는 정수 값을 가지고 있음

예> sum =0, mon = 1, tue = 2

※ 각 원소들은 , 로 선언

enum TEST

#include <stdio.h>

enum SMART
{
kk, //원소 값을 임의로 지정하지 않으면 0에서 시작하는 정수 값을 가짐 , 0

kkk, // 원소 값을 임의로 지정하지 않으면 위의 원소에 +1 됨, 1

jj = 300, //원소의 값을 임의로 지정할수 있음 , 300
ii, //ii의 원소 값이 임의 지정 되어 있지 않고 바로 위의 원소값이 300으로 임의 지정되어 있으므로 ii 는 300+1 이다.

};

int main()
{
printf("%d\n", kk);
printf("%d\n", jj);

printf("%d\n", ii);

return 0;
}

 

__________________________________________________________________________________________

________ARM____________________________________________________________________________

main.c

#include "project.h"
#include "LCD.h"
#include "ADC.h"
#include "DBGU.h"
#include "LED.h"
#include "Relay.h"
#include "TIMER.h"


int main()
{
//unsigned int uiNum;
//volatile unsigned int vuiCnt;

LCD_Init();
ADC_Init();
DBGU_init();
LED_Init();
RELAY_Init();


while(1)
{
DBGU_String("1.LED Toggle\r\n");
DBGU_String("2.LCD TEST\r\n");
DBGU_String("3.RELAY Toggle\r\n"); // UART로 하이퍼터미널과 통신 모니터에 찍힘.

switch( Recv_char( ))
{
case '1':
LED_Toggle();
break;

case '2':
LCD_String("TEST");
break;

case '3':
RELAY_Toggle(); // 하이퍼터미널로 3번 입력 받으면 릴레이 토글 함. 동작원리는 스위치와 유사함. 똑같진않음.
break;

default :
break;
}
}

return 0;

}

RELAY.h

#ifndef _RELAY_H_
#define _RELAY_H_

#define PIO_OER (*((volatile unsigned int *)0xFFFFF410))
#define PIO_PER (*((volatile unsigned int *)0xFFFFF400))
#define PIO_CODR (*((volatile unsigned int *)0xFFFFF434))
#define PIO_SODR (*((volatile unsigned int *)0xFFFFF430))

#define RELAY_PIN 1


void RELAY_Init();
void RELAY_Toggle();

#endif //_RELAY_H_

RELAY.c

#include "Relay.h"

void RELAY_Init()
{
PIO_OER = (1<<RELAY_PIN);
PIO_PER = (1<<RELAY_PIN);

PIO_SODR = (1<<RELAY_PIN);

return;
}

void RELAY_Toggle() // 릴레이 토글...PA 1번이 SET되어 있으면 clear시키고 , CLEAR 되어 있으면 set 함.
{
static unsigned int uiState = 0;

if( 0 == uiState )
{
PIO_CODR = (1<<RELAY_PIN);
uiState = 1;
}
else
{
PIO_SODR = (1<<RELAY_PIN);
uiState = 0;
}

return;
}

makefile (추가 된 내용만...)

OBJS+= lowlevel.o \
main.o \
LCD.o \
ADC.o \
DBGU.o \
LED.o \
Relay.o

all: sram flash
@echo end...

rebuild: clean all

sram: $(OBJS)
$(LD) $(LDFLAGS) -Ttext 0x201000 -Tdata 0x200000 -n -o $(WCOUTFILE_SRAM).elf $(OBJS)
$(OBJCOPY) --strip-debug --strip-unneeded $(WCOUTFILE_SRAM).elf -O binary $(WCOUTFILE_SRAM).bin

flash: $(OBJS)
$(LD) $(LDFLAGS) -Ttext 0x100000 -Tdata 0x200000 -n -o $(WCOUTFILE_FLASH).elf $(OBJS)
$(OBJCOPY) --strip-debug --strip-unneeded $(WCOUTFILE_FLASH).elf -O binary $(WCOUTFILE_FLASH).bin

main.o: main.c
$(CC) -c $(CCFLAGS) main.c -o main.o

lowlevel.o: lowlevel.c
$(CC) -c $(CCFLAGS) lowlevel.c -o lowlevel.o

LCD.o: LCD.c
$(CC) -c $(CCFLAGS) LCD.c -o LCD.o

ADC.o: ADC.c
$(CC) -c $(CCFLAGS) ADC.c -o ADC.o

DBGU.o: DBGU.c
$(CC) -c $(CCFLAGS) DBGU.c -o DBGU.o

LED.o: LED.c
$(CC) -c $(CCFLAGS) LED.c -o LED.o

Relay.o: Relay.c
$(CC) -c $(CCFLAGS) Relay.c -o Relay.o

cstartup.o: cstartup.S
$(AS) $(ASFLAGS) cstartup.S -o cstartup.o

clean:
$(ERASE_FCT) *.o *.bin *.elf *.map

※ tolerant : 관대한

※ 5V-tolerant I/O : PIO는 3.3V 입출력이지만 5V까지는 괜찮다는것을 말해줌. (AT91SAM7S의 경우)

__________________________________________________________________________________________

________논리 회로____________________________________________________________________________

※ 가산기 실습

__________________________________________________________________________________________

 

저작자표시

'C++프로그래밍' 카테고리의 다른 글

2013.05.08_read_write()  (0) 2013.05.14
2013.05.13_J-K플립플롭,T,D_열거형_공용체_조건문  (0) 2013.05.13
2013.05.09_스택영역 발담기!_리다이렉션!_  (0) 2013.05.09
2013.05.07_구조체입출력(2)  (0) 2013.05.07
2013.05.06_구조체입출력(1)  (0) 2013.05.06
    'C++프로그래밍' 카테고리의 다른 글
    • 2013.05.08_read_write()
    • 2013.05.13_J-K플립플롭,T,D_열거형_공용체_조건문
    • 2013.05.09_스택영역 발담기!_리다이렉션!_
    • 2013.05.07_구조체입출력(2)
    성엽이
    성엽이

    티스토리툴바