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

2015-03-12 32번 천정호

by 알 수 없는 사용자 2015. 3. 13.
728x90
반응형

HardWare

오늘의 수업 내용

NOR 래치회로와 NAND 래치회로의 동작을 이해한다.

S-R 플립플롭, D플립플롭, J-K플립플롭, T플립플롭의 동작을 이해한다.


기본적인 플립플롭
플립플롭(Flip-Flop)과 래치(Latch)는 두 개의 안정된 상태중 하나를 가지는 1Bit 기억소자이다.
플립플롭과 래치도 게이트로 구성되지만 조합논리회로와 달리 궤한(Feed Back)이 있다.
래치회로는 근복적으로는 플립플롭과 유사한 기능을 수행한다.



NOR GATE 래치회로

NOR GATE를 이용한 기억회로 회로도와 입력과 출력값

Logic State : 입력

Logic Probe : 출력

* 입력 값을 설정한 후 회로에 전원을 인가해야한다.


NAND GATE 래치회로



NAND GATE를 이용한 기억회로 회로도와 입력과 출력값

Logic State : 입력

Logic Probe : 출력

* 입력 값을 설정한 후 회로에 전원을 인가해야한다.






SoftWare

오늘의 수업 내용

MakeFile의 분석과 MakeFile의 생성과 사용


MakeFile 분석

SRC는 소스의 약자

 SRC = $(TARGET).c



CPP는 C++라는 언어파일 형식인데 C++ 파일이 존재 하지 않으므로 값이 비어있다. 
CPPSRC =



AS는 Assembly 파일을 뜻하며 파일이 존재하지 않으므로 값이 비어있다.
ASRC =



밑의 내용들은 옵션을 뜻하는 내용인데 0은 속도 우선으로 동작하라는 의미이고 s는 Size 즉 크기로 최적화하라는 의미이다.
항상 메모리의 크기와 속도는 비례한다. 반비례의 의미는 존재할 수가 없다.
# Optimization level, can be [0, 1, 2, 3, s].           
#     0 = turn off optimization. s = optimize for size.
#     (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
OPT = s



# Debugging format.
#     Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs.
#     AVR Studio 4.10 requires dwarf-2.
#     AVR [Extended] COFF format requires stabs, plus an avr-objcopy run.

내부에 생성되는 파일의 구조를 dwarf-2로 맞춰라는 의미이다.
DEBUG = dwarf-2                    



운영체제별 컴파일 형식
Windows Format = PE Format
Linux Format = ELF

# List any extra directories to look for include files here.
#     Each directory must be seperated by a space.
#     Use forward slashes for directory separators.
#     For a directory that has spaces, enclose it in quotes.



include 경로라는 약자이며 include 할 경로를 추가적으로 생성한다는 의미이다.
EXTRAINCDIRS =                     



C언어의 표준을 어떤 형식으로 지정할 것 인가를 정하는 곳이다.
# Compiler flag to set the C Standard level.
#     c89   = "ANSI" C
#     gnu89 = c89 plus GCC extensions
#     c99   = ISO C99 standard (not yet fully implemented)
#     gnu99 = c99 plus GCC extensions

C언어의 표준을 GNU99 방식을 따른다는 의미이다. 위의 주석에서 표준의 종류를 보여주며 여기서 사용자의 환경에 맞게 설정하면 된다.
CSTANDARD = -std=gnu99



# Place -D or -U options here for C sources

CDEFS의 해석
C는 C Programming 뜻하는 것    DEF는 define을 의미    s는 복수의 뜻으로 사용

-DF_CPU=$(F_CPU)UL의 해석
-DF는 /define 의미    _CPU는 define 이름    =$(F_CPU)UL    define에 저장되는 값
 Linux에서는 define을 여러개를 쓰려면 define 명령 후 한칸을 띄우고 다시 다른 define을 포함 시킨다.
CDEFS = -DF_CPU=$(F_CPU)UL       
                                                    

--------------------------------- 코드 내용과 설명 ---------------------------------

명령어
/cl DSMART main.c                    #define SMART를 포함하여 컴파일을 한다.

C Code
#include <stdio.h>

int main() {

// 조건부 define

//cl /DSMART main.c    
#ifdef SMART
  printf("1\n\n");

#endif
  
  return 0;
}



명령어
/cl DSMART=100 main.c                    컴파일을 할때마다 사용자가 임의로 값을 변경할 수 있다.
DSMART=100                                   #define SMART 100의 형식으로 동작한다.

C Code
#include <stdio.h>

int main() {

// 조건부 define

//cl /DSMART main.c    
#ifdef SMART
  printf("1\n\n");

#endif

#if SMART == 100
  printf("2\n");

#endif
  
  return 0;
}

Windows 계열의 컴파일은 /를 붙이고 명령을 주지만 Linux 계열의 gcc 컴파일러는 -를 붙이고 명령을 준다.

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



# Place -D or -U options here for ASM sources

Assembly Define
ADEFS = -DF_CPU=$(F_CPU)



# Place -D or -U options here for C++ sources

C++ Define
CPPDEFS = -DF_CPU=$(F_CPU)UL
#CPPDEFS += -D__STDC_LIMIT_MACROS
#CPPDEFS += -D__STDC_CONSTANT_MACROS



누적 C Flag                    
옵션과 명령을 한 줄로 나열하게되면 사용자가 내용의 확인과 수정이 어렵기 때문에 한 줄씩 나누어서 내용의 확인과 수정을 용이하게 쓴다.
MakeFile에서는 이렇게 한 줄씩 따로 나누어 쓰지만 컴파일시에는 모두 한줄로 인식하여 명령을 삽입한다.

#---------------- Compiler Options C ----------------
#  -g*:          generate debugging information
#  -O*:          optimization level
#  -f...:        tuning, see GCC manual and avr-libc documentation
#  -Wall...:     warning level
#  -Wa,...:      tell GCC to pass this to the assembler.
#    -adhlns...: create assembler listing
CFLAGS = -g$(DEBUG)                    변수 사용시에는 $(변수명)으로 사용을 한다.
CFLAGS += $(CDEFS)                      DEBUG + CDEFS의 형식으로 Flag가 누적이 된다. 하지만 앞에서 사용된것이 아니면 누적을 하지 못한다.
CFLAGS += -O$(OPT)                      DEBUG + CDEFS + OPT    세 개의 Flag 누적
CFLAGS += -funsigned-char                  DEBUG + CDEFS + OPT + unsigned-char    Flag 누적
CFLAGS += -funsigned-bitfields              DEBUG + CDEFS + OPT + unsigned-char + unsigned-bitfields    Flag 누적
CFLAGS += -fpack-struct                     + pack-struct    Flag 누적
CFLAGS += -fshort-enums                    + short-enums    Flag 누적
CFLAGS += -Wall                               + Wall(Warning All)    Wall Flag는 모든 경고와 오류를 출력하라는 의미이다.
CFLAGS += -Wstrict-prototypes              + Wstrict-prototypes    Flag 누적



#CFLAGS += -mshort-calls
#CFLAGS += -fno-unit-at-a-time
#CFLAGS += -Wundef
#CFLAGS += -Wunreachable-code
#CFLAGS += -Wsign-compare
CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst)                OBJDIR는 현재의 파일경로를 의미한다.
CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
CFLAGS += $(CSTANDARD)



MATH_LIB = -lm                            -lm(library math)는 수학 라이브러리를 의미한다.     



Linux의 gcc 컴파일러는 모든 단계를 분할하여 컴파일 하는데 각 컴파일마다 적용시키는 명령이 따로 있다.
#---------------- Linker Options ----------------
#  -Wl,...:     tell GCC to pass this to linker.
#    -Map:      create map file
#    --cref:    add cross reference to  map file



LDFLAGS Link Flag
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref                         
LDFLAGS += $(EXTMEMOPTS)
LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))
LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
#LDFLAGS += -T linker_script.x

#============================================================================


# Define programs and commands.
SHELL = sh
CC = avr-gcc                                C Compiler라는 변수로 avr-gcc 파일을 불러온다는 의미
OBJCOPY = avr-objcopy
OBJDUMP = avr-objdump
SIZE = avr-size
AR = avr-ar rcs
NM = avr-nm
AVRDUDE = avrdude
REMOVE = rm -f
REMOVEDIR = rm -rf
COPY = cp
WINSHELL = cmd



메세지 변수
# Define Messages
# English
MSG_ERRORS_NONE = Errors: none
MSG_BEGIN = -------- begin --------
MSG_END = --------  end  --------
MSG_SIZE_BEFORE = Size before:
MSG_SIZE_AFTER = Size after:
MSG_COFF = Converting to AVR COFF:
MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
MSG_FLASH = Creating load file for Flash:
MSG_EEPROM = Creating load file for EEPROM:
MSG_EXTENDED_LISTING = Creating Extended Listing:
MSG_SYMBOL_TABLE = Creating Symbol Table:
MSG_LINKING = Linking:
MSG_COMPILING = Compiling C:
MSG_COMPILING_CPP = Compiling C++:
MSG_ASSEMBLING = Assembling:
MSG_CLEANING = Cleaning project:
MSG_CREATING_LIBRARY = Creating library:



모든 플레그의 모임
# Combine all necessary flags and optional flags.
# Add target processor to flags.
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)
ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS)
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)



# Default target.

컴파일시 실행되는 라벨의 순서
all: begin gccversion sizebefore build sizeafter end

# Change the build target to build a HEX file or a library.
build: elf hex eep lss sym
#build: lib

elf: $(TARGET).elf
hex: $(TARGET).hex
eep: $(TARGET).eep
lss: $(TARGET).lss
sym: $(TARGET).sym
LIBNAME=lib$(TARGET).a
lib: $(LIBNAME)



@$(CC) --version                                avr-gcc --version의 의미로 컴파일러의 버전을 알려준다.


$(CC) -c $(ALL_CFLAGS) $< -o $@                $(ALL_CFLAGS) 앞에서 누적시킨 Flag를 모두 실행 시킨다.




MakeFile 실습

smart1:

@echo =======================================

@echo =              smart1                 = 

@echo =======================================


smart2:

@echo =======================================

@echo =              smart2                 = 

@echo =======================================


smart3:smart2 smart1

@echo ---------------------------------------

@echo -              smart3    -

@echo ---------------------------------------

MakeFile에 Label을 생성하여 Label의 사용법과 Label의 실행 순서를 지정할 수 있다.

Label의 생성 형식

Label의 이름을 적고 : 입력 후 한줄을 띄운다. 그리고 다음줄에서 Tab을 눌러 명령을 입력한다.

일반저인 make 명령은 가장 첫번째 Label만 수행하게 되어있다. 그렇기 때문에 가장 자주 사용하는 Label을 가장 먼저 생성하여 준다.

Label 이름 :

명령어

@명령어            -            명령어 앞에 @를 붙이게 되면 명령어는 출력되지 않고 명령만 실행하게 된다

Label의 사용 방법

Label3:Label1 Label2                    Label3이 실행되면 Label1과 Label2를 먼저 실행한 후 Label3을 실행시켜라는 의미이다.



MakeFile 응용

main.c

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

#include <stdio.h>

int main() {

printf("Hello\n\n");

return 0;

}

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


MakeFile

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

TARGET = main                                        TARGET이라는 변수에 main이라는 값을 넣는다.

CC = cl                                                CC 변수에 cl 값을 넣는다.

SRC = $(TARGET).c                                    TARGET을 사용하여 main.c라는 값을 SRC 변수에 넣는다.


MSG_BEGIN = ======= Begin =======                  시작을 알리는 문구

MSG_END = ======= End =======                      끝을 알리는 문구


build:                                                   build Label을 생성

@echo $(MSG_BEGIN)                              MSG_BEGIN의 변수값을 출력

@$(CC) $(SRC)                                    CC와 SRC의 변수값을 출력    => cl main.c

@echo $(MSG_END)                                MSG_END 변수값을 출력

EDITOR = notepad                                       메모장을 실행시키기 위한 명령을 저장


i:                                                        i Label을 생성

@echo $(MSG_BEGIN)                              MSG_BEGIN의 변수값을 출력

@$(CC) /P $(SRC)                                  /P 옵션을 이용하여 CC와 SRC의 변수값을 출력    => cl /P main.c

# @$(EDITOR) $(TARGET).i                            메모장을 통하여 main.c 파일을 열기위한 명령    (현재는 주석처리 중)

@echo $(MSG_END)                                MSG_END 변수값을 출력

asm:

@echo $(MSG_BEGIN)                             MSG_BEGIN의 변수값을 출력

@@$(CC) /FA $(SRC)                              CC와 SRC의 변수값을 출력

# @$(EDITOR) $(TARGET).asm                       메모장을 통하여 main.asm 파일을 열기위한 명령    (현재는 주석처리 중)

@echo $(MSG_END)                                MSG_END 변수값을 출력

obj:                                                    obj Label 생성

@echo $(MSG_BEGIN)                             MSG_BEGIN의 변수값을 출력

@@$(CC) /FO $(SRC)                             /FO 옵션을 이용하여 CC와 SRC의 변수값을 출력    => cl /FO main.c

# @$(EDITOR) $(TARGET).obj                       메모장을 통하여 main.obj 파일을 열기위한 명령    (현재는 주석처리 중)

       메모장으로는 main.obj 파일을 열수 없다.

@echo $(MSG_END)                              MSG_END 변수값을 출력


all: i asm build                                         all Label을 생성하여 Label의 실행 순서를 지정한다.

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



배열

배열 - 같은 Type의 자료형을 한 개 이상 열거해 놓은 것

1차원 배열

ex) int array[];        -        자료형     배열의 이름    배열의 길이(크기)    ;

배열의 크기 = 자료형의 크기 * 배열의 개수

대부분의 C언어 종류는 한번 지정한 배열의 크기를 임의로 변결 할 수는 없다.


#include <stdio.h>

int main() {
  int arr[5];
  int sum = 0, i;

  arr[0= 10;
  arr[1= 20;
  arr[2= 30;
  arr[3= 40;
  arr[4= 50;

  for(i = 0; i < 5; i++) {
    sum += arr[i];
  }

  printf("배열요소에 저장된 값의 합 : %d\n", sum);

  return 0;
}


MakeFile과 컴파일 Linux GCC 등의 내용을 좀 더 깊고 자세히 알고싶으면 한빛미디어 - 유닉스 리눅스 프로그래밍 필수유틸리티 책을 보시면 많은 도움이 되실껍니다.


정리가 좀 늦어서 죄송합니다.

부족한 내용 보신다고 고생하셨습니다.

728x90