Цитата(AVR @ Jul 6 2006, 23:35)
А из траблов программирования, то например что первое попалось на глаза это если компилировать с поддержкой функций-сервисов ОС в обработчиках прерываний, то программа почему-то вешается сразу.
Напомню, что для поддержки сервисов в прерываниях нужно:
- использовать соответствующую версию библиотеки (с буквой i);
- разрешить нужные сервисы в явном виде в файле конфигурации;
- использовать в прерываниях версии сервисов, для того предназначенных (с окончанием на I).
Иначе будет что угодно, в том числе, и зависы.
Вообще, если можно обойтись в прерывании без вызова сервисов (или вообще других функций, особенно определенных в других файлах), то лучше так и делать. Иначе мы получим сохранение множества регистров (так как в общем случае компилятор имеет право использовать половину регистров в других функциях). В моей ситуации, когда мне было важно отрабатывать относительно точное время для одной из задач по прерыванию таймера, я в прерывании просто взводил битовый флаг в регистровой переменной, а снаружи его проверял (в основном цикле планировщика) и уже оттуда вызывал сервис OS. Получалось, что я, практически, из прерывания стартовал внешнюю задачу (которая получала при этом наивысший приоритет по определению из документации), и ничего не терял (так как у нас допустима погрешность в пределах кванта времени - раньше мы все равно не можем гарантировать вызов задачи.