답변:
먼저 무엇이 잘못 될 수 있는지 몇 가지 예를 살펴 보겠습니다.
void setup() {
int status;
pinMode(13, OUTPUT);
digitalWrite(13, status);
}
주석에서 Edgar Bonet이 지적한 것처럼 status
위 코드 와 같은 로컬 변수 는 C ++ 컴파일러에 의해 암시 적으로 초기화되지 않습니다. 따라서 위 코드의 결과는 불확실합니다. 이를 피하려면 항상 지역 변수에 값을 지정하십시오.
전역 변수와 정적 변수는 약간 다릅니다.
글로벌 및 정적 변수는 C 표준에 의해 0으로 초기화됩니다.
출처 : AVR Libc Reference Manual-질문과 대답-모든 변수를 초기화하지 않아야합니까?
즉, 코드에서 0으로 초기화하는 것에 대해 걱정할 필요가 없습니다. 실제로 초기화하면 메모리가 낭비 될 수 있으므로 실제로 피해야합니다. 0 이외의 값으로 만 초기화하십시오.
int array[10];
int v = array[100];
array[-100] = 10;
여기서 첫 번째 문제는 v에 할당 할 대상을 모르지만 -100의 위치 -100에 대한 할당으로 엉망인 것을 알지 못한다는 것입니다 array
.
void doSomething( void ) {
for (int i = 0; i < 1000; i++);
}
void setup ()
{
void (*funcPtr)( void );
funcPtr = &doSomething;
funcPtr(); // calls doSomething();
funcPtr = NULL;
funcPtr(); // undefined behavior
}
에 대한 첫 번째 호출 funcPtr()
은 실제로에 대한 호출 doSomething()
입니다. 두 번째와 같은 호출은 정의되지 않은 동작으로 이어질 수 있습니다.
예를 들어, RAM이 부족할 수 있습니다. 다른 것. 어쨌든, 나는 당신의 프로그램이 의도 한 방식이 아닌 계속 실행될 것이라고 생각합니다.
컴퓨터 시스템에서 이와 같은 문제는 일반적으로 다양한 수준에서 처리됩니다.
Arduino는 컴파일러에 대한 보호 기능이 제한적이며 다른 것은 없습니다. 좋은 소식은 멀티 태스킹이 아니기 때문에 영향을받는 유일한 프로그램은 귀하의 것입니다. 어쨌든 이러한 버그 중 하나라도 이상하게 동작합니다.
위에서 언급 한 모든 문제는 런타임 문제라고 가정합니다.
프로그램에 런타임 오류가 있으면 어떻게됩니까?
프로그램은 계속 진행되며 실행 오류는 런타임 오류의 부작용에 따라 달라집니다. 널 함수 포인터를 호출하면 프로그램이 알 수없는 위치로 이동합니다.
프로그램 실행이 중단됩니까?
아니, 그것은 당신이 의도하지 않은 일을하는 특별한 일이없는 것처럼 계속 진행될 것입니다. 재설정되거나 잘못 작동 할 수 있습니다. 일부 입력을 출력으로 변환하여 센서를 태울 수 있습니다 (그러나 가능성은 거의 없습니다 ).
Arduino에 오류가 무엇인지 알려주는 방법이 있습니까?
나는 그렇게 생각하지 않습니다. 앞서 말했듯이 보호 메커니즘은 없습니다. 언어에서 OS를 지원하지 않으며 OS도없고 하드웨어가 범위를 벗어난 메모리 액세스를 검사하지 않습니다 (부트 로더도 계산하지 않음). 프로그램에주의를 기울이고 자신 만의 안전망을 설정해야합니다.
보호 기능이 부족한 이유는 아마도 Arduino 컨트롤러가 너무 싸고 메모리가 너무 적고 너무 중요한 것을 실행하지 않아야하기 때문일 것입니다 (예, AVR은 일반적으로 사용하는 MCU를 사용하지 않는 곳에서 AVR에 고지 사항이있는 것 같습니다) 생명 유지 시스템의 Arduino).
MCU를 불규칙한 상태에서 얻을 수있는 메커니즘은 워치 독 타이머 입니다. 루프에서 반복적으로 실행되는 코드를 일정 시간 이상 실행하지 않는 코드를 구현하는 경우이 시간을 워치 독 기간으로 설정하고 타이머를 활성화 할 수 있습니다.
그런 다음 루프에서 타이머를 반복해서 재설정해야합니다. 종료되지 않는 조건 루프에서 코드가 정지되면 워치 독은 0으로 카운트되어 결국 MCU를 재설정합니다.
이렇게하면 데이터가 손실되지만 AVR WDT를 인터럽트 모드에서 실행하면 MCU를 재설정하기 전에 일부 데이터를 저장할 수 있습니다.
워치 독 타이머는 의도하지 않은 무한 루프로부터 코드를 보호 할 수 있습니다.
이와 같은 하드웨어 디버거가 필요합니다. 그러나 일반적으로 프로그램이 예상대로 작동하지 않는 것을 볼 수 있으며 문제를 식별하기 위해 해당 코드 섹션을 살펴 봐야합니다.
이 작업을 수행하는 일반적인 / 빠른 / 쉬운 방법은 print 문을 추가하여 변수의 값을 인쇄하거나 프로그램이 문제없이 코드의 해당 지점에 도달하도록하는 것입니다. 이렇게하면 문제를 더 격리 할 수 있습니다.
VisualMicro 에는 디버깅 기능이 내장되어 있다고 생각 합니다.
Arduino가 재부팅됩니다 (즉, 다시 시작 setup()
하고 loop()
).