답변:
모듈성은 당신의 친구입니다. 함수를 호출하는 함수를 호출하는 함수를 호출하여 함수를 호출하여 메인 루프를 작성하십시오. 메인 루프부터 시작하여 다음 레벨을 낮추고 스터브 기능을 만듭니다. 비어 있거나
function foo(){
;
}
또는 가짜 :
function read_temperature(){
return(95);
}
호출 수준이 계속 유지하는 데 필요한 모든 것을 반환하는 것 외에는 아무것도하지 않습니다. 해당 레벨이 작동하면 레벨을 낮추고 마찬가지로 스텁 함수를 호출하는 간단한 코드를 작성하십시오. 응용 프로그램이 작동 할 때까지 한 번에 기능을 점차적으로 해제하십시오.
잘못된 값을 반환하는 함수를 디버깅하거나 응용 프로그램의 나머지 부분에 영향을 미치지 않는 함수를 만들려면 스캐 폴딩을 만들 수 있습니다. 스캐 폴딩은 함수에 몇 가지 예제 값을 제공하고 함수 내에서 매개 변수 값을 인쇄하는 간단한 스케치입니다. 함수의 어떤 부분이 실패했는지에 대한 통찰력을 얻을 때까지 일부 중간 값. 심지어 터미널에서 값을 반환하라는 메시지를 표시하는 가짜 기능도 만들었습니다. (이 기술은 시스템이 우리 인간의 상대적 빙하 속도를 견딜 수있는 경우에만 작동 할 수 있습니다! 스캐 폴딩의 또 다른 용도)
스터 빙은 특히 하드웨어와 인터페이스하는 기능을 지원하는 데 효과적이므로 데이터 시트, 타이밍 문제 및 기타 멈출 수있는 기타 세부 사항 (부품이없는 것 등)에 들어가기 전에 응용 프로그램을 시작하기 시작할 수 있습니다. 당신의 진행 상황.
타이밍 문제에 대해 말하면, ISR의 출입과 같은 프로그램의 특정 지점에서 출력 핀을 토글하면 주파수 또는 듀티 사이클이 내부 타이밍에 대한 통찰력을 줄 수있는 Arduino 핀에서 구형파를 얻을 수 있습니다. 당신의 프로그램의. 직접 포트 I / O 형식, 예 :
PORTC ^= 0x01;
, 호출보다 타이밍이 왜곡됩니다 digitalWrite()
. 스코프가 편리하거나 주파수 및 / 또는 듀티 사이클을 측정 할 수있는 DMM 중 하나가있는 경우 유용합니다.
마찬가지로 아날로그 출력 핀을 사용하여 타이밍을 너무 많이 방해하거나 직렬 I / O 기능으로 코드를 부 풀리지 않고 프로그램 내부에서 미터로 수치를 출력 할 수 있습니다. 여기에서 직접 I / O 양식을 사용하십시오.
3 다른 기술 :
각 단계에서 천천히 테스트하여 한 번에 작은 버그 세트에만 직면하는 방식으로 프로그램의 기능을 구축하십시오.
다음과 같이 한 번에 섹션으로 작업 할 수 있도록 명령 인터프리터 주위에 프로그램을 빌드 하십시오 .
상당한 시간에 펄스 아웃하고 범위를 사용하십시오.
ARM 또는 다른 플랫폼과 같은 고급 도구 (AVR, 괜찮은 도구가있는 PIC)에서 나는 Arduino 디버깅 기능이 너무 제한적이라는 데 동의합니다. 그러나 진입률이 낮은 스타터 도구입니다.
Serial.print ()는 당신의 친구입니다. 내 특정 프로젝트 (대학)에 LED가 부착되어 있지 않았으므로 Serial.print ()입니다. 명령문을 통해 코드가 제대로 실행되는지 테스트하려면 보통 Serial.print ( "A"); 그런 다음 B, C 등으로 이동합니다. 디버그 문자를 예상 한 것과 비교합니다.
그 외에는 중단 점이나 코드 스테핑이 없습니다. Arduino는 AVR atmega 칩, 부트 로더 + 개발 환경 및 수많은 소프트웨어 라이브러리를 갖춘 보드 일뿐입니다. 불행하게도 부트 로더를 사용하면 디버깅 기능이 제한됩니다.
직접 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을 사용하지 못하게합니다.
LED 깜박임, 직렬 포트에서 인쇄, 한 번에 몇 줄의 작은 코드 부분 만 작성 및 디버깅
모듈화 할 수있는 시간이 있습니다. 예를 들어 C에서 호스트 컴퓨터, 다른 프로세서의 하드웨어에 닿지 않는 계산 기능을 개발하고 테스트 할 수있는 경우 테스트 벤치로 기능을 감싸서 입력을 공급하고 출력을 확인하는 등의 작업을 수행 할 수 있습니다.
또 다른 유사한 방법은 하나에 액세스 할 수있는 경우 명령어 세트 시뮬레이터를 사용하는 것일 수 있습니다 (그렇지 않은 경우 매우 교육적이고 보람있는 프로젝트입니다. 누군가가 프로세서의 Verilog 또는 VHDL 복제본 ( 예 : OpenCores )을 가지고 있다면 GHDL, Verilator 또는 Icarus Verilog를 사용해 볼 수 있습니다 . 관심있는 주변 장치를 포함 할 수있을 정도로 가까이있을 수 있으며 내부에서 발생하는 상황에 대한 신호 레벨 가시성을 얻을 수 있습니다.
아마도 완벽한 복제품은 아니지만 충분할 것입니다. Verilator를 사용하면 C / C ++에서 주변 장치를 정말 쉽게 만들 수 있으므로 AVR 장치가 연결된 모든 것을 시뮬레이션 할 수 있습니다.
UART 출력 및 깜박임 LED 및 / 또는 GPIO 라인 깜박임 및 오실로스코프 또는 전압계 사용. 미쳐 버리지 않는 열쇠는 작은 코드 섹션을 작성하고 디버깅하는 것입니다. 한 번에 10 줄을 작성하고 1000 줄보다 100 테스트를 수행하고 한 번에 모두 디버그하는 것이 좋습니다. 특히 대부분의 데이터 시트와 프로그래머가 하드웨어에 대한 참조 매뉴얼을 찾을 때 항상 올바른 것은 아닙니다. 일부 해킹은 항상 필요합니다.