Arduino 스케치를 어떻게 디버깅합니까?


10

나는 최근에 Arduino를 코딩하기 시작했습니다. 그리고 코드의 이러한 버그가 나를 죽이고 있습니다. Arduino에는 하드웨어 디버거가 없으므로 serial.print ()가 유일한 방법입니다. Arduino 코드를 디버깅하기 위해 구현하는 방법 / 실습은 무엇입니까?


IDE 및 디버거 도구 는 playground.arduino.cc/Main/DevelopmentTools 를 참조하십시오
Dallo

답변:


8

모듈성은 당신의 친구입니다. 함수를 호출하는 함수를 호출하는 함수를 호출하여 함수를 호출하여 메인 루프를 작성하십시오. 메인 루프부터 시작하여 다음 레벨을 낮추고 스터브 기능을 만듭니다. 비어 있거나

function foo(){
    ;
}

또는 가짜 :

function read_temperature(){
    return(95);
}

호출 수준이 계속 유지하는 데 필요한 모든 것을 반환하는 것 외에는 아무것도하지 않습니다. 해당 레벨이 작동하면 레벨을 낮추고 마찬가지로 스텁 함수를 호출하는 간단한 코드를 작성하십시오. 응용 프로그램이 작동 할 때까지 한 번에 기능을 점차적으로 해제하십시오.

잘못된 값을 반환하는 함수를 디버깅하거나 응용 프로그램의 나머지 부분에 영향을 미치지 않는 함수를 만들려면 스캐 폴딩을 만들 수 있습니다. 스캐 폴딩은 함수에 몇 가지 예제 값을 제공하고 함수 내에서 매개 변수 값을 인쇄하는 간단한 스케치입니다. 함수의 어떤 부분이 실패했는지에 대한 통찰력을 얻을 때까지 일부 중간 값. 심지어 터미널에서 값을 반환하라는 메시지를 표시하는 가짜 기능도 만들었습니다. (이 기술은 시스템이 우리 인간의 상대적 빙하 속도를 견딜 수있는 경우에만 작동 할 수 있습니다! 스캐 폴딩의 또 다른 용도)

스터 빙은 특히 하드웨어와 인터페이스하는 기능을 지원하는 데 효과적이므로 데이터 시트, 타이밍 문제 및 기타 멈출 수있는 기타 세부 사항 (부품이없는 것 등)에 들어가기 전에 응용 프로그램을 시작하기 시작할 수 있습니다. 당신의 진행 상황.

타이밍 문제에 대해 말하면, ISR의 출입과 같은 프로그램의 특정 지점에서 출력 핀을 토글하면 주파수 또는 듀티 사이클이 내부 타이밍에 대한 통찰력을 줄 수있는 Arduino 핀에서 구형파를 얻을 수 있습니다. 당신의 프로그램의. 직접 포트 I / O 형식, 예 :

PORTC ^= 0x01;

, 호출보다 타이밍이 왜곡됩니다 digitalWrite(). 스코프가 편리하거나 주파수 및 / 또는 듀티 사이클을 측정 할 수있는 DMM 중 하나가있는 경우 유용합니다.

마찬가지로 아날로그 출력 핀을 사용하여 타이밍을 너무 많이 방해하거나 직렬 I / O 기능으로 코드를 부 풀리지 않고 프로그램 내부에서 미터로 수치를 출력 할 수 있습니다. 여기에서 직접 I / O 양식을 사용하십시오.


6

Serial.print ()를 사용하고 LED를 깜박입니다.

그것은 당신이 할 수있는 모든 것입니다.

또한 코드를 읽기 쉽고 이해하기 쉽도록합니다. 간단한 단계로 분류하고 각 단계에 대한 함수를 작성하여 정확한 이벤트 순서를 볼 수 있습니다.


5

3 다른 기술 :

  • 각 단계에서 천천히 테스트하여 한 번에 작은 버그 세트에만 직면하는 방식으로 프로그램의 기능을 구축하십시오.

  • 다음과 같이 한 번에 섹션으로 작업 할 수 있도록 명령 인터프리터 주위에 프로그램을 빌드 하십시오 .

  • 상당한 시간에 펄스 아웃하고 범위를 사용하십시오.


3

비주얼 마이크로 Visual Studio를위한 플러그인을 제공 아두 이노 디버그 . 소스 코드 추적을 포함하고 중단하면 표현식 및 변수를 "감시"및 / 또는 수정할 수 있습니다.

여기에 이미지 설명을 입력하십시오


1
이것은 코드에 삽입 된 자동 생성 된 직렬 인쇄를 통해 수행됩니다.
per1234

직렬 또는 wifi 인쇄 및 읽기가 실제 코드가 아닌 코드의 임시 사본에 삽입되는 것을 제외하고는 옳습니다! 그것은 모두 visualmicro.com 문서에 명확하게 설명되어 있으며 하드웨어 디버거가있는 사람들 (일반적으로 Uno 등은 아님)도 지원됩니다. 각 방법에는 고유 한 장점과 단점이 있습니다.
Visual Micro

에서 아두 이노를위한 디버거 : "그것은 코드를 단계별로 지원하지 않았고 그것은 디버거와 통신 할 빌드하기 전에 프로그램에 삽입 숨겨진 코드를 기반으로했다."
피터 Mortensen

맞습니다. 사용자가 직렬 인쇄를 추가 할 필요가 없으며 CPU 실행 중에 이름이 지정된 var를 업데이트 할 수 있으며 그래프 및 디지털 핀 등이 표시됩니다. 하드웨어 디버거와는 다르지만 빠르고 쉽고 다른 이점이 있습니다. 이것은 visualmicro.com에 잘 문서화되어 있으므로 읽어보십시오. 보드를 gdb를 지원하거나 atmel studio를 사용하는 경우 물론 다른 디버그 옵션이 있습니다. 그것은 모두 당신의 전문성과 당신이 가진 하드웨어에 달려 있습니다. Arduino가 정품 인 경우 Atmel 스튜디오에서 arduino와 atmel 디버그 또는 sim을 결합 할 수 있습니다.
Visual Micro

2

ARM 또는 다른 플랫폼과 같은 고급 도구 (AVR, 괜찮은 도구가있는 PIC)에서 나는 Arduino 디버깅 기능이 너무 제한적이라는 데 동의합니다. 그러나 진입률이 낮은 스타터 도구입니다.

Serial.print ()는 당신의 친구입니다. 내 특정 프로젝트 (대학)에 LED가 부착되어 있지 않았으므로 Serial.print ()입니다. 명령문을 통해 코드가 제대로 실행되는지 테스트하려면 보통 Serial.print ( "A"); 그런 다음 B, C 등으로 이동합니다. 디버그 문자를 예상 한 것과 비교합니다.

그 외에는 중단 점이나 코드 스테핑이 없습니다. Arduino는 AVR atmega 칩, 부트 로더 + 개발 환경 및 수많은 소프트웨어 라이브러리를 갖춘 보드 일뿐입니다. 불행하게도 부트 로더를 사용하면 디버깅 기능이 제한됩니다.


0

serial.print보다 통제 된 기능을 사용하기 위해 전역 부울 변수를 정의하여 디버그를 켜고 끌 수 있습니다. 모든 행은 디버그 플래그가 ON 인 경우에만 실행 serial.print되는 if명령문 내에 랩됩니다 . 이 방법을 사용하면 완료된 후에도 디버그 라인을 코드에 그대로 둘 수 있지만 나중에 디버그 플래그를 OFF로 설정해야합니다.


0

직접 serial.print보다 나은 매크로를 사용하십시오. 예:

#ifdef TRACE1
#define trace1(s) serial.print(s)
#define traceln1(s) serial.println(s)
#else
#define trace1(s)
#define traceln1(s)
#endif

다음과 같이 사용하십시오.

function doIt(param1, param2) {
    trace1("->doIt("); trace1("param1: "); trace1(param1); trace1(" param2: "); trace1(param2); traceln1(")");

    ...

    traceln1("<-doIt");
}

(#ifdef TRACE2 ...)세부 사항 이 다른 추적 레벨이 다를 수 있습니다 .

"F"매크로를 사용할 수도 있습니다 (trace1(F("param1"));). "F"매크로는 문자열이 매우 제한된 양의 SRAM을 사용하지 못하게합니다.


0

LED 깜박임, 직렬 포트에서 인쇄, 한 번에 몇 줄의 작은 코드 부분 만 작성 및 디버깅

모듈화 할 수있는 시간이 있습니다. 예를 들어 C에서 호스트 컴퓨터, 다른 프로세서의 하드웨어에 닿지 않는 계산 기능을 개발하고 테스트 할 수있는 경우 테스트 벤치로 기능을 감싸서 입력을 공급하고 출력을 확인하는 등의 작업을 수행 할 수 있습니다.

또 다른 유사한 방법은 하나에 액세스 할 수있는 경우 명령어 세트 시뮬레이터를 사용하는 것일 수 있습니다 (그렇지 않은 경우 매우 교육적이고 보람있는 프로젝트입니다. 누군가가 프로세서의 Verilog 또는 VHDL 복제본 ( 예 : OpenCores )을 가지고 있다면 GHDL, Verilator 또는 Icarus Verilog를 사용해 볼 수 있습니다 . 관심있는 주변 장치를 포함 할 수있을 정도로 가까이있을 수 있으며 내부에서 발생하는 상황에 대한 신호 레벨 가시성을 얻을 수 있습니다.

아마도 완벽한 복제품은 아니지만 충분할 것입니다. Verilator를 사용하면 C / C ++에서 주변 장치를 정말 쉽게 만들 수 있으므로 AVR 장치가 연결된 모든 것을 시뮬레이션 할 수 있습니다.

UART 출력 및 깜박임 LED 및 / 또는 GPIO 라인 깜박임 및 오실로스코프 또는 전압계 사용. 미쳐 버리지 않는 열쇠는 작은 코드 섹션을 작성하고 디버깅하는 것입니다. 한 번에 10 줄을 작성하고 1000 줄보다 100 테스트를 수행하고 한 번에 모두 디버그하는 것이 좋습니다. 특히 대부분의 데이터 시트와 프로그래머가 하드웨어에 대한 참조 매뉴얼을 찾을 때 항상 올바른 것은 아닙니다. 일부 해킹은 항상 필요합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.