LINUX.ORG.RU

Как правильно работать с usleep() и nanosleep()?


0

1

Вопрос по программированию консольных приложений для OpenWRT. Пытаюсь портировать под OpenWRT программу для USB термометра Masterkit BM707, программа для линукса x86 выложена тут.

Перевёл с С++ на С (поскольку в OpenWRT работа с С++ связана с изрядным шаманством и лишними загружаемыми библиотеками, что не очень хорошо для встраиваемой системы), скомпилял, но - не в полном объёме работает (не опрашивает список подключенных датчиков, хотя по известному идентификатору опрашивает нормально), поскольку не отрабатывает задержки протокола между запросами к USB интерфейсу. Задержка нужна в 1мс и кратная 1мс, у автора используется тупо цикл. Проконсультировался с автором девайса - говорит, проблема скорее всего именно в задержках, что они по разному отрабатываются десктопным и ARM процессором. Полез искать как можно сделать задержку 1мс - нашёл функции usleep и nanosleep, но они полное впечатление что не работают. Пример:

printf ("Start pause 10sec\n");
int n;
int result;
for(n=0;n<10;n++) { result=usleep(1000000);}
printf ("End of pause 10sec, result=%i\n",result);
никакой паузы не создаёт! пробовал и в usleep передавать 1000, а цикл до 10000 - то же самое. Как правильно это сделать?


оптимизации выключены?

anonymous
()

(поскольку в OpenWRT работа с С++ связана с изрядным шаманством и лишними загружаемыми библиотеками, что не очень хорошо для встраиваемой системы)

Слинкуй статически.

madcore ★★★★★
()

Может, анонимус правду говорит, и какой-нибудь -O3 выжирает цикл for?

Кстати, нафига он вообще вам нужен?

Eddy_Em ☆☆☆☆☆
()

Оптимизации стараются, скорее всего. Компилятор выносит вычисление result=usleep(…); за тело цикла, (справедливо) предполагая отсутствие побочных эффектов и зависимости от n у данной конструкции, а оставшийся пустой цикл прибивает.

ram
()
Ответ на: комментарий от ram

Компилятор выносит вычисление result=usleep(…); за тело цикла, (справедливо) предполагая отсутствие побочных эффектов

Ни разу не справедливо. У usleep есть побочный эффект и он по умолчанию предполагается, если только кто-то сдуру не объявил функцию как pure или const.

const86 ★★★★★
()
# time ./a.out 
start pause 10 sec
End of pause 10 sec, result = 0
real	0m 10.21s
user	0m 0.00s
sys	0m 0.01s

код скопировал из исходного сообщения, проверил на wl500gpv2.

i-rinat ★★★★★
()

Сколько, по-твоему, человек на ЛОРе вообще слышали об OpenWRT?

Сколько из них, в процентах, и в абсолютном количестве, работали с ней?

С чего ты взял, что usleep/nanosleep обязаны выдавать задержку именно в указанное тобой время? Они не обязаны - они обязаны давать задержку _не_менее_ указанного времени; это не говоря уже о том, что линукс далеко не реалтайм система.

Почему бы не перестать ебать мозги, и не сделать тупое ожидание на циклах? Тем более что это единственный вариант.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.