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

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

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

Author24 — интернет-сервис помощи студентам
Добрый день, решил написать 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.12.2019, 22:41
Ответы с готовыми решениями:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Давайте все-таки нормально делать. Вы опишите пожалуйста чего хотите делать своим watchdog`ом, а я уж как-нибудь постараюсь вас не обидеть и порекомендовать приемлемое решение.
Я хочу поставить вопрос с ног на голову. Вот есть таймер POSIX. Для каких случаев он лучше timerfd ? Кгда наоборот я уже понял.
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
31.12.2019, 22:51 27
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  [ТС] 28
Цитата Сообщение от 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
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
31.12.2019, 22:57 29
Цитата Сообщение от squareroot Посмотреть сообщение
Но Watchdog вроде слишком суровый, он ребутит всю систему или я не прав ?
Да, именно так. Но вы выше ясно дали понять, что опасаетесь любых проблем. Так если у вас настолько все серьезно, то проще перезагрузить машину.
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
31.12.2019, 23:16  [ТС] 30
Цитата Сообщение от DrOffset Посмотреть сообщение
Да, именно так. Но вы выше ясно дали понять, что опасаетесь любых проблем. Так если у вас настолько все серьезно, то проще перезагрузить машину.
Ну в дополнении к пользвательскому вотчдогу это очень замечательно будет.

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

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

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

Добавлено через 1 час 19 минут
Всё, теперь окончательно стало понятно что boost::asio::deadline_timer не годится для watcdog-а так требуется ожидание через io_service::run или поллинг io_service:oll
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
08.01.2020, 10:51 37
Цитата Сообщение от 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  [ТС] 38
Цитата Сообщение от DrOffset Посмотреть сообщение
Чем же поллинг помешает?
Он ничем не помешает, но мне нужен таймер а не счётчик. В бусте нету таймеров, а есть счётчики.
Таймер это когда запустил и забыл. Я не могу использовать основной поток для периодического опроса, и если надо создавать отдельный поток, для опроса, то это лажа. Такое решение мне изначально было неприемлемо.
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
08.01.2020, 12:11 39
Цитата Сообщение от squareroot Посмотреть сообщение
если надо создавать отдельный поток, для опроса, то это лажа.
Если вы хотите из обработчика таймера делать что-то более сложное, то отдельный поток (а лучше процесс) вам все равно придется делать.

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

Цитата Сообщение от DrOffset Посмотреть сообщение
Поэтому я вас просил сформулировать требования к решению.
Я сформулировал ранее, что мне нужен таймер без дополнительных потоков.
0
08.01.2020, 12:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.01.2020, 12:15
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru