-
[마이크로프로세서] 통합 개발 환경학점은행제/마이크로프로세서 2021. 1. 17. 13:17
make
- 여러개의 소그 파일로부터 자동으로 목적 파일을 만들 수 있도록 의존 관계와 파일 갱신 시간 정보로 특정 프로그램의 실행 지정
- make는 Makefile에 나열된 파일 간 의존 관계에 따라, 조건이 만족되었을 때 실행할 프로그램을 수행함
- 통합 개발 환경에서는 make와 Makefile을 이용하여 변경된 소스 프로그램을 자동으로 찾아서 필요한 컴파일러, 어셈블러, 링커 등의 프로그램을 실행함
- *어셈블리 언어로 만든 프로그램은 어셈블러를 통해서 기계어로 바꾼다
Makefile
- Makefile의 구조는 타깃, 선행조건, 명령으로 구성이 되어있음
- Makefile의 실행 규칙은 타깃 파일과 선행 조건 파일의 갱신 시간 비교
- 선행 조건이 더 최근이면 아래 줄에서 <탭> 문자 뒤에 있는 명령어 실행, 최근것을 우선순위로 둠
- 이 구조가 C언어와 상당히 비슷하기 때문에 C언어를 알고 있으면 좋음
타깃 . . . : 선행조건 . . .
<탭> 명령
<탭> .
<탭> .예시
- main.c, foo.c, def.h 가 모두 최근에 갱신된 파일이라고 가정해본다
- 깊이 우선 탐색 방법으로 명령을 실행함
all amin.elf main.hex (헥사)
main.o : main.c def.h
avr-gcc -c main.c
foo.o : foo.c def.h
avr-gcc -c foo.c
main.elf : main.o foo.o
avr-gcc -c amin.elf main.o foo.o (크로스 컴파일)
main.hex : main.elf
avr-objcony -o ihex main.elf main.hex
clean: -rm rf main.o foo.o main.elf프로그램 실행 순서
avr-gcc -c main.c
avr-gcc -c foo.c
avr-gcc -o main.elf main.o foo.o
avr-objcopy -o ihex main.elf main.hex
*-c 는 컴파일 해주는 [옵션]
최적화 옵션과 volatile 지시어
- 생성되는 타킷 코드의 크기를 작게 하는 것을 우선으로 함
- 옵션에 따라 크기와 실행속도가 달라짐
최적화 옵션의 특징
-00
- 최적화를 하지 않음
- 컴파일에 걸리는 시간을 줄이고, 소스 프로그램을 대응되는 명령어로 변환
- JTAG 인터페이스를 사용하여 디버깅할때는 예측된 값을 정확히 관찰할 수 있어야 하므로, 최적화 하지 않는것이 바람직함
-0 또는 -01
- 가장 기본적인 최적화 옵션
- 컴파일 시간과 컴파일할때 사용되는 메모리는 더 많이 필요
-02
- -01 옵션보다 더욱 많은 최적화
- 번호가 높아질수록 최적화가 더 많이됌
- gcc컴파일러는 메모리 - 속도 절충은 하지 않지만, 가능한 모든 최적화 기법을 수행할 수 있게 해줌
- 컴파일 과정에서 더 많은 시간이 소요됌 대신에 코드 크기는 줄어듬
- 실행 코드를 배포하기 위해서는 이 옵션이 바람직함
-03
- 최고의 최적화 옵션
- 모든 최적과 옵션을 활성화 하고 최적화 진행함
- inline 기능을 수행하여 간단한 함수 호출은 없애고 프로그램 내부로 포함
- main 함수 sub 함수가 있을때 왔다갔다하면서 속도가 생기지만 sub에 있는 함수를 main 함수로 옮겨서 속도를 높인다
- 크기는 커질 수 있지만 속도는 더 좋아진다
- 마이크로컨트롤러에서는 다운로드 파일 크기가 너무 커져 제어하기가 불편하기 때문에 바람직하지 않음
-0s
- 코드의 크기를 줄이는 목적으로 수행함 - > 속도가 향상됌
- 대부분 마이크로컨트롤러는 한정된 크기의 플래시 메모리를 사용하기때문에 이 옵션을 사용하는것이 바람직함
다운로드 될 프로그램 크기 비교
unsigned char sum;
unsigned char x;
int main(void)
{
unsigned char
i = 10;
x = 5;
return x + 2;
}
위의 C언어 소스를
- 최적화된 기계어 코드 옵션 -0s로 출력했을때 결과 : 224 bytes
- 최적화되지 않은 기계어 코드로 출력했을때 결과 : 250 bytes
volatile 지시어 선언으로 최적화 제외
- 최적화가 항상 바람직한것은 아님
- 최적화는 속도를 빠르게 하고 메모리 사용량을 줄일 수 있지만, 인터럽트를 사용하는 경우에는 자칫 원하지 않는 최적화가 실행될 수 있음
- 인터럽트를 주의해야함
- 프로그램이 설계와 다르게 작동할 수 있음
- 이러한 오류를 막기 위해서는 인터럽트 서비스 루틴에서 사용할 변수에 volatile 지시어를 선언해서 사용해야함
라이브러리
- 라이브러리는 미리 컴파일 된 목적파일의 집합
- 라이브러리 파일명은 보통 lib로 시작하고 확장자는 .a
- 일반 프로그래머도 아카이버 ar 명령으로 라이브러리를 만들어 사용함
라이브러리와 링커 옵션
- sin(), tan(), printf() 등과 같은 함수 GNU에서 컴파일된 형태로 묶어 라이브러리 모듈로 제공하고 있음
- 수학함수 라이브러리 사용 방법 : 원시 프로그램 앞 부분에 #include <math.h> 포함
- math.h 파일을 열어 주 프로그램에서 수학 함수 호출을 위한 프로토타입 포함
- 링커 옵션에 -lm 추가
- 링크 과정에서 libm.a 라이브러리 탐색
- 주 프로그램에서 호출한 수학 함수 라이브러리를 기계어와 연결
printf() 함수
- vfprintf() 함수를 기본으로 변형된 함수
- vfprintf() 함수는 % 문자 뒤에 d, c, u, f, o, x 등 매우 다양한 출력이 가능함
- 타깃 코드의 크기를 위한 3가지 링커 옵션
구분 기능 라이브러리 링커 옵션 파일크기 기본형 부동소수점에 대한 출력을 제외하고 모든 % 형식의 출력을 지원함 libc.a 없음 보통 최소형 매우 기본적인 정수형과 문자형에 대한 % 형식의 출력만을 지원 (문자열과 정수형) libprintnf_min.a -WI, -u, vfprintf -lprintf_min 작아짐 충족형 부동소수점에 대한 출력까지 포함한 모든 % 형식의 출력을 지원함 Libprintf_flt.a -WI, -u, vfprintf -lprintf_flt 커짐 Scanf() 함수
- vfscanf() 함수를 기본으로 변형된 함수
- vfscanf() 함수는 % 문자 뒤에 d, c, u, f, o, x 등 매우 다양한 출력이 가능함
- 타깃 코드의 크기를 위한 3가지 링커 옵션
구분 기능 라이브러리 링커 옵션 파일크기 기본형 부동소수점을 제외하고 모든 % 형식의 입력 지원 libc.a 없음 보통 최소형 기본형과 유사하고 [] 매칭 기능 제공 안됌 libscan_min.a -WI, -u, vfscanf -lscanf_min 작아짐 충족형 기본형에 부동소수점까지 % 형식 외 입력 지원, 문자 검색 길이 제한 없음 libscan_flt.a -WI, -u, vfscanf -lscanf_min 커짐 '학점은행제 > 마이크로프로세서' 카테고리의 다른 글
[마이크로프로세서] 엘리베이터 층 도착 원리 (1) 2021.03.06 [마이크로프로세서] 통합 개발 환경 구축 (0) 2021.01.20 [마이크로프로세서] 마이크로 컨트롤러 / 디지털 시스템 (0) 2021.01.15 [마이크로프로세서] ATmega128 명령어 실행 (0) 2021.01.15