【发布时间】:2014-11-19 00:51:43
【问题描述】:
如何在 C 中实现系统调用的延迟时间? 我正在使用 stm32f429 和 hc-sr04 传感器。我需要给出一个 10 微秒的触发脉冲。我试过了:
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")对应的延迟时间? 谢谢!
【问题讨论】:
-
你真的在上面运行 linux 吗?要使用 NOP 进行准确的延迟,您将不得不禁用中断和其他任务切换,即便如此,仍受总线仲裁器的支配。考虑使用众多硬件计时器之一。
-
您可以在驱动程序中进行。调用 spin_lock_irq(&lock);乌德莱(10); spin_unlock_irq(&lock).
-
嗨,克里斯!是的,我已经禁用了中断。但是出于好奇,我如何计算 asm("nop") 在时间方面对应多少?嗨,约翰!在 spin_lock 和 spin_unlock 之间,我必须只将延迟或整个代码放入系统调用中吗?谢谢你的回答
-
只有延迟(udelay),记住它是一个延迟循环......你说的系统调用是什么意思?
-
嗨,约翰。我将系统调用视为内核的接口。它们为操作系统本身提供的服务提供接口。不过谢谢你的回答。
标签: c linux-kernel delay embedded-linux system-calls