URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 10284
[ Назад ]

Исходное сообщение
"Таймаут выполнения кода"

Отправлено Trenkle , 13-Окт-19 17:52 
Суть задачи - на одноплатнике через GPIO нужно читать состояние ног на чипе mcp23017. СИ фактически не знаю, разбираюсь в нем на примитивном уровне. С горем пополам код я все-же написал, и он на удивление даже работал, но потом я столкнулся с ситуацией когда чип mcp23017 виснет, и при попытке считать его состояние подвисает и программа. Собственно, требуется как-то обрывать выполнение приложения, допустим если оно не отработало за 5 секунд.

Так сказать "основной участок кода" (все, что не касается сабжа убрал):

#include <wiringPi.h>
#include <mcp23017.h>

int main (int argc, char * argv[]) {
  wiringPiSetup ();
  mcp23017Setup (101, 0x27);

  printf("%d\n", digitalRead(101));

  return 0 ;
}

Проблемный участок здесь "printf("%d\n", digitalRead(101));", а точнее digitalRead. Если чип завис, данная команда будет выполняться фактически бесконечно.
Хотелось-бы чтобы код подождал 5 секунд, и прекратил выполнение данной команды.

Понятное дело сначала полез гуглить - нашел кучу советов использовать pthreads. Когда попытался в нем разобраться, почувствовал что мозг сейчас уже через уши полезет, ибо инструкции по нем выглядят как-то так - "берем отвертку, гаечный ключ, 5 гаек на 12 и 4 шурупа, вкручиваем шуруп в гайку, ииии вот у нас получилась машина времени. Я PHP знаю и JS, но вот СИ для меня оказался за гранью добра и зла. Дайте совет как минимальным несложным кодом решить мою задачу.


Содержание

Сообщения в этом обсуждении
"Таймаут выполнения кода"
Отправлено Trenkle , 14-Окт-19 14:51 
Короч СИ на столько крут, что для обычного смертного в нем разобраться просто анриал...
С потоками разобрался, начал разбираться с тем, как собственно подвисшый поток прихлопнуть, и... толи это невозможно, толи неизвестно как. pthread_cond_timedwait делает это только изнутри самого потока, то есть с основоного потока его не заюзать. Да что там говорить, даже pthread_cancel зависшый поток закрывать отказывается.
Достало это извращение, пускай на СЯХ лячкают красивенькие програмки гуру программирования, а я, нуб, написал скрипт на питоне с использованием SMBUS, без каких либо плагинов  или чего либо еще, при чем сам код оказался в два раза меньше предыдущего кода на СИ, в котором я еще и модуль использовал...
Всем спасибо за помощь, вопрос можно считать решенным.

"Таймаут выполнения кода"
Отправлено Аноним , 14-Окт-19 15:31 
> Короч СИ на столько крут, что для обычного смертного в нем разобраться
> просто анриал...

...
> Всем спасибо за помощь, вопрос можно считать решенным.

раньше пользовался велосипедом, присел в машину - где крутить педали, ничего непонятно, вернулся к пользованию велосипедом... хм, вроде ничего не упущено.

имо, для данного case с головой хватит - man { select, read, write, close, open };
..и до использования thread еще n-кварталов практики



"Таймаут выполнения кода"
Отправлено Ф , 14-Окт-19 15:48 
>> Короч СИ на столько крут, что для обычного смертного в нем разобраться
>> просто анриал...
> ...
>> Всем спасибо за помощь, вопрос можно считать решенным.
> раньше пользовался велосипедом, присел в машину - где крутить педали, ничего непонятно,
> вернулся к пользованию велосипедом... хм, вроде ничего не упущено.
> имо, для данного case с головой хватит - man { select, read,
> write, close, open };
> ..и до использования thread еще n-кварталов практики

там неизвестно, что внутри этого digitalread(), может тупо поллинг чипового регистра.

туда таймаут вставить проще может быть, если исходники есть. Или свой read написать.


"Таймаут выполнения кода"
Отправлено Аноним , 14-Окт-19 20:15 
>  там неизвестно, что внутри этого digitalread(), может тупо поллинг чипового регистра.

есть и такой момент, рассматривалась изначально правильная реализация уровнем ниже
>  туда таймаут вставить проще может быть, если исходники есть. Или свой read написать.


"Таймаут выполнения кода"
Отправлено Trenkle , 15-Окт-19 00:53 
> раньше пользовался велосипедом, присел в машину - где крутить педали, ничего непонятно,
> вернулся к пользованию велосипедом... хм, вроде ничего не упущено.
> имо, для данного case с головой хватит - man { select, read,
> write, close, open };
> ..и до использования thread еще n-кварталов практики

Вы вообще внимательно читали мое первое и второе сообщение? Предлагаю их прочитать внимательно.
Я не изучаю СИ, я об этом написал, проверьте, и изучать не планирую, так как язык мне не понравился, и соответственно знания у меня поверхностные (об этом я тоже писал), по этому ваш сарказм мягко говоря неуместен. В данный момент мне с головой хватает ноды, пхп, баша, питона, и даже делфи. По этому практики не будет, ибо бессмысленно.
у меня была конкретная задача, которую в моем случае на сях было реализовать быстрее и проще, так как там уже есть готовый модуль, и для компиляции достаточно билды поставить, которые я и так всегда ставлю. Я это сделал, код рабочий, но вот только при чтении зависшего чипа процесс сам зависает вхлам, иногда его даже кильнуть не получается, и приходится одноплатник перезагружать.

Предлагаю следующее - напишите на предложенных вами { case, select, read, write, close, open } код, который решал-бы задачу, описанную в первом сообщении, а я после этого проверю ваш код на двух одинаковых одноплатниках - на одном чип работает нормально, а на втором чип висяк. Чисто развития ради, вполне возможно пойму свои ошибки.
И кстати, это не способ выудить код, решающий мою задачу. Как я писал выше - я уже все написал на пайтоне с использованием smbus, пришлось конечно повозиться с конвертацией данных в HEX-2-10-16 бит, но ничего, справился, весь код влез чуть более чем в 100 строк кода.
А, две библиотеки, которые фигурируют у меня в коде находятся здесь:
https://github.com/WiringPi/WiringPi


"Таймаут выполнения кода"
Отправлено Аноним , 15-Окт-19 10:10 
>> раньше пользовался велосипедом, присел в машину - где крутить педали, ничего непонятно,
>> вернулся к пользованию велосипедом... хм, вроде ничего не упущено.
>> имо, для данного case с головой хватит - man { select, read,
>> write, close, open };
>> ..и до использования thread еще n-кварталов практики
> Вы вообще внимательно читали мое первое и второе сообщение? Предлагаю их прочитать
> внимательно.

...
> В данный момент мне с головой хватает ноды,
> пхп, баша, питона, и даже делфи. По этому практики не будет,
> ибо бессмысленно.

видите ли, я часто пересекался в embed. - когда подобный подход приводит к мега костылям в дальнейшем,
и крайне рекомендуется, из моего опыта общения с создателями подобного "фаст-фуда",
подтянуть С - много благодарили в дальнейшем
> у меня была конкретная задача, которую в моем случае на сях было
> реализовать быстрее и проще, так как там уже есть готовый модуль,
> и для компиляции достаточно билды поставить, которые я и так всегда
> ставлю. Я это сделал, код рабочий, но вот только при чтении
> зависшего чипа процесс сам зависает вхлам, иногда его даже кильнуть не
> получается, и приходится одноплатник перезагружать.

Трабля, судя по всему или в железе, и/или в криво поставленном сис. софте
strace, ltrace в - помощь с выводом отладочной инфы в файл

> Предлагаю следующее - напишите на предложенных вами { case, select, read, write,
> close, open } код, который решал-бы задачу, описанную в первом сообщении,
> а я после этого проверю ваш код на двух одинаковых одноплатниках
> - на одном чип работает нормально, а на втором чип висяк.

К сожалению не располагаю таким кол-вом, не нужного времени плюс отсутствие данного железа, особливо, как вашем случае проблемного.

> Чисто развития ради, вполне возможно пойму свои ошибки.
> И кстати, это не способ выудить код, решающий мою задачу. Как я
> писал выше - я уже все написал на пайтоне с использованием
> smbus, пришлось конечно повозиться с конвертацией данных в HEX-2-10-16 бит, но
> ничего, справился, весь код влез чуть более чем в 100 строк
> кода.
> А, две библиотеки, которые фигурируют у меня в коде находятся здесь:
> https://github.com/WiringPi/WiringPi


"Таймаут выполнения кода"
Отправлено Павел Отредиез , 14-Окт-19 16:12 
>[оверквотинг удален]
> С потоками разобрался, начал разбираться с тем, как собственно подвисшый поток прихлопнуть,
> и... толи это невозможно, толи неизвестно как. pthread_cond_timedwait делает это только
> изнутри самого потока, то есть с основоного потока его не заюзать.
> Да что там говорить, даже pthread_cancel зависшый поток закрывать отказывается.
> Достало это извращение, пускай на СЯХ лячкают красивенькие програмки гуру программирования,
> а я, нуб, написал скрипт на питоне с использованием SMBUS, без
> каких либо плагинов  или чего либо еще, при чем сам
> код оказался в два раза меньше предыдущего кода на СИ, в
> котором я еще и модуль  использовал...
> Всем спасибо за помощь, вопрос можно считать решенным.

Я бы использовал fork с вызовом проблемной функции в потомке, а родителем подождал бы пять секунд и кильнул.