2013-07-30 3 views
0

Я пишу код для встроенного устройства (без ОС, никаких системных вызовов или чего-то еще), и мне нужно иметь задержку, но компилятор не дает time.h. Какие у меня есть другие варианты?Внедрение задержки() без времени()

+0

Многие встроенные устройства включают аппаратное устройство таймера или часов, которое может быть запрограммировано на отправку прерывания по истечении периода времени. – caf

+0

Какой компилятор вы используете? – chux

+0

Можете ли вы использовать 'select'? Он имеет параметр таймаута. – ugoren

ответ

0

В зависимости от устройства. Можете ли вы включить стабильное прерывание таймера? Возможно, вы сможете только заняться - ждать и ждать прерывания таймера. Насколько точным это может быть (и насколько точным оно должно быть) неясно.

1

В зависимости от часов вашей системы вы можете реализовать задержки с помощью инструкции ассемблера NOP (без операции). Вы можете вычислить время одного NOP в зависимости от MIPS вашей системы, например, если 1 NOP является 1[us], то вы могли бы реализовать что-то вроде:

void delay(int ms) 
{ 
    int i; 
    for (i = 0; i < ms*1000; i++) 
    { 
     asm(NOP); 
    } 
} 
0

Для коротких фиксированных временных задержек, в ничегонеделания петли будет соответствовать потребностям, но, разумеется, потребуется калибровка.

void Delay_ms(unsigned d /* ms */) { 
    while (d-- > 0) { 
    unsigned i; 
    i = 2800; // Calibrate this value 
    // Recommend that the flowing while loop's asm code is check for tightness. 
    while (--i); 
    /* add multiple _nop_() here should you want precise calibration */ 
    } 
} 
Смежные вопросы