디버깅하려고 할 때 코드가 사라지는 이상한 버그가 있습니다. 내 타이머 인터럽트에서 중단 점을 설정할 때 Schrödinger 버그가 사라짐
나는 이런 식으로 뭔가가 (항상 시스템 시세를 실행) : 내 메인 루프에if (a && lot && of && conditions)
{
some_global_flag = 1; // breakpoint 2
}
을 나는 메인 루프에서이 조건을 때 호출되지 않습니다
if (some_global_flag)
{
some_global_flag = 0;
do_something_very_important(); // breakpoint 1
}
이 타이머의 조건이 충족되었다고 생각합니다. 조건은 외부 (포트 핀, ADC 결과 등)입니다. 먼저 위치 1에 중단 점을 넣습니다. 결코 중단되지 않습니다.
이를 확인하기 위해 중단 점 nr을 넣습니다. 2 줄에 some_global_flag = 1;
,이 경우 코드 작동합니다 : 조건이 모두 참일 때 트리거됩니다.
업데이트 1 :
if (a && lot && of && conditions)
{
some_global_flag = 1; // breakpoint 2
}
if (some_global_flag)
{
#asm("NOP"); // breakpoint 3
}
:
일부 타이밍 조건이 담당하고, 타이머의 if
디버깅하지 않고 실행하면 입력되지 않습니다 여부를 연구하기 위해, 나는 내 타이머에 다음을 추가
플래그는 코드의 다른 곳에서는 사용되지 않습니다. 그것은 RAM에 있으며 RAM은 처음에 0으로 지워집니다.
이제 모든 중단 점을 사용하지 않도록 설정하거나 주에서 중단 점 1 만 사용하도록 설정하면 코드가 제대로 작동하지 않고 함수가 실행되지 않습니다. 그러나 NOP에서 중단 점 3 만 활성화하면 코드가 작동합니다! 중단 점이 트리거되고 계속 된 후 함수가 실행됩니다.
타이머 인터럽트의 시작 부분에 "SEI"에 의해, 인터럽트였다 업데이트 2
(그것은 가시 가청 출력을 가지고, 그래서 실행하는 경우는 명백하다). 나는 그 라인을 삭제했으나 그 행동은 눈에 띄는 방식으로 바뀌지 않았다.
업데이트 3 : 어떤 외부 메모리를 사용하지 않는
. 플래시의 한계에 매우 가깝기 때문에 컴파일러에서 최대 크기 최적화가 있습니다.
컴파일러 (CodeVision)가 책임 져야합니까? 아니면 제가 잘못 했습니까?
중단 점을 설정하는 대신 로깅을 추가 할 수있는 방법이 있습니까? 나는 보통 그것을 제안하는 것을 망설이지 만,이 경우에는 시스템에 덜 어지럽 힐 수 있습니다. 특히, 내가 기록 할 것은 타이머 인터럽트 코드를 통과 할 때마다 조건의 상태입니다. –
some_global_flag는 어떻게 정의됩니까? 'volatile int some_global_flag'을 사용하고 있습니까? – DipSwitch
외부 메모리를 사용하고 있습니까? 아니면 내부 SRAM입니까? 정확히 어떤 칩을 사용하고 있습니까? – DipSwitch