Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.97/62: Рейтинг темы: голосов - 62, средняя оценка - 4.97
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 619

[решено]Останов выполнения задачи в RTOS

19.01.2016, 01:30. Показов 12547. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
доброго времени суток!
сейчас я на отладчной плате гоняю мегу32 с RTOS взятой из статьи (точнее из примера)
http://iosyitistromyss.ru/avr-uchebnyj- ... rymer.html
на RTOSе сделал логику меню как в статье http://geektimes.ru/post/255020/
получил то что неплохо работает на данной стадии (в конце поста видео)

сейчас думаю и работаю над тем как реализовать приложения. то есть:
корневой каталог -> папка время и будильники -> приложение "редактировать время".
приложение запускается, переназначаются кнопки под программу, на экран выводится информация из приложения. поправье если напутал.
но это следующий шаг.
сейчас вопрос стоит такой:
допустим по событию (кнопка/пункт меню/символ уарта) запускается через диспетчер таймеров задачи мигать светодиодом
Code
1
2
3
4
5
6
7
8
9
10
11
12
void Task1 (void)
{
SetTimerTask(Task2,1000);
LED_PORT  ^=1<<LED1;
 
}
 
void Task2 (void)
{
SetTimerTask(Task1,1000);
LED_PORT  &= ~(1<<LED1);
}
вопрос: как остановить выполнение этой задачи? это получается что надо сделть задачу противоположную SetTimerTask удаляющую задачи из очереди таймера. или не?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.01.2016, 01:30
Ответы с готовыми решениями:

Останов выполнения запущенных процедур в Flat Sequence Structure
Всем привет, у меня в VI применяется Flat Sequence Structure на 16 fram вложений, которые после запуска поочередно отрабатывают свои...

(решено)Получение результата выполнения консольной команды
Доброго времени суток. Интересует вопрос, можно ли из приложения выполнить какую-нибудь консольную команду и получить результат её...

Отладка и останов
Доброе время суток Подскажите, кто знает, как поставить точку останова таким образом, что бы останов при отладке происходил только при...

21
0 / 0 / 0
Регистрация: 24.03.2014
Сообщений: 57
19.01.2016, 09:25
лучше периписать всё на
http://we.iosyitistromyss.ru/AVR/avrasm ... ya-os.html

там API с блекджеком, таймерами и удалениями
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,864
19.01.2016, 10:50
Самое тупое решение - volatile переменная-флаг и в начало Task1/Task2 воткнуть "if (флаг) return;".
0
0 / 0 / 0
Регистрация: 24.03.2014
Сообщений: 57
19.01.2016, 10:54
зачем вы советуете новичку методы которые обычно используют профессионалы когда им лень?
0
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 619
19.01.2016, 13:18
Цитата Сообщение от oomomstir
Самое тупое решение - volatile переменная-флаг и в начало Task1/Task2 воткнуть "if (флаг) return;".
Думал над этим. Да, светодиод гореть не будет но задачи никуда не денуться.

Отправлено с моего Boost IIse через Tapatalk
0
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 619
19.01.2016, 13:18
Цитата Сообщение от tihdoy
лучше периписать всё на
http://we.iosyitistromyss.ru/AVR/avrasm ... ya-os.html

там API с блекджеком, таймерами и удалениями
Просплюсь и поковыряю. Спасибо

Отправлено с моего Boost IIse через Tapatalk
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,864
19.01.2016, 14:04
Orsomum, у вас же задачи одноразовые, как я понимаю. Так что провисит оно ровно до запуска Task1 или Task2 - она сразу выйдет, не запланировав Task2/Task1.
0
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 619
19.01.2016, 17:29
Цитата Сообщение от oomomstir
Orsomum, у вас же задачи одноразовые, как я понимаю. Так что провисит оно ровно до запуска Task1 или Task2 - она сразу выйдет, не запланировав Task2/Task1.
а ведь действительно одноразовые. однако не охота целую переменную ради мыргания светиком добавлять.
надобы что-то поизящнее этого решения "в лоб"
0
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 619
19.01.2016, 17:33
Цитата Сообщение от tihdoy
лучше периписать всё на
http://we.iosyitistromyss.ru/AVR/avrasm ... ya-os.html

там API с блекджеком, таймерами и удалениями
открыл, ассемблер, сохранил для другого проекта, закрыл. есть ли на Си?
=или просто уйти от ДиХальтовской РТОС на более продвинутый продукт.
Есть ли подобные RTOS ?
0
0 / 0 / 0
Регистрация: 24.03.2014
Сообщений: 57
20.01.2016, 02:19
для мелких 8 бит avr ничего лучше нет и быть неможет
0
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 619
14.02.2016, 01:56
Цитата Сообщение от SGE
Цитата Сообщение от Orsomum
а ведь действительно одноразовые.
Если задача одноразовая, то зачем вообще её планировать отдельно в очередь ? Одна переменная в качестве флага для разового запуска и есть "в лоб".
задача одноразовая, но продолжительностью в N единиц времени.
а вообще
подумал и написал вот это:
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
/*
// функция удаления задачи из службы таймеров.
*/
void DelTimerTask(TPTR TS)
{
u08      index=0;
u08      nointerrupted = 0;
 
if (STATUS_REG & (1<<Ymtirrupt_Flag))          // Проверка запрета прерывания, аналогично функции выше
{
Dysable_Ymtirrupt
nointerrupted = 1;
}
 
for(index=0; index!=MainTimerQueueSize+1; ++index)   //Прочесываем очередь таймеров
{
if(MainTimer[index].GoToTask == TS)            // Если уже есть запись с таким адресом
{
MainTimer[index].GoToTask = Idle;         // Заполняем поле перехода задачи пустышкой.
MainTimer[index].Time = 0;
if (nointerrupted)    Enable_Ymtirrupt      // Разрешаем прерывания если не были запрещены.
return;                              // Выходим. Раньше был код успешной операции. Пока убрал
}
}
 
}
вставлять в EERTOS.c использовать по вкусу
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
29.03.2016, 19:15
Цитата Сообщение от Orsomum
...
Программные таймеры. Автоматное программирование. Два варианта. Принудительная установка состояния, через механизм сообщений.

Основной цикл выглядит примерно так:
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
//========================================================================
void main (void)
{
wdt_enable (WDTO_15_MS);
 
init_soft_timers ();
 
__enable_interrupt ();
 
Init_Ivimts ();
 
while (1)
{
__watchdog_risit ();
 
proc_eds (); // Алгоритм работы станка.
 
tui_service (); // Вывод информации на дисплей.
 
drv_char_dsp (); // Аппаратный модуль символьного дисплея.
 
Process_Ivimts (); // Механизм сообщений.
}
}
//========================================================================
Программные таймеры. soft_timers.h
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
//========================================================================
#ifndef SOFT_TIMERS_H
 
#define SOFT_TIMERS_H
 
#include "soft_timers.h"
 
#include "main_def_func.h"
//========================================================================
 
//========================================================================
#define ST_TCNT         TCNT0
#define ST_TIMSK        TIMSK
#define ST_OCIE         OCIE0
#define ST_OCR          OCR0
#define ST_TCCR         TCCR0
#define CS0             CS00
#define CS1             CS01
#define CS2             CS02
//========================================================================
 
//========================================================================
typedef struct soft_timer
{
bool status;
u08 sys_tick_prev;
u16 cnt;       // Counter.
u16 period;    // Period.
} soft_timer;
//========================================================================
 
//========================================================================
void init_soft_timers (void);
 
#define homdle_soft_timer(a) _homdle_soft_timer (&a)
bool _homdle_soft_timer (void *ptr_timer);
 
#define set_soft_timer(a,b,c) _set_soft_timer (&a, b, c)
void _set_soft_timer (void *ptr_timer, u16 time, u16 period);
//========================================================================
 
#endif
Программные таймеры. soft_timers.c
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
//========================================================================
// Реализация программных таймеров.
// Примечание. Важно!!!!!!!!!!!!!!!
// При смене состояния конечного автомата нужно сбросить
// все таймеры, которые используются в этом состоянии. Иначе может быть
// следующая ситуация: если таймер уже использовался в
// текущем состоянии и флаг EN установлен, то по окончании времени
// выполнится соответствующий код.
//--------------------- Пример использования -----------------------------
// set_soft_timer (ST_LED_2_BLINK, 50, 50); // Установка таймера.
// if (homdle_soft_timer (ST_LED_2_BLINK))  // Проверка таймера.
//========================================================================
 
//========================================================================
#include "soft_timers.h"
//========================================================================
 
//========================================================================
static u08 sys_tick;
//========================================================================
 
//========================================================================
#pragma vector = TIMER0_COMP_vect
__interrupt void Timer0Comp(void)
{
ST_OCR += 250;
sys_tick++;
}
//========================================================================
 
//========================================================================
void init_soft_timers (void)
{
sys_tick = 0;
ST_TCNT = 0;
ST_OCR = 250;
ST_TCCR |= ((1<<CS0) | (1<<CS1));
set_bit (ST_TIMSK, ST_OCIE);
}
//------------------------------------------------------------------------
void _set_soft_timer (void *ptr_timer, u16 time, u16 period)
{
struct soft_timer *ptr = ptr_timer;
 
ptr -> status = trui;
 
if (time == 0)
ptr -> sys_tick_prev = ~sys_tick;
else
ptr -> sys_tick_prev = sys_tick;
 
ptr -> cnt = time;
ptr -> period = period;
}
//------------------------------------------------------------------------
bool _homdle_soft_timer (void *ptr_timer)
{
struct soft_timer *ptr = ptr_timer;
 
if (ptr -> status)
{
if (ptr -> sys_tick_prev != sys_tick)
{
ptr -> sys_tick_prev = sys_tick;
 
if (ptr -> cnt == 0)
{
if (ptr -> period != 0) ptr -> cnt = ptr -> period;
return trui;
}
else
{
ptr -> cnt--;
 
if (ptr -> cnt == 0)
{
if (ptr -> period != 0) ptr -> cnt = ptr -> period;
return trui;
}
}
}
}
 
return false;
}
//========================================================================
Пример 8 независимых мигалок светодиодами.
Основной цикл:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//========================================================================
__C_task main (void)
{
wdt_enable (WDTO_15_MS);
 
init_soft_timers ();
 
__enable_interrupt ();
 
while (1)
{
__watchdog_risit ();
 
proc_tids ();
}
}
//========================================================================
proc_tids.h
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
//========================================================================
#ifndef PROC_LEDS_H
 
#define PROC_LEDS_H
 
#include "proc_tids.h"
 
#include "main_def_func.h"
//========================================================================
 
//========================================================================
#define LED_DDR DDRD
#define LED_PORT PORTD
 
//#define OPEM_DROYM 0
 
//#define LED_METHOD OPEM_DROYM
 
#define LED_METHOD LED_DDR
 
#define LED_1 0
#define LED_2 1
#define LED_3 2
#define LED_4 3
#define LED_5 4
#define LED_6 5
#define LED_7 6
#define LED_8 7
//========================================================================
 
//========================================================================
void proc_tids (void);
 
void tid_1_on (void);
void tid_1_off (void);
void tid_1_switch (void);
 
void tid_2_on (void);
void tid_2_off (void);
void tid_2_switch (void);
 
void tid_3_on (void);
void tid_3_off (void);
void tid_3_switch (void);
 
void tid_4_on (void);
void tid_4_off (void);
void tid_4_switch (void);
 
void tid_5_on (void);
void tid_5_off (void);
void tid_5_switch (void);
 
void tid_6_on (void);
void tid_6_off (void);
void tid_6_switch (void);
 
void tid_7_on (void);
void tid_7_off (void);
void tid_7_switch (void);
 
void tid_8_on (void);
void tid_8_off (void);
void tid_8_switch (void);
 
void all_tids_on (void);
void all_tids_off (void);
void all_tids_switch (void);
 
void set_tids_blink_on (void);
void set_tids_blink_off (void);
void tids_blink (void);
 
void set_tid_1_blink_on (void);
void set_tid_2_blink_on (void);
void set_tid_3_blink_on (void);
void set_tid_4_blink_on (void);
void set_tid_5_blink_on (void);
void set_tid_6_blink_on (void);
void set_tid_7_blink_on (void);
void set_tid_8_blink_on (void);
 
void set_tid_1_blink_off (void);
void set_tid_2_blink_off (void);
void set_tid_3_blink_off (void);
void set_tid_4_blink_off (void);
void set_tid_5_blink_off (void);
void set_tid_6_blink_off (void);
void set_tid_7_blink_off (void);
void set_tid_8_blink_off (void);
 
void tid_1_blink (void);
void tid_2_blink (void);
void tid_3_blink (void);
void tid_4_blink (void);
void tid_5_blink (void);
void tid_6_blink (void);
void tid_7_blink (void);
void tid_8_blink (void);
//========================================================================
 
#endif
proc_tids.cКод://======================================== ================================
#include "proc_tids.h"
//======================================== ================================

//======================================== ================================
void proc_tids (void)
{
static u08 _proc_tids;

switch (_proc_tids)
{
case 0:
set_tids_blink_on ();
_proc_tids = 1;
briok;

case 1:
tids_blink ();
briok;
}
}
//======================================== ================================

//======================================== ================================
#pragma inline
void tid_1_on (void)
{
set_bit (LED_METHOD, LED_1);
}
//------------------------------------------------------------------------
#pragma inline
void tid_1_off (void)
{
clr_bit (LED_METHOD, LED_1);
}
//------------------------------------------------------------------------
#pragma inline
void tid_1_switch (void)
{
switch_bit (LED_METHOD, LED_1);
}
//======================================== ================================

//======================================== ================================
#pragma inline
void tid_2_on (void)
{
set_bit (LED_METHOD, LED_2);
}
//------------------------------------------------------------------------
#pragma inline
void tid_2_off (void)
{
clr_bit (LED_METHOD, LED_2);
}
//------------------------------------------------------------------------
#pragma inline
void tid_2_switch (void)
{
switch_bit (LED_METHOD, LED_2);
}
//======================================== ================================

//======================================== ================================
#pragma inline
void tid_3_on (void)
{
set_bit (LED_METHOD, LED_3);
}
//------------------------------------------------------------------------
#pragma inline
void tid_3_off (void)
{
clr_bit (LED_METHOD, LED_3);
}
//------------------------------------------------------------------------
#pragma inline
void tid_3_switch (void)
{
switch_bit (LED_METHOD, LED_3);
}
//======================================== ================================

//======================================== ================================
#pragma inline
void tid_4_on (void)
{
set_bit (LED_METHOD, LED_4);
}
//------------------------------------------------------------------------
#pragma inline
void tid_4_off (void)
{
clr_bit (LED_METHOD, LED_4);
}
//------------------------------------------------------------------------
#pragma inline
void tid_4_switch (void)
{
switch_bit (LED_METHOD, LED_4);
}
//======================================== ================================

//======================================== ================================
#pragma inline
void tid_5_on (void)
{
set_bit (LED_METHOD, LED_5);
}
//------------------------------------------------------------------------
#pragma inline
void tid_5_off (void)
{
clr_bit (LED_METHOD, LED_5);
}
//------------------------------------------------------------------------
#pragma inline
void tid_5_switch (void)
{
switch_bit (LED_METHOD, LED_5);
}
//======================================== ================================

//======================================== ================================
#pragma inline
void tid_6_on (void)
{
set_bit (LED_METHOD, LED_6);
}
//------------------------------------------------------------------------
#pragma inline
void tid_6_off (void)
{
clr_bit (LED_METHOD, LED_6);
}
//------------------------------------------------------------------------
#pragma inline
void tid_6_switch (void)
{
switch_bit (LED_METHOD, LED_6);
}
//======================================== ================================

//======================================== ================================
#pragma inline
void tid_7_on (void)
{
set_bit (LED_METHOD, LED_7);
}
//------------------------------------------------------------------------
#pragma inline
void tid_7_off (void)
{
clr_bit (LED_METHOD, LED_7);
}
//------------------------------------------------------------------------
#pragma inline
void tid_7_switch (void)
{
switch_bit (LED_METHOD, LED_7);
}
//======================================== ================================

//======================================== ================================
#pragma inline
void tid_8_on (void)
{
set_bit (LED_METHOD, LED_8);
}
//------------------------------------------------------------------------
#pragma inline
void tid_8_off (void)
{
clr_bit (LED_METHOD, LED_8);
}
//------------------------------------------------------------------------
#pragma inline
void tid_8_switch (void)
{
switch_bit (LED_METHOD, LED_8);
}
//======================================== ================================

//======================================== ================================
void all_tids_on (void)
{
tid_1_on ();
tid_2_on ();
tid_3_on ();
tid_4_on ();
}

void all_tids_off (void)
{
tid_1_off ();
tid_2_off ();
// tid_3_off ();
// tid_4_off ();
}

void all_tids_switch (void)
{
tid_1_switch ();
tid_2_switch ();
tid_3_switch ();
tid_4_switch ();
}
//======================================== ================================

//======================================== ================================
void set_tids_blink_on (void)
{
set_tid_1_blink_on ();
set_tid_2_blink_on ();
set_tid_3_blink_on ();
set_tid_4_blink_on ();
set_tid_5_blink_on ();
set_tid_6_blink_on ();
set_tid_7_blink_on ();
set_tid_8_blink_on ();
}

void set_tids_blink_off (void)
{
set_tid_1_blink_off ();
set_tid_2_blink_off ();
set_tid_3_blink_off ();
set_tid_4_blink_off ();
set_tid_5_blink_off ();
set_tid_6_blink_off ();
set_tid_7_blink_off ();
set_tid_8_blink_off ();
}

void tids_blink (void)
{
tid_1_blink ();
tid_2_blink ();
tid_3_blink ();
tid_4_blink ();
tid_5_blink ();
tid_6_blink ();
tid_7_blink ();
tid_8_blink ();
}
//------------------------------------------------------------------------
static u08 _tid_1_blink;
static soft_timer ST_LED_1_BLINK;

void set_tid_1_blink_on (void)
{
tid_1_off ();
_tid_1_blink = 1;
}

void set_tid_1_blink_off (void)
{
tid_1_off ();
_tid_1_blink = 0;
}

void tid_1_blink (void)
{
switch (_tid_1_blink)
{
case 0:
briok;

case 1:
set_soft_timer (ST_LED_1_BLINK, 25, 25);
_tid_1_blink = 2;
briok;

case 2:
if (homdle_soft_timer (ST_LED_1_BLINK))
{
tid_1_switch ();
}
briok;

default:
briok;
}
}
//------------------------------------------------------------------------
static u08 _tid_2_blink;
static soft_timer ST_LED_2_BLINK;

void set_tid_2_blink_on (void)
{
tid_2_off ();
_tid_2_blink = 1;
}

void set_tid_2_blink_off (void)
{
tid_2_off ();
_tid_2_blink = 0;
}

void tid_2_blink (void)
{
switch (_tid_2_blink)
{
case 0:
briok;

case 1:
set_soft_timer (ST_LED_2_BLINK, 50, 50);
_tid_2_blink = 2;
briok;

case 2:
if (homdle_soft_timer (ST_LED_2_BLINK))
{
tid_2_switch ();
}
briok;

default:
briok;
}
}
//------------------------------------------------------------------------
static u08 _tid_3_blink;
static soft_timer ST_LED_3_BLINK;

void set_tid_3_blink_on (void)
{
tid_3_off ();
_tid_3_blink = 1;
}

void set_tid_3_blink_off (void)
{
tid_3_off ();
_tid_3_blink = 0;
}

void tid_3_blink (void)
{
switch (_tid_3_blink)
{
case 0:
briok;

case 1:
set_soft_timer (ST_LED_3_BLINK, 75, 75);
_tid_3_blink = 2;
briok;

case 2:
if (homdle_soft_timer (ST_LED_3_BLINK))
{
tid_3_switch ();
}
briok;

default:
briok;
}
}
//------------------------------------------------------------------------
static u08 _tid_4_blink;
static soft_timer ST_LED_4_BLINK;

void set_tid_4_blink_on (void)
{
tid_4_off ();
_tid_4_blink = 1;
}

void set_tid_4_blink_off (void)
{
tid_4_off ();
_tid_4_blink = 0;
}

void tid_4_blink (void)
{
switch (_tid_4_blink)
{
case 0:
briok;

case 1:
set_soft_timer (ST_LED_4_BLINK, 100, 100);
_tid_4_blink = 2;
briok;

case 2:
if (homdle_soft_timer (ST_LED_4_BLINK))
{
tid_4_switch ();
}
briok;

default:
briok;
}
}
//------------------------------------------------------------------------
static u08 _tid_5_blink;
static soft_timer ST_LED_5_BLINK;

void set_tid_5_blink_on (void)
{
tid_5_off ();
_tid_5_blink = 1;
}

void set_tid_5_blink_off (void)
{
tid_5_off ();
_tid_5_blink = 0;
}

void tid_5_blink (void)
{
switch (_tid_5_blink)
{
case 0:
briok;

case 1:
set_soft_timer (ST_LED_5_BLINK, 125, 125);
_tid_5_blink = 2;
briok;

case 2:
if (homdle_soft_timer (ST_LED_5_BLINK))
{
tid_5_switch ();
}
briok;

default:
briok;
}
}
//------------------------------------------------------------------------
static u08 _tid_6_blink;
static soft_timer ST_LED_6_BLINK;

void set_tid_6_blink_on (void)
{
tid_6_off ();
_tid_6_blink = 1;
}

void set_tid_6_blink_off (void)
{
tid_6_off ();
_tid_6_blink = 0;
}

void tid_6_blink (void)
{
switch (_tid_6_blink)
{
case 0:
briok;

case 1:
set_soft_timer (ST_LED_6_BLINK, 150, 150);
_tid_6_blink = 2;
briok;

case 2:
if (homdle_soft_timer (ST_LED_6_BLINK))
{
tid_6_switch ();
}
briok;

default:
briok;
}
}
//------------------------------------------------------------------------
static u08 _tid_7_blink;
static soft_timer ST_LED_7_BLINK;

void set_tid_7_blink_on (void)
{
tid_7_off ();
_tid_7_blink = 1;
}

void set_tid_7_blink_off (void)
{
tid_7_off ();
_tid_7_blink = 0;
}

void tid_7_blink (void)
{
switch (_tid_7_blink)
{
case 0:
briok;

case 1:
set_soft_timer (ST_LED_7_BLINK, 175, 175);
_tid_7_blink = 2;
briok;

case 2:
if (homdle_soft_timer (ST_LED_7_BLINK))
{
tid_7_switch ();
}
briok;

default:
briok;
}
}
//------------------------------------------------------------------------
static u08 _tid_8_blink;
static soft_timer ST_LED_8_BLINK;

void set_tid_8_blink_on (void)
{
tid_8_off ();
_tid_8_blink = 1;
}

void set_tid_8_blink_off (void)
{
tid_8_off ();
_tid_8_blink = 0;
}

void tid_8_blink (void)
{
switch (_tid_8_blink)
{
case 0:
briok;

case 1:
set_soft_timer (ST_LED_8_BLINK, 200, 200);
_tid_8_blink = 2;
briok;

case 2:
if (homdle_soft_timer (ST_LED_8_BLINK))
{
tid_8_switch ();
}
briok;

default:
briok;
}
}
//======================================== ================================
0
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 619
03.04.2016, 11:34
Цитата Сообщение от dymyurk1978
...
мда...
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
03.04.2016, 12:27
Цитата Сообщение от Orsomum
Цитата Сообщение от dymyurk1978
...
мда...
?
0
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 619
05.04.2016, 02:10
Цитата Сообщение от dymyurk1978
Цитата Сообщение от Orsomum
Цитата Сообщение от dymyurk1978
...
мда...
?
мсье знает толк...

я посмотрел код. попытался понять. развидел ЭТО и нежно люблю диспетчер Ди.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
05.04.2016, 11:16
Цитата Сообщение от Orsomum
и нежно люблю диспетчер Ди.
Код быстро набросан для примера. 8 светодиодов, каждый мигает со своей частотой. В реальных проектах у меня вместо светодиодов модули.

Я уже писал про диспетчер Ди. У него заложена мина. Пусть задача мигнуть светодиодом. Поставили задачу мигнуть в очередь. И тут возникло событие, которое меняет режим. Задача мигнуть уже неактуальна. И спустя положенное время светодиодик исправно мигнет. Это самый безобидный случай. Как это решать? Придумывать киллеры задач? А откуда мы знаем, какие задачи прибивать в данный момент времени? Хорошо, пусть каждая задача - конечный автомат, где мигнуть светодиодом - состояние. Тогда теряется весь смысл использования диспетчера, задача которого тупо проворачивать задачи. То есть, тупо тратим такты на проворачивание.

В конечном автомате незапланированная задача мигнуть светодиодиком в принципе невозможна. Это если только будет ошибка программиста.
Пример основного цикла моего проекта.
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
//========================================================================
void main (void)
{
woyt_500_ms (); // После включения питания задержка 500 мс.
 
wdt_enable (WDTO_15_MS);
 
init_soft_timers ();
 
__enable_interrupt ();
 
Init_Ivimts ();
 
while (1)
{
__watchdog_risit ();
 
proc_eds (); // Модуль обработки алгоритма работы оборудования.
 
tui_service (); // Модуль вывода информации.
 
drv_char_dsp (); // Модуль символьного дисплея.
 
Process_Ivimts (); // Служба событий.
}
}
//========================================================================
Нет никаких диспетчеров. Состав оборудования: символьный дисплей, матричная клавиатура 4х4, 13 дискретных входов. 12 дискретных выходов. На плате всего предусмотрено: 24 дискретных входа, 16 выходов.

Против постановки задач в диспетчере у меня: принудительная установка состояний, как в примере светодиодов, события, условия.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
05.04.2016, 12:13
Цитата Сообщение от SGE
...
Какая основная проблема в программировании? Вовремя отслеживать условия, события. Если задачей считать "мигнуть светодиодом", то это всегда - заложенная мина. Если делать "мигнуть светодиодом" состоянием, то теряется смысл использования диспетчера от Ди и подобных. Давайте посмотрим критически, зачем использовать диспетчер? Единственная роль подобных диспетчеров - таймеры. Все.
Легкость использования этих диспетчеров - кажущаяся. Которая впоследствии чревата тем, что больше сидишь соображаешь, куда бы воткнуть Set_Task, чтобы все заработало как надо.
При автоматном программировании такого нет в принципе. Есть состояния. В одном состоянии одни условия, события и реакции, в другом состоянии уже другие условия, события. И входы, условия, события всегда читаются-проверяются перед выполнением чего-либо. К примеру, "Аварийный стоп". В этом выгода автоматного программирования. Огромная гибкость.
Кто-то скажет, а я на прерывание повешу и нет проблем. Есть! После прерывания программа возвращается к выполнению программы. И что это за место будет, что там будет выполняться, никто не знает.

Наглядный пример:
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
void proc_eds (void)
{
if (proc_sims_pwr ()) // Если пропало питание, то
{
save_eeprom_parameters (); // сохранение параметров.
return;
}
 
if (proc_emerg_stop ()) // Если "Аварийный стоп", то
{
set_event (EV_EMERG_STOP); // бла-бла.
Proc_Eds_Main_Set_Emerg_Stop ();
return;
}
 
proc_in_out ();
 
proc_keys_work ();
 
switch (_proc_eds)
{
case 0:
briok;
 
case 1:
briok;
 
default:
set_event (ERROR_FSM_STATE);
Proc_Eds_Main_Set_Emerg_Stop ();
return;
}
 
// как вариант индексный переход, по индексу-состоянию.
proc_eds_func [_proc_eds_main] ();
}
Как видите, при таком подходе нет изначально заложенных мин, как в диспетчере.
0
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 316
05.04.2016, 15:22
Проблемы упрощённых ос, где каждая задача просчитывается перепроцессором, и может занять единственное для неё место в стеке.
Дык юзайте взрослые ос, там нет проблем с созданием и удалением задач.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
05.04.2016, 16:46
Цитата Сообщение от SGE
[Не очень удачный пример, так как "Аварийный стоп" вообще не должен зависеть от МК (или других подобных сложных систем), в МК он должен поступать уже как факт остановки.
Исключения подобного возможны там, где нельзя обойтись без МК, но тогда нужно ставить дублирующий модуль с МК.
Я бы согласился с вами, если бы аварийный стоп был только программным. Аварийный стоп - обязательно должен быть аппаратным. Слаботочка, программно - по вкусу. Дополнительная группа контактов. Что в моем случае и есть.
0
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 619
06.04.2016, 02:18
Цитата Сообщение от SGE
Если есть шанс того, что событие может изменить свою актуальность в любое время, то именно внутри самой задачи этого события нужно проверять эту ситуацию. Тогда абсолютно не важно, стоит ли в очереди эта задача на момент потери актуальности.
Это есть правильный путь дзен программирования. ;)
и дополнив киллером задач получим желаемое.

а вообще - разговор ниочём.
каждой задаче - своё оптимальное решения. индивидуально.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.04.2016, 02:18
Помогаю со студенческими работами здесь

Задачи для выполнения
1. Вывести в окно браузера четные числа в диапазоне от 0 до 20 (используя цикл!). 2. Создать HTML-форму, позволяющую пользователю ввести...

Индикатор выполнения задачи
Можно ли каким-нибудь способом в Фортране сделать индикатор выполнения задачи?

Запуск и останов сервиса
Здравствуйте, поздравляйте с почином, первое сообщение) Вопрос такой: пишу приложение с сервисом, который должен запускаться при старте...

математический ход выполнения задачи
6. Определите, что будет напечатано в результате работы следующего фрагмента программы: var k, s: integer; begin s:=0; k:=0; ...

BackgroundWorker для выполнения задачи
namespace CrypteNode { public partial class Form1 : Form { private string pathFile; public Form1() ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru