2010-08-23 4 views
0

명령 버퍼에 명령을 쓰는 상황이 있습니다. 명령 버퍼의 명령이 실행될 때가되면 명령이 처리되어 UART를 다른 하위 시스템으로 보냅니다. 명령이 처리되면 UART로 보내야하는 데이터가 대기열에 저장되고 플래그가 발생합니다. 그런 다음 잠시 후 메인 루프가 플래그가 올라 왔는지 확인한 후 루프가 UART로 데이터를 보낸다. 그러나 명령이 처리되는 시간과 UART를 보낼 준비가 된 시간 사이에 배열이 손상됩니다. 내가 회로 내 디버거를 사용하고 중단 점을 설정했기 때문에 이것을 알 수 있습니다. 전 세계에서 무슨 일이 벌어지고 있으며 어떻게 해결할 수 있습니까? 배열이 지워집니다.

가 발생하는 예이다

오른쪽 처리 큐에 저장 (a[] 큐이다) 일 :

: UART를 송신 할 준비가되기 전에

a[0] = 0x3; 
a[1] = 0x6; 
a[2] = 0x9; 

오른쪽

a[0] = 0x3; 
a[1] = 0x6; 
a[2] = 0x0; 

또는 때로는,

a[0] = 0x3; 
a[1] = 0x0; 
a[2] = 0x0; 

행동은 임의적입니다. 때로는 하나의 바이트 만 손상되고 다른 시간은 2 바이트가됩니다.

+1

프로그래밍 언어? 코드 샘플? –

+0

더 이상의 정보가 없으면 버그는 문자 그대로 될 수 있습니다. 'a'가 안전하게 할당 되었습니까? 그 밖의 모든 것이 안전하게 할당 되었습니까? (예 : 다른 모든 포인터 값이 맞습니까?) 이상한 인터럽트가 점프하고 문제를 일으키고 있습니까? –

+0

체크 아웃 valgrind -이 같은 메모리 오류를 디버깅하는 데 매우 유용합니다. – alternative

답변

0

바이트를 감시합니다. 그렇게하면 디버거가 아무에게도 쓸 때 디버거가 멈 춥니 다.

+0

프로그래밍 언어는 C, MPLAB IDE, ICD2 및 마이크로 칩 PIC24FJGA110 사용 – user428583

0

소리가 메모리 낙서처럼 들립니다. 밖에서 뭔가가 예기치 않게 배열의 메모리에 액세스하고 있습니다. 이것은 해제 된 메모리에 대한 포인터가 NULL로 설정되지 않았거나 하드웨어가 동일한 메모리에 기록하지 못하기 때문일 수 있습니다. 더 많은 정보 없이는 말할 수 없습니다.