The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



"Таймаут выполнения кода"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (C/C++)
Изначальное сообщение [ Отслеживать ]

"Таймаут выполнения кода"  +/
Сообщение от 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, но вот СИ для меня оказался за гранью добра и зла. Дайте совет как минимальным несложным кодом решить мою задачу.

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения [Сортировка по времени | RSS]


1. "Таймаут выполнения кода"  +/
Сообщение от Trenkle (?), 14-Окт-19, 14:51 
Короч СИ на столько крут, что для обычного смертного в нем разобраться просто анриал...
С потоками разобрался, начал разбираться с тем, как собственно подвисшый поток прихлопнуть, и... толи это невозможно, толи неизвестно как. pthread_cond_timedwait делает это только изнутри самого потока, то есть с основоного потока его не заюзать. Да что там говорить, даже pthread_cancel зависшый поток закрывать отказывается.
Достало это извращение, пускай на СЯХ лячкают красивенькие програмки гуру программирования, а я, нуб, написал скрипт на питоне с использованием SMBUS, без каких либо плагинов  или чего либо еще, при чем сам код оказался в два раза меньше предыдущего кода на СИ, в котором я еще и модуль использовал...
Всем спасибо за помощь, вопрос можно считать решенным.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

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

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

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

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


Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

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

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

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

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

6. "Таймаут выполнения кода"  +/
Сообщение от 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

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

7. "Таймаут выполнения кода"  +/
Сообщение от Аноним (7), 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

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру