The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Таймаут выполнения кода, !*! 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:51 , 14-Окт-19 (1)
    Короч СИ на столько крут, что для обычного смертного в нем разобраться просто анриал...
    С потоками разобрался, начал разбираться с тем, как собственно подвисшый поток прихлопнуть, и... толи это невозможно, толи неизвестно как. pthread_cond_timedwait делает это только изнутри самого потока, то есть с основоного потока его не заюзать. Да что там говорить, даже pthread_cancel зависшый поток закрывать отказывается.
    Достало это извращение, пускай на СЯХ лячкают красивенькие програмки гуру программирования, а я, нуб, написал скрипт на питоне с использованием SMBUS, без каких либо плагинов  или чего либо еще, при чем сам код оказался в два раза меньше предыдущего кода на СИ, в котором я еще и модуль использовал...
    Всем спасибо за помощь, вопрос можно считать решенным.
    • Таймаут выполнения кода, !*! Аноним, 15:31 , 14-Окт-19 (2)
      > Короч СИ на столько крут, что для обычного смертного в нем разобраться
      > просто анриал...

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

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

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


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

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

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

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

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

      • Таймаут выполнения кода, !*! Trenkle, 00:53 , 15-Окт-19 (6)
        > раньше пользовался велосипедом, присел в машину - где крутить педали, ничего непонятно,
        > вернулся к пользованию велосипедом... хм, вроде ничего не упущено.
        > имо, для данного 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

        • Таймаут выполнения кода, !*! Аноним, 10:10 , 15-Окт-19 (7)
          >> раньше пользовался велосипедом, присел в машину - где крутить педали, ничего непонятно,
          >> вернулся к пользованию велосипедом... хм, вроде ничего не упущено.
          >> имо, для данного 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

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

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




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

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