Мастер Ломастер писал(а):q9957789 писал(а):Ребят, добрый день. Вопрос. Вы замечали, что когда генерируешь прерывание, компилятор переделывает всё это дело в ассемблер и добавляет строки, где производит операции со стеком. Дело благое, но на это тратится время, которое в моём случае на вес золота. Можно ли как-то обойти это дело? Или вообще убрать эти строки, или же "пропихнуть" нужные мне операции до операций со стеком. Спасибо.
у вас есть 2 легальных пути для достижения своей цели:
1. Написать полностью ассемблерный модуль (файл *.S) с обработчиком нужного вам прерывания.
2. Использовать макрос ISR_NAKED для обработчика и соответствующим образом оформленную ассемблерную вставку в Сишном коде.
я бы советовал пойти по первому пути, но при должном старании и второй не плох.
кроме того, последние версии AVR-GCC со стеком работают получше, возможно, вам будет достаточно и этого...
Спасибо, что касается работают получше, то это в любом случае не удовлетворяет требованиям, тк мне критичен каждый такт. Делаю синхронизацию 2-х м-последовательностей путём гхм, извините, детектирования растущего фронта синхроимпульса, исходящего, очевидно, из передатчика, после обнаружения запускаю вот то самое прерывание. Вся мп имеет время такта 10мкс, даже в лучшем случае было отставание одной от другой на 1,5 мкс, или 15%, а так низя)
В любом случае, то что вы предложили, кажется, идеально решает проблему, только я не знаю ничего ни о 1м, ни о 2м способе.
ну что касается выбора, написать ассемблерный модуль мне видится легче, чем морочиться со вставками. Значит идём по 1му...
Код на си можно описать так:(чтобы не заморачиваться вам)
Код: Выделить всё
ISR (INT0_vect)
{
PORTB=0xC0;//То что должно выполниться как можно раньше и без использования стека(практически), я надеюсь.
//дальше код кусочек, который может подождать.
}
Вот вопрос: как это оформить в .s файле и главное - как подключить его.