О пользе паники
25.06.2006 15:13:39Из-за повышенного уровня собственного разгильдяйства приходится в срочном порядке воевать с зеленым монстром, поскольку сдавать осенью экзамен на последней сессии как-то несолидно. Да и вообще, осенью я еще ничего не сдавал, нечего и начинать, неаккуратно это. Однако, в процессе борьбы появляются всякие интересные наблюдения.
На SDK у меня рулит ОС CustOS, собственного сочиненья, она успешно прикидывается ОСРВ и всячески управляется с его железом, а заодно ведает многопоточностью. Есть там, естественно, замечательный драйвер UART, который в данной работе чуть ли не всему голова (ибо сетевые протоколы реализуем поверх того самого UART). Драйвер имеет обработчик прерывания. Очень простой. ADuC812, который сидит в SDK, работает тривиально — устанавливает бит RI или TI, в зависимости от того, чего он хочет — поделиться свежим байтом или послать новый и дергает хорошо известное прерывание.
Здесь надо еще сказать, что в CustOS есть самая главная функция — panic(). Это чистое произведение искусства, которое вырубает все прерывания, после чего бесконечно и яростно моргает диодами. Вызовы паники аккуратными капканами расставлены по всему коду CustOS, дабы ловить заблудшую в дебрях кода ОС. В основном, капканы эти стоят там, где никогда ничего не должно происходить, поэтому, если уж мы каким-то образом попадаем в обозначенный код — значит происходит что-то очень страшное.
Ну и, стало быть, мощный обработчик прерывания UART в моем исполнении выглядит где-то так:
if (RI) { ...blah-blah-blah... } else if (TI) { ...blah-blah-blah... } else { panic(); }
Ежу понятно, что паники никогда быть не может, потому что без установленных RI или TI у нас прерывания быть не может, так? Нет! В процессе продвижения к цели я дошел до ситуации, когда паника происходит очень даже стабильно и замечательно. Надо сказать, что драйвер очень давно существует и работал до сего момента очень даже стабильно.
Панику пришлось обрубить, однако проблемы передачи какие-то остались. Интересно живем.