2dxp:Цитата
Как раз понятное и объяснимое поведение. По-другому просто и быть не может
Ваш пост не дописан... Но, по-моему, если следовать разуму, зачем компилятору сохранять регистры перед вызовом функции, внутри которой, как ему ТОЧНО известно, ни один из этих регистров не используется.
Приведите пример, в котором только такое поведение разумно.
2MrYuran:Цитата
Попробуйте принудительно заинлайнить функцию
Я понимаю, что, скорее всего, придётся делать именно так.
Просто изначально я хотел вызывать из прерывания функции, расположенные в других модулях проекта. Задача была вот в чём: создать для каждого периферийного устройства свой модуль в проекте (для инкапсуляции), а по прерываниям в основном модуле проекта вызывать соответствующие функции модулей периферийных устройств. При этом структура проекта получается более "прозрачной": в основном модуле сосредоточены все прерывания, а каждый из подключаемых модулей - это некий "чёрный ящик" с входом для прерываний и набором других входов и выходов в виде функций.
Однако, сделать процедуру прерывания в другом модуле "inline" у меня не получилось. Без специальных ключей линкер её выбрасывает, а если ставить "#pragma object_attribute=__root", всё равно это транслируется в "call" из прерывания.
Ещё, кстати, один вопрос к оптимальности трансляции, почему в "call", а не в rcall, если пока размер кода проекта не превышает 2кБ?