Alex B. (26.09.2008 12:59, просмотров: 80) ответил VVB на описанную вами структуру надо где-то хранить и защищать (это критические данные).
действительно не понимаете... Зачем статически-то структуру объявлять? во-первых, в uCOS-II есть такой объект как "блоки памяти фиксированного размера". И эту структуру, указатель на которую вы передаете в очереди, вы будете каждый раз выделять из блока памяти, а в задаче, которая команду принимает - освобождать. Все это безопасно (бо встроенный в РТОС сервис) и практично. А сейчас вы используете очереди (которые предназначены для передачи указателя на сообщение) не для передачи указателя, а для передачи самого сообщения, и не важно, что сообщении у вас передается адрес.
Ну а во вторых, если приемник у вас - наиболее приоритетная задача, вообще проблем не вижу. Структура сообщения будет локальной переменной для функции-передатчика, и она уже не попортится, пока сообщение не отработается в приемнике. Каждая функция-передатчик выделит у себя структуру для сообщения. И в этом случае можно (и нужно) использовать не очередь (она нужна чтоб не задерживать приход сообщения), а мейлбокс.
void task_transmitter_1 (void)
{
alarm_cmd alarm;
....
alarm.type = ADD_ALARM;
alarm.addr = &КАКОЙ_ТО_АДРЕС_ВО_ФЛЕШИ;
OSQPost(&AlarmQ, &alarm);
/* сюда мы можем вернуться только после того, как задача-приемник
отработает сообщение, так как у нее наивысший приоритет
*/
....
}
void task_transmitter_2 (void)
{
alarm_cmd alarm;
....
alarm.type = REL_ALARM;
alarm.addr = &КАКОЙ_ТО_ДРУГОЙ_АДРЕС_ВО_ФЛЕШИ;
OSQPost(&AlarmQ, &alarm);
/* сюда мы можем вернуться только после того, как задача-приемник
отработает сообщение, так как у нее наивысший приоритет
*/
....
}
void task_receiver (void)
{
alarm_cmd *alarm;
....
alarm = OSQPend(&AlarmQ, ...);
/* теперь alarm указатель на alarm первой или второй задачи */
....
}
Ну и в третьих - вот это: Динамическое выделение памяти применительно встраиваемых систем управления -- неприемлимое зло. - имхо очередной миф. Местный посетитель abivan разрабатывает девайсы, сетртифицированные для атомной промышленности и вовсю использует динамическое выделение памяти (собственный менеджер правда использует, ну да ладно). Причем на PIC18. А дураку (вас не имею в виду) дай в руки хуй стеклянный - он и хуй разобьет и руки порежет...
Согласуйте импеданс!