본문 바로가기

C언어

11월 23일 C언어 헥사뷰어,make build tool

헥사뷰어

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파일이 없으면 자동으로

만들어서 실행하게된다. 한번 만들어지면 다음에는 다시 만들지 않고

이미 만든 파일을 가지고 컴파일을 한다.

최종컴파일 이후에 수정되었으면 다시 컴파일 한다.

(실행파일 이후에 소스수정 유무를 확인하여 컴파일을 결정)

지능화 컴파일러