Mishka > ты уж, побудь редактором, пожалуйста.
Я не могу быть редактором, так как действительно не знаю этого. Я думаю,
что те кого это действительно интересует могут найти статьи в интернете.
Mishka >
1. Рекурсивная функция — это функция вызывающая сама себя.
в программисткой форме так? :
code text
recursivnaya_func {
// какой то код
recursivnaya_func ();
// какой то код
}
Mishka >
2. Реентерабельная функция — это такая функция, которая не хранит
внутреннего состояния
т.е. в ней не объявляются переменные типа: static ?
Mishka >
т.е. гововоря другими словами, может быть (но не обязана)
вызвана без последствий несколько раз.
в принципе ВСЕ функции и нужны для того чтоб вызывать
много раз один кусок рограммы.
Наверно ты хотел сказать: "может быть вызвана несколько раз не дожидаясь её завершения", т.е. в ходе выполнения.
об этом сказал и Андрей Суворов.
в программисткой форме так? :
code text
interrupt_1 { // это обработчик прерывания
// какой то код
reentabelnaya_func();
// какой то код
}
..............
..............
reentabelnaya_func {
// прерывания разрешены
// какой то код во время исполнения которого
// может происходить прерывание - interrupt_1
}
..............
Первые рекомендации что приходят на ум:
1. Избегать по возможности таких ситуаций в программе
2. Очевидно в таких случаях нельзя в вункциях работать с глобальными переменными.
3. Не понятно что быдет с локальными переменными и static - возможность их сохранения зависит наверно от глубины стека.
здесь по видимому и проявляется "заточеность" AVR под Си - под стек в AVR по моему может использоваться все ОЗУ, в отличии от PIC'ов где стек аппаратный и не глубокий.
Но всеравно на PIC'ах сделано ОГРОМНОЕ колич проф. пром. устройств высокой сложности - значит обсуждаемые нами проблемы не так и страшны.
Mishka >
3. race-condition — попадаем в ситуацию, которая просто не может быть. Это очень актуально для прерываний.
Если есть интерес, то могу привести простенькие примеры.
Я могу представить попадание в непредвиденую ПРОГРАММИСТОМ ситуацию - это не проработаность, не продуманость алгоритма либо ошибки програмное его реализации.
Но !
КАК можно попасть в ситуацию, которой просто не может быть. Опыт - критерий истины в науке, т.е. если мы попали в ситуацию то она безусловно может быть - она уже случилась по меньшей мере 1 раз.
Или я не правильно тебя понял?
Mishka >
Мне кажется, что у любого человека, который пишет нетривиальную программу (более, чем на одну страницу) есть желание выделить повторяющиеся куски кода в отдельные процедуры, и, затем, их переиспользовать.
Ну дак в этом и есть смысл использования функций. Посмотри примеры к компиляторам Си для МК - даже самые маленькие проги содержат функции - просто это очень удобно.
Вобщем можно поробовать написать маленькую прогу с множественным вызовом не завершенной функции со счетчиком вызовов и посмотреть в симуляторе VMLAB "заклинит" ли прогу и как быстро и где "узкое место".
Но меня не покидает ощущение искуственности обсуждаемой проблемы - потому что при чтении обсуждения возникает ощущение что для МК вообще не возможно написать жизнеспособную программу - но известно что это не так.
Mishka >
Теперь по примерам из ссылок.
Я не разбирал эти примеры, просто сообшил о них. поэтому не могу ни чего сказать.
Когда я даю провереные мной примеры я об это говорю "проверил, да, работает!"