Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.93/41: Рейтинг темы: голосов - 41, средняя оценка - 4.93
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607

Watchdog на основе таймеров POSIX

29.12.2019, 22:41. Показов 9081. Ответов 65
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, решил написать watchdog для сервера и чтобы не тратить зазря процессрное время решил реализовать это на основе таймеров POSIX, а не через создание отдельного потока.

Почитал документацию и остались некоторые вопросы:

1)Как должна быть организована проверка что сигнал пришёл от созданного мною таймера, а не от стороннего приложения ?
Сечас в обработчик приходит _si->si_pid == 0

2)Как сделать сброс таймера т.е. чтоб начинал считать по новому ? это всётаки watchdog.

3)Как подружить мой watchdog и std::getline(cin, str_command ?

4)Надо ли вызывать предыдущие обработчики если я их не создавал ?

5)Надо ли делать задержку после вызова timer_settime ?

6)Какой тип таймера выбрать ? CLOCK_REALTIME меня смущает что ктото мжет перевести время.

код внизу

watchdog.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#include "../include/error.h"
#include "../include/watchdog.h"
 
// (с) http://man7.org/linux/man-pages/man2/timer_create.2.html
#define CLOCKID CLOCK_REALTIME
#define SIG SIGRTMIN + 10
 
IWatcher* callback = nullptr;
 
typedef void (*TSigFunc1)(int, siginfo_t *, void *);
typedef void (*TSigFunc2)(int);
TSigFunc1 prev_handler1 = nullptr;
TSigFunc2 prev_handler2 = nullptr;
pid_t current_pid = getpid();
 
void IWatcher::reset()
{
    //
}
 
static void signal_handler(int _sig, siginfo_t * _si, void * _uc)
{
    bool result = false;
    if ((_sig == SIG) && (_si))
    {
        if ((callback) && (_si->si_pid == current_pid))
        {
            //errspace::show_errmsg("caught valid signal");
            //(*callback)(_si);
            result = true;
        }
    }
    if (!result)
    {
        //errspace::show_errmsg("caught invalid signal");
    }
    //if (prev_handler1) prev_handler1(_sig, _si, _uc);
    //if (prev_handler2) prev_handler2(_sig);
    //signal(_sig, SIG_IGN);
}
 
timer_t timerid;
 
bool start_wd(std::size_t _msecs, IWatcher* _cback)
{
   static constexpr auto billion = 1'000'000'000;
   static constexpr auto million = 1'000'000;
   callback = _cback;
   bool result = false;
   struct sigevent sev;
   struct itimerspec its;
   long long freq_nanosecs;
   sigset_t mask;
   struct sigaction sa;
   struct sigaction old_sa;
   // Establish handler for timer signal
   sa.sa_flags = SA_SIGINFO;
   sa.sa_sigaction = signal_handler;
   sigemptyset(&sa.sa_mask);
   if (sigaction(SIG, &sa, &old_sa) == -1)
   {
       errspace::show_errmsg("Failed to setup watchdog: Establish handler");
       return result;
   }
   prev_handler1 =  old_sa.sa_sigaction;
   prev_handler2 =  old_sa.sa_handler;
   // Block timer signal temporarily
   sigemptyset(&mask);
   sigaddset(&mask, SIG);
   if (sigprocmask(SIG_SETMASK, &mask, NULL) == -1)
   {
       errspace::show_errmsg("Failed to setup watchdog: Blocking signal");
       return result;
   }
 
   // Create the timer
   sev.sigev_notify = SIGEV_SIGNAL;
   sev.sigev_signo = SIG;
   sev.sigev_value.sival_ptr = &timerid;
   if (timer_create(CLOCKID, &sev, &timerid) == -1)
   {
       errspace::show_errmsg("Failed to setup watchdog: create timer");
       return result;
   }
 
   // Start the timer
   freq_nanosecs = million*_msecs;
   its.it_value.tv_sec = freq_nanosecs / billion;
   its.it_value.tv_nsec = freq_nanosecs % billion;
   its.it_interval.tv_sec = its.it_value.tv_sec;
   its.it_interval.tv_nsec = its.it_value.tv_nsec;
 
   if (timer_settime(timerid, 0, &its, NULL) == -1)
   {
       errspace::show_errmsg("Failed to setup watchdog: set time");
       return result;
   }
   // ????
   // std::this_thread::sleep_for(std::chrono::milliseconds(_msecs*2));
   /* Sleep for a while; meanwhile, the timer may expire
      multiple times */
 
   //printf("Sleeping for %d seconds\n", atoi(argv[1]));
   //sleep(atoi(argv[1]));
 
   // Unlock the timer signal, so that timer notification can be delivered
   if (sigprocmask(SIG_UNBLOCK, &mask, NULL) == -1)
   {
       errspace::show_errmsg("Failed to setup watchdog: Unblocking signal");
       return result;
   }
    result = true;
    return result;
}
 
void stop_wd()
{
    sigset_t mask;
    struct sigaction action;
 
    // Block timer signal temporarily
    sigemptyset(&mask);
    sigaddset(&mask, SIG);
    if (sigprocmask(SIG_SETMASK, &mask, NULL) == -1)
    {
        errspace::show_errmsg("Failed to reset watchdog: Blocking signal");
        return;
    }
    timer_delete(timerid);
    action.sa_handler = SIG_DFL;
    action.sa_flags   = SA_RESETHAND;
 
    if (sigaction(SIGINT, &action, NULL) == -1)
    {
        errspace::show_errmsg("Failed to reset watchdog: reset handler");
        return;
    }
 
    // Unlock the timer signal, so that timer notification
    //   can be delivered
    if (sigprocmask(SIG_UNBLOCK, &mask, NULL) == -1)
    {
        errspace::show_errmsg("Failed to reset watchdog: Unblocking signal");
        return;
    }
}
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <iostream>
#include "../include/common.h"
#include "../include/error.h"
#include "../include/watchdog.h"
#include "../include/mng_thread.h"
 
class Watcher : public IWatcher
{
public:
    template<typename ...Args>
    Watcher(Args... _args)
    {
        auto tpack = std::make_tuple(_args...);
    }
protected:
    virtual void operator ()(siginfo_t *si)
    {
        //printf("Caught signal %d\n", sig);
        //print_siginfo(si);
        //#define errExit(msg)    do { perror(msg); exit(EXIT_FAILURE); \
        //                           } while (0)
        errspace::show_errmsg("watchdog timeout");
        timer_t tidp;
        int _or;
 
        tidp = si->si_value.sival_ptr;
 
        //printf("    sival_ptr = %p; ", si->si_value.sival_ptr);
        //printf("    *sival_ptr = 0x%lx\n", (long) tidp);
 
        _or = timer_getoverrun(tidp);
        //if (_or == -1)
        //    errExit("timer_getoverrun");
        //else
         //   printf("    overrun count = %d\n", _or);
    }
};
 
int main(int argc, char *argv[])
{
    static Watcher w{};
    IWatcher* iw = &w;
 
    const char * FUNCTION = __FUNCTION__;
    try
    {
        using std::cout;
        using std::cin;
        using std::endl;
        cout << "Server is started" << endl;
        std::string str_command;
        while(1)
        {
            LOG << "enter command:";
            if (std::getline(cin, str_command))
            {
                LOG << "command:" << str_command << " was got";
                if (str_command == "q") break;
                if (str_command == "e") throw 0;
                if (str_command == "s")
                {
                    start_wd(1000, iw );
                }
                if (str_command == "p") stop_wd();
            }
            str_command = "";
        }
    }
    catch (...)
    {
        errspace::show_errmsg(FUNCTION);
    }
    return EXIT_SUCCESS;
}
#endif
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.12.2019, 22:41
Ответы с готовыми решениями:

WatchDog
Есть устройство на меге16 (пока на ней) которое тупо запоминает в EEPROM во сколько на одном из пинов порта появилась единица. Не не знаю...

Пробуждение по watchdog
Доброго времени суток. На старом АТ90S нужно уйти в сон, проснуться по watchdog, убедиться что событие не произошло, и опять уйти в сон. ...

WatchDog в Python
Добрый день! Интересует возможность использования watchdoga в Python. Есть ли реализация или модуль в Python, похожий на сторожевой...

65
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
31.12.2019, 21:51
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от squareroot Посмотреть сообщение
Затем что для линуксовой версии я бы использовал таймер POSIX потому как я понимаю, скорей всего он посылает сигнал в режиме ядра и в потоке ядра, а малохольный ваш таймер может тупо не сработать из-за какого нибудь гадкого потока при подвисании системы когда его обработчик надо будет вызвать в контексте пользовательского потока .
timerfd - это точно такой же объект ядра.

Цитата Сообщение от DrOffset Посмотреть сообщение
скорей всего он посылает сигнал в режиме ядра и в потоке ядра
Обработчик сигнала, естественно, ни в каком потоке ядра не выполняется.

Цитата Сообщение от squareroot Посмотреть сообщение
скорей всего он посылает сигнал
Что толку, если вы из него не сможете безопасно сделать то, что нужно?

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

Цитата Сообщение от squareroot Посмотреть сообщение
не от балды взялись всётаки.
Они взялись от того, что сигнал прерывает выполнение программы в произвольном месте.
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
31.12.2019, 21:59  [ТС]
DrOffset у меня нет конкретных требований к watchdog потомучто я не системный программист Linux, но мне кажется таймер POSIX более живучим инструментом чем timerfd. Если Вы сможете объяснить разницу между ними почему одному можно по полной использовать все фишки плюсов, а для другого можно только из списка выше то будет здорово. Если Вам кажется что они равнозначности в части применения для watchdog то тоже было бы интересно узнать почему.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
31.12.2019, 22:09
Цитата Сообщение от squareroot Посмотреть сообщение
у меня нет конкретных требований к watchdog
Тогда ваша уверенность кажется мне необоснованной.

Цитата Сообщение от squareroot Посмотреть сообщение
Если Вы сможете объяснить разницу между ними почему одному можно по полной использовать все фишки плюсов, а для другого можно только из списка выше то будет здорово.
Потому что обработчик таймера при реализации через сигналы получает те же ограничения, которые получает сам обработчик сигнала. Если поток, в котором будет выполнятся мониторинг timerfd, не должен зависать, то в ваших силах сделать так, чтобы оно так и было. Если же система по каким-то причинам решит "угробить" весь процесс, то и обработчик сигнала вам не поможет.

Цитата Сообщение от squareroot Посмотреть сообщение
Если Вам кажется что они равнозначности в части применения для watchdog то тоже было бы интересно узнать почему.
Они не равнозначны - это разные подходы. Но исходя из того, что вы показали выше, таймеры ASIO или непосредственно сам timerfd вам подходит больше. Я вижу, что вы пытались написать код, который исполняет callback в контексте обработчика таймера. Если этот обработчик - обработчик сигнала, то сделать это в общем виде невозможно. Т.к. ваш callback начинает испытывать те же ограничения, что и сам обработчик сигнала. Или вы формулируете требования, из которых становится понятно, что данные ограничения - не помеха, или задача решения не имеет в такой постановке.
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
31.12.2019, 22:23  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Тогда ваша уверенность кажется мне необоснованной.
У меня нету никакой увереннсти. Это я линюсь писать оговорки :-) "что мне так кажется".

Цитата Сообщение от DrOffset Посмотреть сообщение

Потому что обработчик таймера при реализации через сигналы получает те же ограничения, которые получает сам обработчик сигнала. Если поток, в котором будет выполнятся мониторинг timerfd, не должен зависать, то в ваших силах сделать так, чтобы оно так и было. Если же система по каким-то причинам решит "угробить" весь процесс, то и обработчик сигнала вам не поможет.
Ну допустим я пишу код второпях или решил приколоться и запустил timerfd в коде нового, а не основного потока. Как я понимаю обработчик будет тоже вызван в коде нового потока и этот поток завис наглухо.

Цитата Сообщение от DrOffset Посмотреть сообщение
Они не равнозначны - это разные подходы. Но исходя из того, что вы показали выше, таймеры ASIO или непосредственно сам timerfd вам подходит больше. Я вижу, что вы пытались написать код, который исполняет callback в контексте обработчика таймера. Если этот обработчик - обработчик сигнала, то сделать это в общем виде невозможно. Т.к. ваш callback начинает испытывать те же ограничения, что и сам обработчик сигнала. Или вы формулируете требования, из которых становится понятно, что данные ограничения - не помеха, или задача решения не имеет в такой постановке.
Да callback там потомучто watchdog не в курсе tid-ов запушенных потоков, а задача у колбека банальная pthread_kill(_current_tid)
ну и флажк атомарный выставить для основного потока. Вообще хочеться watchdog сделать как "библиотечный" чтоб был на все случаи жизни, а не только для конкретного приложения.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
31.12.2019, 22:25
Цитата Сообщение от squareroot Посмотреть сообщение
Если Вы сможете объяснить разницу между ними почему одному можно по полной использовать все фишки плюсов, а для другого можно только из списка выше то будет здорово.
Мониторинг timerfd выполняется тем же способом, которым вы делаете мониторинг, например, сокетов. При срабатывании select\poll\epoll для такого дескриптора, у вас будет возможность запустить обработчик в контексте одного из потоков приложения, естественно при этом нам доступны все стандартные возможности, потому что программа находится в корректном состоянии.

Добавлено через 2 минуты
Цитата Сообщение от squareroot Посмотреть сообщение
Ну допустим я пишу код второпях или решил приколоться и запустил timerfd в коде нового, а не основного потока. Как я понимаю обработчик будет тоже вызван в коде нового потока и этот поток завис наглухо.
С чего бы ему зависнуть?
Да и где будет вызван обработчик (и будет ли вызван вообще) решаете вы.
Ну и если писать код второпях, то какой подход не используй - все равно фигня получится.

Давайте все-таки нормально делать. Вы опишите пожалуйста чего хотите делать своим watchdog`ом, а я уж как-нибудь постараюсь вас не обидеть и порекомендовать приемлемое решение.
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
31.12.2019, 22:30  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Мониторинг timerfd выполняется тем же способом, которым вы делаете мониторинг, например, сокетов. При срабатывании select\poll\epoll для такого дескриптора, у вас будет возможность запустить обработчик в контексте одного из потоков приложения, естественно при этом нам доступны все стандартные возможности, потому что программа находится в корректном состоянии.

Добавлено через 2 минуты

С чего бы ему зависнуть?
Да и где будет вызван обработчик (и будет ли вызван вообще) решаете вы.
Ну и если писать код второпях, то какой подход не используй - все равно фигня получится.

Давайте все-таки нормально делать. Вы опишите пожалуйста чего хотите делать своим watchdog`ом, а я уж как-нибудь постараюсь вас не обидеть и порекомендовать приемлемое решение.
Я хочу поставить вопрос с ног на голову. Вот есть таймер POSIX. Для каких случаев он лучше timerfd ? Кгда наоборот я уже понял.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
31.12.2019, 22:51
squareroot,
* когда timerfd не поддерживается.
* когда нам нужна POSIX-переносимость (например на solaris или freebsd) (*)
* когда у нас уже есть приложение, архитектура которого построена на обработке сигналов
* когда нам нужно открывать огромное количество файловых дескрипторов и занимать под это дело таймер - роскошь.
___________
(*) тщательно проверив при этом реализацию, совместимость с POSIX для ОС - это не догма


Про стабильность приложения ничего не пишу, потому что считаю, что оба подхода позволят достичь любой возможной на уровне пользователя стабильности приложения.

Хотел еще вам порекомендовать посмотреть на watchdog daemon в linux.
И на Linux Watchdog Driver API: https://www.kernel.org/doc/htm... g-api.html
1
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
31.12.2019, 22:56  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
squareroot,
* когда timerfd не поддерживается.
* когда нам нужна POSIX-переносимость (например на solaris или freebsd) (*)
* когда у нас уже есть приложение, архитектура которого построена на обработке сигналов
* когда нам нужно открывать огромное количество файловых дескрипторов и занимать под это дело таймер - роскошь.
___________
(*) тщательно проверив при этом реализацию, совместимость с POSIX для ОС - это не догма


Про стабильность приложения ничего не пишу, потому что считаю, что оба подхода позволят достичь любой возможной на уровне пользователя стабильности приложения.

Хотел еще вам порекомендовать посмотреть на watchdog daemon в linux.
И на Linux Watchdog Driver API: https://www.kernel.org/doc/htm... g-api.html
Во, вот за ссылку на апи Linux Watchdog Driver API спасибо. Но я раньше не наблюдал в ответах. Но Watchdog линуксовый вроде слишком суровый, он ребутит всю систему или я не прав ?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
31.12.2019, 22:57
Цитата Сообщение от squareroot Посмотреть сообщение
Но Watchdog вроде слишком суровый, он ребутит всю систему или я не прав ?
Да, именно так. Но вы выше ясно дали понять, что опасаетесь любых проблем. Так если у вас настолько все серьезно, то проще перезагрузить машину.
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
31.12.2019, 23:16  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Да, именно так. Но вы выше ясно дали понять, что опасаетесь любых проблем. Так если у вас настолько все серьезно, то проще перезагрузить машину.
Ну в дополнении к пользвательскому вотчдогу это очень замечательно будет.

Добавлено через 6 минут
Только запускать надо будет от рута скорей всего.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
31.12.2019, 23:21
Цитата Сообщение от squareroot Посмотреть сообщение
Только запускать надо будет от рута скорей всего.
Если вы все равно пишете демона, то это не проблема же?
Да и для юзерспейса есть watchdog daemon, который предоставляет эту функциональность для произвольных приложений.
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
31.12.2019, 23:25  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Если вы все равно пишете демона, то это не проблема же?
Да и для юзерспейса есть watchdog daemon, который предоставляет эту функциональность для произвольных приложений.
До написания демона у меня не скоро руки дойдут. Этому вотчдоку сильно не хватает потокобезопаснсти, но мьютекс не хочу использовать. Надо щас будет копать в части locck free структур или спинлок запилить.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
31.12.2019, 23:29
Цитата Сообщение от squareroot Посмотреть сообщение
Этому вотчдоку сильно не хватает потокобезопаснсти
Я так и не смог от вас добиться формулировки его задач
Ладно.
Дело ваше.
Может через годик-два вспомните мои слова и совсем по другому на них посмотрите.

Добавлено через 16 секунд
С наступающим. Засим я отчаливаю.
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
31.12.2019, 23:34  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Я так и не смог от вас добиться формулировки его задач
Ладно.
Дело ваше.
Может через годик-два вспомните мои слова и совсем по другому на них посмотрите.

Добавлено через 16 секунд
С наступающим. Засим я отчаливаю.
И Вас тоже с наступающем !
В новом году надеюсь продолжим дискуссию
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
02.01.2020, 03:40  [ТС]
Добрый день всем. Остались некоторые вопросы. Самый насущный: Почему у меня timer_delete всё время возвращает код ошибки ? Как правильно пользоваться этой функцией, в случае когда надо остановить таймер ?
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
08.01.2020, 03:30  [ТС]
Только щас понял что таймера asio не получится нормально сбрасывать. Они всёравно будут вызывать обработчик при отмене.
Да, можно конечно по флагй отследить что это именно отмена, но нехорошо всёравно.

Добавлено через 1 час 19 минут
Всё, теперь окончательно стало понятно что boost::asio::deadline_timer не годится для watcdog-а так требуется ожидание через io_service::run или поллинг io_service:oll
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
08.01.2020, 10:51
Цитата Сообщение от squareroot Посмотреть сообщение
Всё, теперь окончательно стало понятно что boost::asio::deadline_timer не годится для watcdog-а так требуется ожидание через io_service::run или поллинг io_service::poll
Чем же поллинг помешает?
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
08.01.2020, 12:00  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Чем же поллинг помешает?
Он ничем не помешает, но мне нужен таймер а не счётчик. В бусте нету таймеров, а есть счётчики.
Таймер это когда запустил и забыл. Я не могу использовать основной поток для периодического опроса, и если надо создавать отдельный поток, для опроса, то это лажа. Такое решение мне изначально было неприемлемо.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
08.01.2020, 12:11
Цитата Сообщение от squareroot Посмотреть сообщение
если надо создавать отдельный поток, для опроса, то это лажа.
Если вы хотите из обработчика таймера делать что-то более сложное, то отдельный поток (а лучше процесс) вам все равно придется делать.

Цитата Сообщение от squareroot Посмотреть сообщение
Такое решение мне изначально было неприемлемо.
Поэтому я вас просил сформулировать требования к решению.
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
08.01.2020, 12:15  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Если вы хотите из обработчика таймера делать что-то более сложное, то отдельный поток (а лучше процесс) вам все равно придется делать.
Можно и не сложное, но мне нужен кроссплатформенный таймер без дополнительных потоков. Я писал об этом ранее.

Цитата Сообщение от DrOffset Посмотреть сообщение
Поэтому я вас просил сформулировать требования к решению.
Я сформулировал ранее, что мне нужен таймер без дополнительных потоков.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.01.2020, 12:15
Помогаю со студенческими работами здесь

Watchdog из Arduino
Есть пк, который может зависнуть, или может зависнуть у него сетевуха. Просьба не пинать в сторону, уже все сто раз было, ищи итп... ...

Внешний WAtchdog
Добрый день! Есть рабочее устройство на AVR! Надо к нему прикрепить внешний watchdog, тоесть устройство будет переодически подтягивать...

AvrSudio и watchdog
Не могу дождаться чтобы аврстудия ушла в ресет или прерывание по вочдогу. В реале сбрасывает, а в студии ну никак.

Analog Watchdog (AWD)
Добрый день. Уже третьи сутки бъюсь с analog watchdog, не хочет зараза, нормально работать. Код ниже. В одиночном преобразовании все...

Cortex m0 и watchdog таймер
Всем доброго времени суток!!! Программирую схему на базе ядра cortex m0. Не могу заставить работать watchdog. Вроде делаю всё правильно: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru