如何在C语言中实现系统调用的延迟时间(microsec order)

时间:2014-11-19 00:51:43

标签: c linux-kernel delay embedded-linux system-calls

如何在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”)的相应延迟时间? 谢谢!

1 个答案:

答案 0 :(得分:2)

对于短延迟,请使用内核函数:

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

这些是以独立于拱的方式实现的定时循环,并且比下面的方法好得多:

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

取决于CPU速度。

注意:设置一个非常大的值(15000 mili sec)然后内核可能会产生一个软锁定。当信号必须提供软锁定时,这是一个硬编码值。在等待期间使用udelay() or mdelay()也不可中断,因此,您可能需要考虑使用内核定时器。