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