2013-10-17 2 views
1

하드웨어 디자인 그룹과 함께 인터럽트 핸들러에서 작업 중이며 버그가 어디에 있는지 파악하려고합니다. 나는 5khz에서 SPI 버스를 통해 칩을 읽고있다. 칩은 4 바이트를로드하고 데이터 준비 핀을 트리거합니다.리눅스 인터럽트 핸들러에 작은 지연을 생성하십시오.

내 인터럽트 처리기가 깨어나서 SPI 버스에서 4 바이트를 읽어 버퍼에 저장합니다. 이상하게도 충분하지만 모든 17 번째 읽기는 4 바이트의 0을 제공합니다. 이는 옳지 않습니다. 우리가 탐구하고있는 옵션 중 하나는 칩이 데이터 준비 신호를 보낼 때 항상 실제로 준비되지 않는다는 것입니다.

그래서 나는 인터럽트 처리기에서 잠을 잘 수 없다는 것을 알고 있지만, 10 또는 20 마이크로 초의 지연을 도입하려고합니다. 지금은 100,000으로 계산 된 인터럽트를 처리하는 for 루프가있다. 나는 어떤 변화도 보지 못했기 때문에 누군가가 바쁜 대기를위한 더 나은 기술을 가지고 있는지를 알 수있을 것이라고 생각했습니다. 아니면 얼마나 오래 걸릴지, 또는 컴파일러가 단순히 모든 것을 최적화하는 것인지에 대해 잘 모르겠습니다.

+1

디지털 분석기를 SPI 라인에 연결하십시오. 오류가 발생한 데이터가 실제로 데이터 준비가 완료된 후에 반환되는지 확인하십시오. 문제의 근본 원인을 더 잘 분리하지 않는 한, 지연 등으로 언제 까지나 슬쩍 할 수 있습니다. –

답변

1

임베디드 장치에서 임의의 의사 난수 생성 라이브러리에 액세스 할 수 있는지는 알 수 없지만 많은 수의 곱셈에 이어 mod를 사용하면 몇 사이클이 걸릴 것입니다. 단순히 1을 더하는 대신 (하드웨어 레벨에서 매우 빠르며 컴파일러는 정적 인 횟수를 수행하고 있기 때문에 이동에 최적화 할 수 있습니다.) 난수 시드를 사용하십시오 (시스템이 시간 시계에 액세스 할 수 있습니까?) 가능한 경우 많은 곱셈, 모듈러스 또는 계승 연산을 수행하고, 음수 나누기도 영원히 필요합니다. 기억 부서는 하드웨어 수준에서 가장 오래 걸립니다. 이점을 이용하십시오.

0

귀하의 컴파일러가 간단한 루프를 제거한다고 가정합니다.

휘발성 물질을 사용해야합니다.

volatile unsigned long i; 
for (i=0;i< 1000000; i++) 
    continue; 

본인은 문제를 해결하거나 도움을주지 않는다고 가정합니다.

나는 SPI 주변 장치가 버그을 가지고 있다고 믿을 수 없다.

하지만 SPI-Fifo에서 데이터를 느리게 읽을 가능성이 있습니다.
따라서 수신 된 데이터 중 일부가 삭제됩니다.

SPI 모듈의 오류 플래그를 확인하고 SPI의 RX-empty RX-fullflags를 확인해야합니다.