Цитата(Dmitro25 @ Mar 31 2010, 15:28)

2dxp:
Ваш пост не дописан...
Глюк форума. Все дописано.
Цитата(Dmitro25 @ Mar 31 2010, 15:28)

Но, по-моему, если следовать разуму, зачем компилятору сохранять регистры перед вызовом функции, внутри которой, как ему ТОЧНО известно, ни один из этих регистров не используется.
Это откуда ему "ТОЧНО известно" это? Вот представьте, что вы компилятор, вам дали обработчик прерывания, в нем есть вызов функции, но кроме вызова ничего нет - самой функции вы не видите, ее исходного кода у вас нет, есть только прототип, чтобы вы могли ее правильно вызвать. Все.
Цитата(Dmitro25 @ Mar 31 2010, 15:28)

Приведите пример, в котором только такое поведение разумно.
Вызов из ISR любой функции, представление которой в точке вызова неизвестно. См выше.
Цитата(Dmitro25 @ Mar 31 2010, 15:28)

Я понимаю, что, скорее всего, придётся делать именно так.
И никак иначе, если не хотите тупого оверхеда.
Цитата(Dmitro25 @ Mar 31 2010, 15:28)

Просто изначально я хотел вызывать из прерывания функции, расположенные в других модулях проекта. Задача была вот в чём: создать для каждого периферийного устройства свой модуль в проекте (для инкапсуляции), а по прерываниям в основном модуле проекта вызывать соответствующие функции модулей периферийных устройств. При этом структура проекта получается более "прозрачной": в основном модуле сосредоточены все прерывания, а каждый из подключаемых модулей - это некий "чёрный ящик" с входом для прерываний и набором других входов и выходов в виде функций.
Имхо, не самый лучший подход. Намного лучше обработчики прерываний рассовать по модулям, чтобы каждый был поближе к "своему" коду (с которым ISR связан). Еще лучше модули организовать в виде классов, а ISR сделать статическими функциями-членами классов.
Цитата(Dmitro25 @ Mar 31 2010, 15:28)

Однако, сделать процедуру прерывания в другом модуле "inline" у меня не получилось.
Естественно. Для того, чтобы функция могла быть встроенной, компилятор должен иметь ее полный код в точке вызова - иначе как он будет встраивать? Точнее, что он будет встраивать, если он не видит потрохов функции? Иными словами, встраиваемая функция должна быть определена до точки ее вызова (хоть в заголовочном файле).
Цитата(Dmitro25 @ Mar 31 2010, 15:28)

Ещё, кстати, один вопрос к оптимальности трансляции, почему в "call", а не в rcall, если пока размер кода проекта не превышает 2кБ?
А откуда компилятор знает о размере кода проекта? Размер кода проекта знает только линкер и то уже после сборки всего проекта. А инструкции вызова ставит компилятор. Если хотите rcall, задавайте опции процессора (-v), которые скажут компилятору, что памяти программ меньше 8к, и тогда компилятор будет ставить rcall.
«Отыщи всему начало, и ты многое поймёшь» К. Прутков