2014-11-19 3 views
0

C에서 시스템 호출시 지연 시간을 구현하려면 어떻게해야합니까? stm32f429 및 hc-sr04 센서를 사용하고 있습니다. 10 마이크로 초의 트리거 펄스를 주어야합니다. 나는 다음과 같이 시도했다 :C에서 시스템 호출에 지연 시간 (마이크로 초)을 구현하는 방법

gpio_set_value(TRIG, 1); 
for(k=0;k<16;k++) 
asm("nop"); 
gpio_set_value(TRIG, 0); 

그러나 나는 asm ("nop")이 지연에 대해 부정확하다고 생각한다. 시스템 호출에 마이크로 초의 지연을 구현하는 정확도 측면에서 가장 좋은 방법은 무엇입니까? 또 다른 작은 질문 : asm ("nop")에 대해, 내 장치의 ARM 프로세서가 주파수가 180MHz라는 것을 알고, 어떻게 단일 asm ("nop")의 해당 지연 시간을 계산할 수 있습니까? 감사합니다.

짧은 지연에 대한
+5

정말 리눅스를 사용하고 있습니까? NOP를 사용하여 정확한 지연을하려면 인터럽트 및 다른 작업 전환을 비활성화해야하며 심지어 버스 조정자의 도움을 받아야합니다. 많은 하드웨어 타이머 중 하나를 사용하는 것을 고려하십시오. –

+1

당신은 드라이버에서 그것을 할 수 있습니다. 전화 spin_lock_irq (&lock); udelay (10).! spin_unlock_irq (잠금) – John

+0

안녕하세요 크리스 예, 이미 장애인 인터럽트 그러나 호기심을 위해, 어떻게 내가 측면에서 대응이 얼마나 ASM ("NOP") 계산할 수 있습니다. 안녕하세요 John! spin_lock과 spin_unlock 사이에 시스템 호출에 지연 또는 전체 코드 만 넣어야합니까? 답변 해 주셔서 감사합니다 – Anth

답변

2

는 커널 함수 사용 아치 독립적 인 방식으로 구현

udelay(unsigned long usecs) - microsec delay 
mdelay(unsigned long msecs) - millisec delay 

이 시간이 초과되어 루프를하고 접근하기보다 훨씬 더 있습니다 따라 CPU 속도가

for (i = 0; i < 1000000; i++) 
     ; 

입니다 .

주 : 매우 큰 값 (15000 밀리 초)을 넣으면 커널이 소프트 - 록업을 할 수 있습니다. 이것은 신호가 소프트 록 업을 제공해야하는 경우 하드 코딩 된 값입니다. 또한 udelay() or mdelay()을 사용하면 대기 중에 인터럽트 할 수 없기 때문에 커널 타이머를 사용하는 것이 좋습니다.

+0

안녕하세요 askb! 필자는 제 경우 커널 레벨에서 작업하고 있으므로 udelay를 사용하는 것이 정확도면에서 더 좋은 선택이라고 생각하십니까? 답장을 보내 주셔서 감사합니다. – Anth

+0

@Anth 언급 한 바와 같이'udelay()'또는 커널 타이머 (인터럽트 대기를 사용하려는 경우)를 사용할 수 있습니다. – askb

관련 문제