ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
27 ноября
132578 Топик полностью
VVB (26.09.2008 11:15, просмотров: 86) ответил 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 задача нерешаема (без использования функций защиты критического кода). Динамическое выделение памяти применительно встраиваемых систем управления -- неприемлимое зло.