Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как в макросе устанавливать значение, если другое значение такое-то
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
demiurg1978
Делаю тут простенький диспетчер. Скомпилиовал его из своих наработок, задумок и примеров в интернете. Сразу скажу, я не сторонник применения диспетчеров. Считаю их миной замедленного действия. Но есть некритичные проектики, которые можно быстро набросать на диспетчере. Какие-нибудь мигалки светодиодами, всякие световые эффекты, ну в общем, некритичное и не опасное.
Есть макрос:

CODE

typedef struct task
{
void (*func) (void);
u08 status;
u16 pause;
u16 period;
} task;

bool _set_task (task tmp_task);
#define set_task(...) _set_task((task){__VA_ARGS__})

bool _set_task (task tmp_task)
{
u08 i = 0;

if (Tail_Task_Queue < MAX_TASKS)
{
while (i < Tail_Task_Queue)
{
if (tmp_task .func == Task_Queue [i] .func)
{
Task_Queue [i] = tmp_task;
return true;
}

i++;
}

Task_Queue [Tail_Task_Queue] = tmp_task;

Tail_Task_Queue++;

return true;
}

return false;
}

set_task (
.func = led_1_switch,
.status = (MULT_EXEC_FLG | RUN_TASK_FLG),
.pause = 0,
.period = 1
);


Хочется покрасивше оформить следующее: если элемент структуры pause = 0, установить флаг RUN_TASK_FLG в элементе status. Пока я явно задаю этот флаг. Если это можно сделать только перечислением параметров, а не структурой, готов с этим смириться. Что-то вроде:

Код
   set_task (led_1_switch, MULT_EXEC_FLG, 0, 1000);


В предыдущей версии программы было следующее:
Код
            if (!(task_pause)) // Если 0, то установка флага на немедленное исполнение.
               Task_Queue [cnt]. status = (task_status | RUN_TASK_FLG);
            else
               Task_Queue [cnt]. status = task_status;
Dog Pawlowa
Для некритичных проектов зачем вообще задачи? Один цикл и все.

А по существу - где-то в недрах _set_task анализируете pause и устанавливаете нужный флаг.
А напрямую чем не устраивает?
Может убрать один из параметров - или pause, или флаг, если это взаимовлияние трудно запомнить?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.