Download presentation
Presentation is loading. Please wait.
1
Lamda on AVR C/C++ 최신 표준과 임베디드의 접목
2
목차 C99 C11 C++ on AVR Lambda on AVR (C++11)
3
C99
4
gcc의 –std= 옵션
5
gcc의 –std= 옵션
6
ANSI C… 반복문 변수 i 를 다른 이름으로 바꿔야 한다면? 1.
만약 1번에 해당하는 처리 코드가 1000줄이 넘어간다면? 2. 3. 4.
7
ANSI C… 얼핏 봐서는 맞는 코드 같지만.. 표준 타입을 ANSI C로 하면?? !!!!!!!!!!
8
ANSI C… 왜 이런 일이 발생할까? C99 표준 PDF, ‘주석’ 부분에서:
9
C99 표준 int, char 등 변수 선언이 함수 또는 블록의 도 입부에서만 일어나지 않아도 된다.
대표적인 예시는 반복문 index 변수 C99 Before C99
10
C99 표준 인라인 함수 키워드 (inline) 은 C99부터 정식 표준이 됨. 그 전까지는 컴파일러 확장으로 구현됨.
강한 타입 검사 및 #define 매크로 함수의 () 처리 블록에 서 오는 혼동 제거 gcc에서는 최적화 옵션이 –O1 이상이어야 작동. Before C99 C99
11
C99 표준 인라인 함수 예시
12
C99 표준 가변 길이 배열은 C99에서부터 정식으로 포 함된 기능 배열 길이를 가변적으로 설정할 수 있음
malloc() 을 사용하지 않음으로 가독성 향상
13
C99 표준 가변 길이 배열 예시
14
C99 표준 가변 길이 배열 예시
15
C11
16
C11 C99 이후의 C언어 표준 개정 불안정한 gets() 함수를 제거하고 gets_s() 함수를 표준에 편입.
<threads.h> 에서 스레드 지원. 그러나.. AVR은 8-bit 아키텍처이므로 C11의 혜택을 많이 받을 수는 없음.
17
C++ on AVR
18
C++ on AVR
19
C++ on AVR AVR Studio 5.0 ▲ avr-gcc v3.0 ▲ (WinAVR 버전 20100110에서 지원가능)
AVR Studio 4.xx 에서는 관련 프로젝트를 만들 수 없도록 되어 있음. Arduino 프로젝트에서 객체 지원을 위해 C++을 사용
20
C++ on AVR 입출력 스트림 (iostream, fstream) 객체를 지원하지 않음 템플릿 지원
STL(Standard Template Library)를 지원하지 않음. C 프로그램에 비해 바이너리 크기가 커질 수 있음.
21
C++ on AVR new, delete 연산자가 없음. 따라서 직접 만들어서 사용해야 함.
※출처 : AVRFreaks
22
C++ on AVR C99 표준에 적용된 대부분의 내용은 C++에서 무 리 없이 적용가능
C99 표준이 C++98 (C++ 의 98년도 표준) 에서 변 경된 내용을 C에 흡수한 것이기에 가능한 것. … for 문에서 int 형 변수 선언하기 적용 예시
23
C++ on AVR 객체 동적 할당이 아닌, 객체 변수 선언 의 경우, 생성자는 정상적으로 동작함.
main() 함수에서 LED 객체 변수를 선언하면 자동으로 생성자가 호출됨. LED 클래스 선언
24
C++ on AVR 인터럽트는 friend 함수로 해결하기 … 헤더 예시 소스 파일 예시
※예시를 위해 간략화 한 것으로, 실제 적용시에는 알맞게 변형하여 적용
25
C++ on AVR namespace (이름 공간) 사용 가능 C언어에서의 함수 충돌 방지 방법보다 좀 더 편하 다!
26
C++ on AVR namespace (이름 공간) 사용 가능 C언어에서의 함수 충돌 방지 방법보다 좀 더 편하 다!
27
C++ on AVR 템플릿 사용 가능 typename 템플릿을 사용할 때, 템플릿의 가지 수에 따라 바이너리 크기가 커지니 주의해야 함. namespace 가 선언된 헤더
28
LAMBda on AVR
29
C++11 ( or C++0x) C++98 -> C++03 이후 8년만의 C++ 개 정
언어 자체의 최적화, 컴파일 성능 향상 및 새로운 기능들을 추가
30
C++11 ( or C++0x) C++98 -> C++03 이후 8년만의 C++ 개 정
언어 자체의 최적화, 컴파일 성능 향상 및 새로운 기능들을 추가
31
C++11 ( or C++0x) C++11 의 대표적 키워드, auto
원래 auto는 변수를 레지스터로 처리할 지, 메모리로 처리할지 컴파일러가 알 아서 결정하라는 의미로, C++03 에 이 미 유명무실했던 키워드. C++11 에서는 이를 자동 타입 추론으 로 새로 정의함.
32
C++11 ( or C++0x) auto 키워드 예시 출처:
33
람다식 (Lambda Expression)
C++11 에서 도입된 새로운 함수 기술 방식. 그 자리에서 익명의 함수를 만들어내 기 때문에 작업 체인(task-chain) 을 직관 적으로 작성할 수 있음. C++11식 람다식은 C의 함수 포인터를 대체할 수 있음.
34
람다식 (Lambda Expression)
람다 식을 사용하려면, C++ 컴파일러 의 표준을 C++11 이상을 사용하도록 설정해야 함. -std=c++11 C++11 표준으로 컴파일 -std=gnu++11 C++11 표준에 GNU 확장을 적용하여 컴파일
35
람다식 (Lambda Expression)
람다 식 개요 ( [ <Refs> ] ( <Args> ) -> <Ret Type> { } ) <Refs> 외부 참조 변수. 클래스 내부에서 람다가 사용될 경우, 참조할 변수들을 지정할 수 있다. 함수 포인터를 대체하려면 여기에 아무것도 없어야 한다. <Args> 람다 함수의 매개 변수. <Ret Type> 반환형. 생략 가능. 생략 시 자동으로 맞는 형태로 고정. 컴파일러가 반환형을 추론할 수 없으면 컴파일 에러.
36
Lambda on AVR C 라이브러리 함수 qsort 의 람다식 예시 … 람다 식 적용 기존의 qsort 호출
37
편하다! Lambda on AVR qsort 에서 비교할 데이터 타입이 달라진 경우.. 기존의 qsort 호출
새로운 compare 함수를 작성하거나, 기존에 작성한 compare 함수의 정의를 찾아가면서 수정해야 함. 람다 식 qsort 의 람다 부분만 수정! 편하다!
38
결론
39
결론 C++ 은 언어 자체가 매우 방대하며, 제 대로 사용하기 위해서는 언어의 기능 을 약간 제한할 필요가 있다!
AVR은 하드웨어 제어를 하기 때문에 C 언어 수준으로 제한하여 사용하자. 그 외에 C++의 최신 표준을 적용하여 코드의 가독성을 높이자.
40
Q&A Extra..
41
Thank you!
42
컴파일러 확장 컴파일러 확장! 잠깐! 우리는 지금까지 C 에서 // 키워드를 주석으로 배웠는데??
-std=gnu90? –std=gnu99?
43
컴파일러 확장 컴파일러가 자체적으로 만들어낸 확장 C언어 표준에는 없는 것이지만, 컴파일 러가 추가적으로 만들어낸 확장
-std=gnu90? –std=gnu99? 컴파일러가 자체적으로 만들어낸 확장 C언어 표준에는 없는 것이지만, 컴파일 러가 추가적으로 만들어낸 확장 컴파일러마다 구현된 확장이 다르다. 표준을 지키지 않은 C코드가 컴파일러 를 타는 결정적인 이유 중 하나
44
컴파일러 확장 GCC 컴파일러 확장 중 C++ 스타일 주석 부분에서:
※원래대로라면 // 키워드 주석은 사용 불가능하나 GNU 확장 때문에 사용 가능!
45
컴파일러 확장 확장 중 대표격인 #pragma once ※같은 gcc라도 버전에 따라 #pragma once가
사용가능하지 않은 버전도 있다!
Similar presentations