ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
25 ноября
110730
Argon (20.01.2008 23:15, просмотров: 40528)
Возможно, обнаружился баг scmRTOS. Есть 3 процесса. Есть флаги OS::TEventFlag Buttons. OS::TEventFlag Sound_Start. 1. Высший приоритет. Опрашивает клавиатуру. При изменении сигналит: Buttons.Signal(); Sound_Start.Signal(); далее процесс спит 50 мсек. Выставленные флаги сбрасываются только в процессах с низшим приоритетом. 2. Средний приоритет. Ждет в спячке Sound_Start (флаг после этого автоматически сбрасывается), после чего запускает генерацию звука - читает из флэшки сэмплы в буфер и выводит в ЦАП, в промежутках спит. Время спячки однозначно ненулевое, так что он иногда дает время процессу с низшим приоритетом. 3. Низший приоритет. Ловит Buttons. Но по какой-то странной причине Buttons ловится раз из 10 нажатий. Больше этот флаг нигде не сбрасывается. if(Buttons.Wait(10)) { ...некие действия (вывод на дисплей и т.п.)... } И в этот-то цикл управление передается где-то раз из 10. Неизвестно где Buttons оказывается сброшен. Предположение такое: его сбрасывает ядро ОС при обработке Wait. Т.е. вроде как управление должно перейти в цикл. Но управление сразу же забирает 2-й, более приоритетный процесс (это-то работает надежно), т.к. ему сначала нужно насосать сэмплы в буфер. И почему-то ОС "забывает" передать управление 3-му процессу, несмотря на то, что флаг сброшен. Можно, конечно, в 3-м процессе ожидание убрать, т.к. он менее приоритетный и ничего страшного, если он будет молотить в тупом цикле. Тогда все работает, но факт остается фактом, хотелось бы разобраться с явлением.