HardWare
오늘의 수업 내용
NOR 래치회로와 NAND 래치회로의 동작을 이해한다.
S-R 플립플롭, D플립플롭, J-K플립플롭, T플립플롭의 동작을 이해한다.
NOR GATE 래치회로
NOR GATE를 이용한 기억회로 회로도와 입력과 출력값
Logic State : 입력
Logic Probe : 출력
* 입력 값을 설정한 후 회로에 전원을 인가해야한다.
NAND GATE 래치회로
NAND GATE를 이용한 기억회로 회로도와 입력과 출력값
Logic State : 입력
Logic Probe : 출력
* 입력 값을 설정한 후 회로에 전원을 인가해야한다.
SoftWare
오늘의 수업 내용
MakeFile의 분석과 MakeFile의 생성과 사용
MakeFile 분석
SRC는 소스의 약자
SRC = $(TARGET).c
밑의 내용들은 옵션을 뜻하는 내용인데 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.
DEBUG = dwarf-2
운영체제별 컴파일 형식
Windows Format = PE Format
# 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.
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
CSTANDARD = -std=gnu99
# Place -D or -U options here for C sources
#include <stdio.h> |
#include <stdio.h> |
# Place -D or -U options here for ASM sources
ADEFS = -DF_CPU=$(F_CPU)
# Place -D or -U options here for C++ sources
CPPDEFS = -DF_CPU=$(F_CPU)UL
#CPPDEFS += -D__STDC_LIMIT_MACROS
#CPPDEFS += -D__STDC_CONSTANT_MACROS
누적 C Flag
#---------------- 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 += -Wstrict-prototypes + Wstrict-prototypes Flag 누적
#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 += $(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)
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 등의 내용을 좀 더 깊고 자세히 알고싶으면 한빛미디어 - 유닉스 리눅스 프로그래밍 필수유틸리티 책을 보시면 많은 도움이 되실껍니다.
정리가 좀 늦어서 죄송합니다.
부족한 내용 보신다고 고생하셨습니다.
'코스웨어 > 15년 스마트컨트롤러' 카테고리의 다른 글
스마트컨트롤러 김태현입니다 (0) | 2015.03.20 |
---|---|
AVR LCD관련 소스입니다. (0) | 2015.03.20 |
20150319-1번-강경의-전자시계&LCD (16) | 2015.03.19 |
소스 인사이트 오픈프로젝트 팅김 현상 고치실 줄 아시는 분 있으신가요 ?? (11) | 2015.03.18 |
20150311-31번-차윤도-디코더, 전역변수 (11) | 2015.03.11 |
2015.03.10(화)-30번-주재민 (6) | 2015.03.11 |
20150309-29번-주보건-논리회로 반가산기 전가산기 함수의 사용과 분할컴파일 source insight 사용 (12) | 2015.03.09 |
H/W 수업 관련 자료입니다. (1) | 2015.03.09 |