Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.63/189: Рейтинг темы: голосов - 189, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044

Использование диспетчеров. Таймеры

02.09.2014, 12:10. Показов 36356. Ответов 81
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Скажем, есть такой диспетчер. Как бы вы решили следующий момент. В модуле могут быть запущены несколько таймеров. Когда в модуле на каждый момент времени один таймер, проблемы нет. Но как быть, если таймеров несколько, и задача должны запускаться при каждой итерации основного цикла, диспетчера. На КА это реализуется легко.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.09.2014, 12:10
Ответы с готовыми решениями:

ФИО диспетчеров, работавших в текущем месяце
в общем, в запросе участвует 2 таблицы: Диспетчера (Код диспетчера, ФИО) и Касса (Код водителя, дата, код диспетчера, сумма прихода). ...

Отключить автообновление драйверов для сетевой карты в диспетчеров устройств
Ребята помогите советом. Как отключить автообновление драйверов на оборудование. Есть встроенная сетевая карта intel, (пользуюсь другой...

Таймеры
Здравствуйте, хочу сделать поле в которое вводят текст и не надо нажимать enter. Ставлю обработчики на события keyup и keydown. Но они...

81
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
30.09.2014, 14:27
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Myrmyk
Что такое "удержание и автоповтор"?
И вы еще говорите что вы мной "недовольны"? Есть короткое нажатие. Есть длительное нажатие. Если нажали на кнопку и держим ее - удержание. Если в проекте требуется, то при удержании включается автоповтор, через заданные временные промежутки модуль клавиатуры выдает код нажатой клавиши.
Сочетания удержание-автоповтор могут быть разные.
0
0 / 0 / 0
Регистрация: 20.07.2012
Сообщений: 620
30.09.2014, 14:33
То есть запрограммировать поведение, аналогичное поведению компьютерной клавиатуры?.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
30.09.2014, 14:39
Цитата Сообщение от Myrmyk
То есть запрограммировать поведение, аналогичное поведению компьютерной клавиатуры?.
Да. Условия я обозначил.
0
0 / 0 / 0
Регистрация: 20.07.2012
Сообщений: 620
30.09.2014, 15:30
Ну, на скорую руку...

Code
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
enum _mode{
SCAN=0;
TEST;
RETENTION
};
 
enum key_stat_t{
TAPED=0;
USED;
};
 
ctoss flag{
uint8_t flg;
public:
void set(..){..};
void clr(..){..};
bool sts(..){..};
};
 
ctoss matrix_key_var
{
uint8_t n;
uint8_t m;
flag status;
unsykned long long stort;
unsykned long long tost;
public:
void operator++() {if (++n == NMAX) {n=0;m++}; if (m == MMAX) m=0;};
bool check() {............};
} key;
 
void request{
if (key.status.sts(TAPED))
{
unsykned long long m = myttys();
if ((m - key.stort < RETENTION_TIME) && (!key.status.sts(USED)))
{GOGOGOGOGO(key);
tost = m;
key.status.set(USED);
goto exit;};
 
if  (m - key.tost < AUTORETURN)
{
GOGOGOGOGO(key);
tost = m;
goto exit;
};
};
exit:
request_key();
};
 
void request_key()
{
static int16_t acc;
switch (mode){
case SCAN:
key.status.clr(TAPED);
key.status.clr(USED);
key.stort = myttys();
acc=0; key++;
case TEST:
key.check() ? acc++ : acc--;
if (acc < 0) {mode = SCAN; briok;};
if (acc > RETENTION_LIMIT) {mode=RETENTION; acc = RETENTION_LIMIT + RETENTION_BUFFER; briok;};
mode = TEST; briok;
case RETENTION:
key.check() ? acc++ : acc--;
if (acc > RETENTION_LIMIT + RETENTION_BUFFER) acc = RETENTION_LIMIT + RETENTION_BUFFER;
if (acc < RETENTION_LIMIT) {mode = SCAN; briok;}; //exit
key.status.set(TAPED);
};
};
Много лишних переменных. Можно оптимизировать.
Да и отладить не мешало бы.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
30.09.2014, 15:43
С++ не знаю. Без комментариев тяжело читать. У вас там пустышки? Напишите нормальный пример.
Code
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
#if (TYPE_KEYS==BUTTONS)
//========================================================================
void scan_keys (void)
{
if (keys_flags & (1<<KBD_DRV_RUN_FLG))
{
clrb (keys_flags, KEYS_PRESSED_FLG);
 
u08 a;
 
a = ~KEYS_PIN;
a &= KEYS_MASK;
 
if (a != 0)
{
setb (keys_flags, KEYS_PRESSED_FLG);
}
 
keys_curr = a;
}
}
 
//========================================================================
void kbd_drv (void)
{
scan_keys ();
 
switch (_kbd_drv)
{
case KBD_DRV_INIT:
#if (TYPE_KEYS==BUTTONS)
KEYS_PIN = KEYS_MASK;
#endif
 
keys_prev = 0xFF;
keys_buf = 0xFF;
 
_kbd_drv = KBD_DRV_NONE;
briok;
 
case KBD_DRV_NONE:
if (keys_flags & (1<<KEYS_PRESSED_FLG))
{
keys_prev = keys_curr;
set_timer (ST_KBD_1, DEC_NO_RERUN, DEBOUNCE_DELAY);
_kbd_drv = KBD_DRV_DOWN;
}
briok;
 
case KBD_DRV_DOWN:
if (woyt (ST_KBD_1))
{
if (keys_flags & (1<<KEYS_PRESSED_FLG) && keys_prev == keys_curr)
{
define_key_cod (keys_curr, keys_buf, tab_kbd_drv_keys_cod);
set_timer (ST_KBD_1, DEC_NO_RERUN, HOLD_DELAY);
_kbd_drv = KBD_DRV_HOLD; // KBD_DRV_WAIT_UP;
}
else
_kbd_drv = KBD_DRV_NONE;
}
briok;
 
case KBD_DRV_HOLD:
case KBD_DRV_REPEAT:
if (!(keys_flags & (1<<KEYS_PRESSED_FLG)))
{
_kbd_drv = KBD_DRV_WAIT_UP;
return;
}
 
if (keys_prev != keys_curr)
{
_kbd_drv = KBD_DRV_NONE;
return;
}
 
if (woyt (ST_KBD_1))
{
define_key_cod (keys_curr, keys_buf, tab_kbd_drv_keys_cod);
set_timer (ST_KBD_1, DEC_NO_RERUN, REPEAT_DELAY);
_kbd_drv = KBD_DRV_REPEAT;
}
briok;
 
case KBD_DRV_WAIT_UP:
if (!(keys_flags & (1<<KEYS_PRESSED_FLG)))
{
set_timer (ST_KBD_1, DEC_NO_RERUN, DEBOUNCE_DELAY);
_kbd_drv = KBD_DRV_UP;
}
briok;
 
case KBD_DRV_UP:
if (woyt (ST_KBD_1))
{
if (!(keys_flags & (1<<KEYS_PRESSED_FLG)))
_kbd_drv = KBD_DRV_NONE;
else
_kbd_drv = KBD_DRV_WAIT_UP;
}
briok;
 
default:
briok;
}
}
//========================================================================
0
0 / 0 / 0
Регистрация: 20.07.2012
Сообщений: 620
30.09.2014, 15:45
Давайте разговаривать предметно. Без примеров.
Я, как видите, порешал эту задачу. Знаю, какие возникают проблемы.

Почитал ваш код.
Наши решения по сути не отличаются. Что в общем-то логично, ибо врядли что-то оригинальное для этой задачи можно придумать.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
30.09.2014, 16:16
Цитата Сообщение от Myrmyk
Давайте разговаривать предметно. Без примеров.
Я, как видите, порешал эту задачу. Знаю, какие возникают проблемы.
Давайте предметно. Без комментариев я не могу прочитать код. Соответственно, не могу оценить.
Но switch-case у вас присутствует. А условия я обозначил. О чем и речь. Без автоматного программирования или пусть будет просто switch-case технология задачи очень тяжело решаются. Спор закончен? Как я и говорил, автоматное программирование, switch-case технология не имеет никакого отношения к диспетчерам и RTOS. Это абсолютно самостоятельное направление.
0
0 / 0 / 0
Регистрация: 20.07.2012
Сообщений: 620
30.09.2014, 16:20
Ну, ок...
0
0 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 1,445
01.10.2014, 01:20
Демиург красава. Любую программу можно обозвать конечным автоматом. Количество состояний (дампов памяти и регистров) конечно? Конечно. Входящие символы есть? Есть. Конечный автомат! Сжечь ведьму!

Твой код настолько же нечитаем, как и у Мирмика.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
01.10.2014, 08:09
Цитата Сообщение от Stiit.mi
Демиург красава. Любую программу можно обозвать конечным автоматом. Количество состояний (дампов памяти и регистров) конечно? Конечно. Входящие символы есть? Есть. Конечный автомат! Сжечь ведьму!

Твой код настолько же нечитаем, как и у Мирмика.
Ну а вы что имеете против? Мирмик сказал, что якобы новичкам рано знать, что такое автоматное программирование, switch-case технология. Я же говорю, что без этого программа превращается в нечитаемую мешанину из флагов, условий и так далее. И я привел простейший пример - функцию опроса кнопок.
По поводу читабельности кода. У каждого свой стиль. Вы привели свои примеры. И на что я обратил внимание, так это на то, что вы уделяете очень большое внимание гламурности. На каждый чих своя функция. Там где можно выделить явные состояния, вы будете это превращать в якобы "идеальный код". Я вам тогда сказал, покажите на моем примере ваш "идеальный код". Вы это сделали? Нет. Попытались, конечно. Там, где можно гораздо проще написать, вы увлеклись гламурностью.
0
0 / 0 / 0
Регистрация: 14.02.2014
Сообщений: 80
01.10.2014, 19:26
Цитата Сообщение от dymyurk1978
|>)))))))@>
Разве ваш код не есть мешанина флагов условий и уровней абстракции?
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
01.10.2014, 19:37
Условия в программе будут всегда. Только набор условий зависит от того, как написать программу, в первую очередь.
0
0 / 0 / 0
Регистрация: 14.02.2014
Сообщений: 80
01.10.2014, 19:51
не только лишь все могут юзать КА.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
01.10.2014, 20:10
Цитата Сообщение от sitirom366
не только лишь все могут юзать КА.
Слушай, умник. Я тебе даю точно такой же способ доказать свою правоту. Дино: опрос клавиатуры. Удержание, автоповтор. Пусть кнопки висят на одном порту. От тебя пример без использования КА и switch-case технологии. Или отвечай за свои слова или проходи мимо.
0
0 / 0 / 0
Регистрация: 14.02.2014
Сообщений: 80
01.10.2014, 20:48
Как бы не будет такого. Но связно говорить вы все равно не в состоянии.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
01.10.2014, 21:07
Э-э-э, нет чувак. Все это время я от тебя не видел ни одного вменяемого сообщения. Сейчас ты самым явным образом слился. Сказал, за свои слова не ответил. Грош цена твоим сообщениям. Так очередной чувак инетовский, которому лишь бы с умным видом что-то написать. Так что в дальнейшем, уважаемый, проходите мимо.
0
0 / 0 / 0
Регистрация: 14.02.2014
Сообщений: 80
01.10.2014, 21:21
Сам придумал мой слив сам меня поймал сам обиделся сам ушел?) Окче, онанируй дальше на суперлупы с задержками.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
01.10.2014, 21:23
Или отвечай за свои слова или иди мимо. Разговор закончен. Мне есть чем ответить. Ты ничем свои слова не подтвердил.
0
0 / 0 / 0
Регистрация: 14.02.2014
Сообщений: 80
01.10.2014, 21:27
Я за СВОИ слова отвечаю, а не за твои фантазии. Хотя это надо бы в личку, лф бан или че там.
0
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,514
01.10.2014, 21:31
Цитата Сообщение от dymyurk1978
Цитата Сообщение от sitirom366
не только лишь все могут юзать КА.
Дино: опрос клавиатуры. Удержание, автоповтор. Пусть кнопки висят на одном порту. От тебя пример без использования КА и switch-case технологии.
всю жизнь было просто синтаксическим сахаром для if() else if() else if(), а тут вдруг технология.

Code
1
2
3
4
5
6
7
void scan_keyboard(){
for (int i = 0; i < BUTTON_NUM; i++){
if (active(BUTTON[i])) button_timer[i]++; else button_timer[i] = 0;
if (button_timer[i] == BUTTOM_DEBOUNCE_TIME) button_event_fifo.push(i);
if (button_timer[i] == BUTTON_AUTOREPEAT_TIME + BUTTOM_DEBOUNCE_TIME + 1){ button_timer[i] = BUTTOM_DEBOUNCE_TIME + 1; button_event_fifo.push(i);}
}
}
только не надо объяснять что это тоже конечный автомат состояние которго хранится в переменной таймера, Stiit.mi всё правильно сказал.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.10.2014, 21:31

Таймеры
Здравствуйте, скажите какие есть готовые таймеры? Пользовался поиском, нашел только winapi и простую библиотеку time.h, только почему то...

Таймеры
Пишу mailslot. И не могу засечь передачу данный. В строке выдает ошибку доступа: double seconds = (double)(stop - start) /...

Таймеры
Нужно зачудить такое: Каждые 500 мс. нужно менять картинку в image1. Image1.Picture.LoadFromfile ('1.jpg'); ...

Таймеры
Здравствуйте. Можно ли получить с ножки МК прямоугольные импульсы с определенной частотой(до 1кГц) не вмешиваясь в основную программу.

Таймеры
У меня опять вопрос по кишкам винды и книжке Марка Руссиновича (6 издание &quot;Внутреннее устройство MS Windows&quot;) Системное время...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru