아두이노, 메이커

아두이노 Arduino 코딩 기초 규칙과 네이밍시 규칙

탁이 2019. 3. 11. 06:56

시작하기

Arduino 관련 포스팅을 생각하고 있기 때문에 먼저 코딩 규칙 및 네이밍 규칙을 살펴 보았습니다. 개인적으로는 별로 납득할 수없는 규칙도있었지만 정리해 보았습니다.

목차

  1. Arduino example 스타일 가이드
  2. Arduino API 스타일 가이드
  3. 기타 표준 라이브러리에 기반한 규칙

1. Arduino example 스타일 가이드

반드시 이 방법으로 코딩 할 필요가 없지만 코드를 모든 수준의 사용자 명료하게 보이고 싶은 경우에 유용합니다. 이들은 지침이며 명확하고 잘 정리 된 규칙은 없습니다. 지침 중 일부는 서로 충돌 할 수 있습니다. 

상세한 내용은 API 스타일 가이드 를 참조하십시오.

setup ()와 loop ()의 위치

setup()과 loop()프로그램의 처음에 기재한다. 
모든 함수가이 두 함수에서 호출되기 때문에 초보자도 프로그램의 개요를 파악하기 쉽다.

코멘트

  • 모든 변수와 상수 선언에 변수가 무엇을 할 것인가 논평한다.
  • 모든 코드 블록에 (있다면 블록 앞에) 논평한다.
  • 모든 for 문에 댓글한다.

if 문

항상 블록 포맷을 사용한다.

if  ( somethingIsTrue  ==  TRUE )  { 
   doSomething ; 
}

다음과 같이하지 않는다.

if  ( somethingIsTrue )  doSomething ;

포인터

포인터의 사용을 피한다.

#define

#define의 사용을 피한다.

변수

  • 한글자 변수 이름은 피한다.
  • val과 pin같은 변수 이름은 피한다. buttonState과 switchPin같이 표현한다.
  • 핀 명칭이나 변하지 않는 값을 정의 할 때 const int 형을 사용한다. #define만큼 귀찮은 것은 아니지만, 변수와 상수의 차이는 알 수있다.
  • uint8_t 등보다 가능한 boolean, char, byte, int, unsigned int, long, unsigned long, float, double, string, array, void 등의 변수 형을 사용한다. 이 문서에 설명되어 있으며, 이름이 너무 간단하지 않습니다.
  • 다음과 같이 사용자에게 혼란 번호의 조합은 피한다.
pin1  =  2 
pin2  =  3 
etc .

핀 번호 매기기를 다시 시작하려면 다음과 같이 배열의 사용을 생각한다.

int  myPins []  =  {  2 ,  7 ,  6 ,  5 ,  4 ,  3  };

이렇게하면 배열 요소를 사용하여 새로운 핀 번호를 참조 할 수있다.

digitalWrite ( myPins [ 1 ],  HIGH );   // turns on pin 7

또한 다음과 같이 시퀀스에서 모든 핀을 ON / OFF 할 수있게된다.

for  ( int  thisPin  =  0 ;  thisPin  <  6 ;  thisPin ++ )  { 
   digitalWrite ( myPins [ thisPin ,  HIGH ); 
   delay ( 500 ); 
   digitalWrite ( myPins [ thisPin ,  LOW ); 
   delay ( 500 ); 
}

시작 코드 표현

좋은 제목 블록 :

/ *
    스케치 제목

    제어 내용을 간결하게 표현한다. 각 핀에 연결된 구성 요소를 참조한다.

    The circuit :
    * 각 input에 연결되어있는 구성 요소의 목록
    * 각 output에 연결되어있는 구성 요소의 목록

    Created 연월일
    By 저자
    Modified 날짜
    By 저자

    http : //url/of/online/tutorial.cc

* /

2. Arduino API 스타일 가이드

이것은 라이브러리 API 표기의 스타일 가이드입니다. 이들 중 일부는 고급 프로그래밍 관례에 위배됩니다. 그것을 감안하고 많은 초보자가 Arduino를 가능한 한 쉽게 시작할 수 있도록 만들었습니다. 

완전한 일상적 단어를 사용

함수 이름이나 변수 이름을 짧게 사용. 기술적 인 것이 아니라 일상 용어를 사용한다. 익숙한 개념의 일반적 지식에 해당하는 용어를 선택한다. 전문 지식을 전제로하지 않는다. 

예를 들어, 이것이 Arduino에서 pwm()대신 analogWrite()를 사용하는 이유이다. 그러나 일반적으로 사용되고 있는 기본적인 명칭이하면 약자는 허용 할 수있다. 

예를 들어 “HTTP”은 비교적 잘 알려져 있으며, “SPI”는 프로토콜 이름으로 효과적이다 ( “serial-peripheral interface”는 분명 너무 오래). (프로토콜로 “TWI”또는 “I2C”일반적으로 알려져 있기 때문에 “Wire”는 논증이었다).

프로그래밍과 일상생활서 다른 의미를 가진 단어는 피해야

예를 들어 "에러" 는 포로그래머에게는 무언가 오류가 발생했을 때의 통지이지만, 일반적으로는 "나쁜" 것을 의미한다.

설치되어있는 코어 라이브러리와 스타일을 사용

  • 입력의 read에 read () 출력의 write에 write ()를 사용한다. 예를 들어 digitalRead() , analogWrite()등.
  • 바이트 스트림을 취급하는 경우 Stream.h과 Print.h 라이브러리를 사용한다. 그것이 적절하지 않은 경우는 적어도 모델로 그 API를 사용하도록한다. 
  • 네트워크 애플리케이션의 경우, 기본적으로 Client 및 Server 라이브러리를 사용한다.
  • 라이브러리의 인스턴스를 초기화하기 위해 일반적으로 각종 설정을 포함 begin ()를 사용한다. 그것은 종료에 end ()를 사용한다.

함수 이름에 스네이크 케이스가 아닌 lower 카멜 케이스를 사용

예를 들어 analogRead는 analog_read이 아니다. myNewFunction는 my_new_function이 아니다. 

LONG_CONSTANT_NAMES_FULL_OF_CAPS는 읽기 어렵다

(LONG_CONSTANT_NAMES_FULL_OF_CAPS : 대문자 긴 상수 이름) 
가능하면 간단하게 한다.

bool 형식 인수를 피하도록 한다

대신, 그 차이를 표현하는 이름을 가진 다른 2 함수의 제공을 검토한다.

포인터의 지식을 전제로하지 않는다

C 언어 초보자가 가장 큰 장애가 우연히 & 나 * 에서 기인한다. 따라서 API중 그들을 피할 수 있다면 그렇게한다. 예를 들어, 다른 방법으로 * 표기 대신 배열 표기법을 사용하여 참조로 전달한다.

  void  printArray (  char *  array );

다음으로 대체된다.

 void  printArray ( char []  array );

const char 같은 구조를 사용하여 포인터 전달을하고있는 라이브러리도 일부 있지만, 그들을 전달을 사용자에게 요구하는 것은 피하고있다. 예를 들어, 다음보다

 foo . readAccel ( & x ,  & y ,  & z );

다음과 같이 쓰고있다.

 xAxis  =  adxl . readX (); 
 yAxis  =  adxl . readY (); 
 zAxis  =  adxl . readZ ();

시리얼 통신

시리얼 통신을 사용하는 경우 사용자는 하드 코딩의 “Serial” 보다 모든 Stream 개체를 지정할 수 있는 여지가 있다. 이것은 라이브러리에 Mega이나 Due 모든 직렬 포트에 호환성을 갖도록 SoftwareSerial 같은 대체 인터페이스를 사용할 수있다. Stream 개체 라이브러리 생성자 또는 begin () 함수 (포인터가 아닌 참조로) 전달할 수있다. 

바이트 스트림 통신을 제공하는 라이브러리를 쓸 때, Arduino의 Stream 클래스를 상속하면 Stream 개체를 받아들이는 모든 라이브러리에서 사용할 수있다. 만약에 가능하다면, read ()가 즉시 버퍼 내의 데이터에 액세스하고 수신 대기가 발생하지 않도록 수신 데이터를 버퍼링한다. 만약에 가능하다면 write ()는 송신 버퍼에 데이터를 저장해야하지만, 버퍼가 전체 전송 터를 바로 저장할 공간을 가지고 있지 않은 경우는 기다려야한다. 대기 중에 yield () 함수가 호출 될 필요가있다.

Adafruit에서 라이브러리 예
https://github.com/adafruit/Adafruit-BMP085-Library 
https://github.com/adafruit/DHT-sensor-library

3. 기타 표준 라이브러리에 기반한 규칙

다음으로는 Arduino 표준 라이브러리를 보고 생각난 규칙을 정리해 보았습니다. 이번 픽업 규칙이 모든 다음 Arduino 표준 라이브러리에 해당하는 뜻이 아닙니다.

* SD 
* USBHost 
* Ethernet2 
+ α

인코딩 (문자 코드)

UTF-8

들여 쓰기

  • 문자 타입 : 공간
  • 들여 쓰기 : 2

수입 명세서

  • 설명 부분 : 파일의 시작
  • 선언 순서 : 다음의 순서로 그룹화
    • 표준 라이브러리
    • 타사 관한
    • 로컬 응용 프로그램 / 라이브러리에만 국한

명명 규약

  • 단어의 선택은 원칙적하지
  • 약어의 취급 : 약어로 사용되고있는 대문자를 그대로 이름으로 대문자로 표현

패키지 이름

  • 기본적으로 upper 카멜 케이스를 사용
  • 그러나 라이브러리의 “examples” “src” “extras” “utility”는 모두 소문자로 표현 ※아마도 이것은 관습인 것 같아요

파일 이름

  • upper 카멜 케이스를 사용
  • public 클래스는 클래스 당 파일로
  • 예외로 private 클래스는 public 클래스 파일 내에 포함해도 좋다

클래스 이름

  • 기본적으로 “파일 이름”+ “Class”로
  • 클래스 이름이 길어지는 경우 파일 이름과 동일해도 좋다

멤버 변수 이름

“_”+ lower 카멜 케이스 또는 로어 카멜 케이스 중 하나를 사용

구조체 이름

  • 파 upper 카멜 케이스 또는 모두 대문자 스네이크 케이스 중 하나를 사용
  • 요소 이름은 lower 카멜 케이스를 사용

상수 정의 이름

모두 대문자 snake 케이스를 사용

열거 형 (enum) 이름

  • upper 카멜 케이스를 사용
  • 요소 이름은 모두 대문자 snake 케이스를 사용

전역 변수 이름

upper 카멜 케이스를 사용

로컬 변수 이름

모든 문자의 snake 케이스 또는 lower 카멜 케이스 중 하나를 사용

결론

Arduino 코딩 규칙과 명명 규칙을 살펴 보았습니다. 표준 라이브러리도 저자 및 출처가 다르기 때문에 규칙이 통일되어 있지 않다는 것이 솔직한 감상이었습니다. 

참조 URL