VVB (26.09.2008 11:15, просмотров: 85) ответил Alex B. на вы чо, какой перерасход? По-моему вы не понимаете, чего и как там работает...
описанную вами структуру надо где-то хранить и защищать (это критические данные). Нельзя просто так сделать одну структуру для тревоги и юзать её в разных задачах:
alarm_cmd alarm1;
TYPE_ALARM Alarm;
void Task1 (void)
{
...
alarm1.type = add;
alarm1.addr = &Alarm;
OSQPost(AlarmQ, &alarm1);
...
}
void Task2 (void)
{
...
alarm1.type = release;
alarm1.addr = &Alarm;
OSQPost(AlarmQ, &alarm1);
...
}
Это потенциально опасный код:
1. Допустим, пусть выполняется Task1 и уже выполнилось первое присваивание alarm1.type = add
2. В это время управление получает Task2, переписывает поле .type и кладёт в очередь
3. AlarmTask обрабатывает очередь (у неё максимальный приоритет)
4. По возвращению в Task1 она снова кладёт структуру в очередь, при этом в очереди будет структура с неверной командой
Поэтому надо выделять 2 переменных типа alarm_cmd с разным полем type, для каждой тревоги.
Ну и те же самые рассуждения применимы к адресам тревог, т.е. при использовании всего одной переменной типа alarm_cmd задача нерешаема (без использования функций защиты критического кода).
Динамическое выделение памяти применительно встраиваемых систем управления -- неприемлимое зло.