헥사뷰어
hexaview.c - 함수구성파일
hexaview.h - 함수원형선언 및 정의
main.c - main함수로 Hexaview 호출
hexaview.h 파일
파일 포맷 선언이다.
srec는 s-record 이며 모토로라회사의 저장방식이다
ihex 는 인텔사의 저장방식이다.
# Object files directory
OBJDIR = .
여기서 .은 현재디렉토리를 나타낸다.
# Optimization level, can be [0, 1, 2, 3, s].
OPT = s
#ifndef __hexaview__ /*define에는 _(언더바)를 붙인다.
원래 하나있었으므로 _2개*/
#define __hexaview__
/*위의 문장은 중복 인클루드를 막기위해 #ifndef(if not define)으로 시작했다*/
void PrintHexaNAscii(const unsigned char *buffer, int size);
//void hexaview(char*);
#endif //__hexaview__
//if로시작하면 끝에는 반드시 endif가 와야한다
//뒤의 주석을 적으면 어느 if의 끝인지 알기가 편해진다.
hexaview.c 파일
#include "hexaview.h"
void PrintHexaNAscii(const unsigned char *buffer, int size)
{
int bsize1=7;
int bsize2=16;
unsigned char buffer1[bsize1][bsize2];
int i,j,k;
printf( "┌────┬───────────────────────┬────────┐\n");
printf( "│ │ HEXA CODE │ ASCII CODE │\n");
printf( "│ ADDR ├───────────────────────┴────────┤\n");
printf( "│ │00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 0123456789ABCDEF│\n");
printf( "├────┼────────────────────────────────┤\n");
for(j=0;j<size;j++)
{
buffer1[0][j]=(*(buffer+j));
}
for(i=0;i<bsize1;i++)//주소출력부분
{
printf("│%08X│",buffer);
buffer=buffer+16;
for(k=0;k<bsize2;k++)//HEXA 출력부분
{
printf("%02X ",buffer1[i][k]);
}
for(k=0;k<bsize2;k++)//아스키코드출력부분
{
if((buffer1[i][k]>32)&&(buffer1[i][k]<127))
{
printf("%c",buffer1[i][k]);
}
else
{
buffer1[i][k]='.';
printf("%c",buffer1[i][k]);
}
}
printf("│\n");
}
printf( "└────┴────────────────────────────────┘\n");
}
|
컴파일 할때는
gcc -o main main.c hexaview.c
c파일 끼리 링크가 된다.
오브젝트 파일을 만들어서 하는방법
gcc -c main.c main.o 파일이 만들어진다.
gcc -c hexaview.c hexaview.o 파일이 만들어진다.
gcc -o main main.o hexaview.o
| 파일이 3개 이상이라도 3개다 링크하면 된다.
make build tool
vi makefile 로 makefile을 만든다
CC=gcc
all:cls version main.o hexaview.o
@echo ---------------
@echo Compiler : $(CC)
@echo ---------------
$(CC) -o main main.o hexaview.o
version:
@$(CC) --version
cls:
@clear
clean:
@rm -rf *.o
@rm -rf main
|
위 소스에서
@는 출력만보이게 하는 것이다.
echo compiler 로 하게되면
echo compiler
compiler
로 출력되게 된다. 하지만 앞에 @를 붙여주면
결과인 마지막줄의 compiler 만 나오게 된다.
ATmega128 의 makefile 분석
여기서는 #이 주석 부분을 나타낸다.
MCU = atmega128
여기서는 그냥 변수선언 이다. 이런방식은 스크립트 방식이라고 하며 HTML의 형식과 비슷하다.
타입은 문자열타입(스트링타입) 으로 나누며 문자가 들어간다.
# Processor frequency.
F_CPU = 16000000
ATMega128의 프로세서 주파수 설정이다.
# Output format. (can be srec, ihex, binary)
FORMAT = ihex
srec 는 s-record 라고 하여 모토로라사 의 저장 방식이며
ihex 는 인텔사의 저장 방식이다.
# Object files directory
OBJDIR = .
.은 현재 디렉토리를 가리킨다.
# Optimization level, can be [0, 1, 2, 3, s].
OPT = s
최적화 설정이다 숫자는 속도이며 s는 size라고 하여
용량 최적화를 한다.
# Debugging format.
DEBUG = dwarf-2
디버깅 포맷으로 elf, dwarf 등이 있다.
# Place -D or -U options here for C sources
CDEFS = -DF_CPU=$(F_CPU)UL
C디파인즈
# Place -D or -U options here for ASM sources
ADEFS = -DF_CPU=$(F_CPU)
A(어셈블리)디파인즈
CFLAGS = -g$(DEBUG)
CFLAGS += $(CDEFS)
CFLAGS += -O$(OPT)
CFLAGS += -funsigned-char
CFLAGS += -funsigned-bitfields
CFLAGS += -fpack-struct
CFLAGS += -fshort-enums
CFLAGS += -Wall
CFLAGS += -Wstrict-prototypes
#CFLAGS += -mshort-calls
#CFLAGS += -fno-unit-at-a-time
#CFLAGS += -Wundef
#CFLAGS += -Wunreachable-code
#CFLAGS += -Wsign-compare
CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst)
CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
CFLAGS += $(CSTANDARD)
CFLAGS += --save-temps
+=은 앞에 추가로 또 붙이겠다는 뜻이다.
CPPFLAGS += -Wall
W는 워닝이고 all은 워닝을 전부 출력하겠다는 말.
CC=gcc
all:cls version main.o hexaview.o
@echo ---------------
@echo Compiler : $(CC)
@echo ---------------
$(CC) -o main main.o hexaview.o
.o 파일을 컴파일 하는 명령문인데 .o파일이 없으면 자동으로
만들어서 실행하게된다. 한번 만들어지면 다음에는 다시 만들지 않고
이미 만든 파일을 가지고 컴파일을 한다.
최종컴파일 이후에 수정되었으면 다시 컴파일 한다.
(실행파일 이후에 소스수정 유무를 확인하여 컴파일을 결정)
지능화 컴파일러
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |