VVB (25.09.2008 15:48, просмотров: 83) ответил Alex B. на я знаю, и что? примерный код можете привести. Зачем две очереди-то?
Код в процессе написания. Лучше словами объясню. Имеется блок индикации с графическим интерфейсом. В нём крутится uCOS и принимает какие-то данные. По анализу этих данных (которые будут анализироваться во многих задачах и в ISR, но я, скорее всего, вынесу из ISR анализ) нужно:
1. установить/сбросить тревогу высокого, среднего или низкого приоритета
2. обновить индикацию, в соответствие со всеми активными тревогами (причём тревоги разделяются по приоритетам, т.е. надо менять графические объекты, визуальную и звуковую сигнализацию в соответствие с тревогой высшего приоритета).
Я решил сделать так:
1. тревога -- это структура со своими полями (приоритет, тип звука, текст и прочее) во флэше. Тревог много.
2. будет массив активных тревог
3. будет задача, обслуживающая индикацию и звук
4. будет две очереди: AlarmQAdd и AlarmQRelease. При необходимости добавить любую тревогу в массив активных тревог будет вызвана OSQPost(AlarmQAdd, &АДРЕС_ТРЕВОГИ) и соответственно для её удаления OSQPost(AlarmQRelease, &АДРЕС_ТРЕВОГИ)
5. задача обработки разруливает ситуацию с приоритетами и перестраивает массив активных тревог. Задача имеет наивысший приоритет среди прочих задач.
6. обновление текста тревоги на дисплее -- просто тупо вывести в первую строку первую тревогу в массиве активных тревог, затем вторую и т.д. (массив перестраивается при добавлении/удалении тревог).
Можно сделать более удобно? Готов подискутировать и внимательно выслушаю советы бывалых людей.