Долой империалистический интернационал!
-
- У AVR-GCC была возможность глобально зарезервировать регистр(ы) проца, тогда компилятор перестает этот регистр использовать и, соответственно, не сохраняет-восстанавливает его. Может такое применить? - LightElf(02.06.2025 16:21)
- Зачем? Если нужно уменьшить время в прерывании, то нужно меньше
кода в нём. Ведь сохраняются не все регистры, а только те, которые
используются в прерывании. Ещё такое может понадобиться для
переключения стека в многопоточной системе. Тогда на асме надо
обработчик делать. - Ale3000(30.05.2025 12:30)
- Если в прерывание вставить вызов другой функции, самой простейшей,
то компилятор уже НЕ видит, какие регистры используются, и пихает в стек вобще всё.
Поэтому я уже много лет использую __raw - vpv.vpv(02.06.2025 07:30)
- Вот как это выглядит в листинге. В регисторовой паре R15:R14 лежит
текущий указатель на нужную функцию. Функция "портит"только пару
регистров. Её вызов происходит мгновено (команда MOVW - 1 такт). А
вот преамбулы и послеамбулы прерывания из-за косвенного вызова
длятся невыносимо долго и бестолково. vpv.vpv(1 знак., 02.06.2025 07:42, картинка)
- Так тут у вас функция вызывается по указателю. Конечно, компилятор не может знать, куда в данный момент указывает указатель. Если функцию вызывать напрямую, то компилятор не будет сохранять неиспользуемые регистры. - Ale3000(02.06.2025 09:09)
- А вот примерно то же самое, но с "__raw" и зарезервированными
регистрами под т.н. "аппаратный стек" :)) Прерывание отрабатывает в разы быстрее: vpv.vpv(1 знак., 02.06.2025 07:54, картинка)
- ХЗ, конешно, но само понятие прерывания подразумевает, что нужно
быстро вычитать куда-то или, наоборот, записать и поднять флаг, что
было такое. И всё. Когда в прерывании надо сохранять кучу
регистров, это чота в консерватории надо менять. - mse homjak(02.06.2025 10:55)
- Когда начинаешь решать реальные задачи, с ужасом осознаёшь, что мир прерываний оказывается черевычайно велик и разнообразен. :-)))) - vpv.vpv(02.06.2025 13:25)
- Если важно выполнить действия по прерыванию, например, выполнить
расчёт параметров реального времени и это приоритетно, то почему бы
не делать это в прерывании? Я даже куски кода из main() выношу в
программные прерывания, чтобы поднять приоритет над фоном. Бывает,
из прерывания периферии, вызываю программное прерывание ниже
приоритетом, чтобы дать возможность для прерываний другой
приоритетной периферии, но, при этом обработать данные до возврата
в main(). - Nikolay_Po(02.06.2025 11:02)
- Йа об то, что если собираетесь чота сервисить в прерывании, то неча плакать по сохранению контента. Я, когда разбираю протокол из УАРТ, тожэ сижу в прерывании. Но тут я первой командой прерывания разрешаю. - mse homjak(02.06.2025 17:27)
- В моем случае, в фоне не выполняется ваще ничего, пустой цикл
for(;;). Все делается исключительно в прерываниях. Но зато можно
писать в сишнике, то что иначе пришлось бы на асме лабать. - Codavr(02.06.2025 11:23)
- Именно так. Поэтому вызовы функции изнутри прерываний - не харам, а
одно из решений. - Nikolay_Po(02.06.2025 11:25)
- Дык. Головой думать надо и делать так чтобы работало наилучшим
образом в данной конкретной задаче, а не устанавливать для себя не
нужных запретов. - Codavr(02.06.2025 11:29)
- Совершенно, на 100% согласен! - vpv.vpv(02.06.2025 13:27)
- Ничоси. Тут один шаг до призыва "систему менять". Астанавитесь! :-) - SciFi(02.06.2025 11:33)
- Я всегда был за идеологию первых хакеров (не взломщиков, а былинных
программистов), это так романтично. Но так-как в институте меня
плотно обучали теории надежности, я с грустью понмаю, что в
применении к Большим Системам это порочная практика. А так-как я
всю дорогу делаю Маленькие, то позволяю себе эти небольшие шалости,
но про надежность помню всегда :) - Codavr(02.06.2025 12:35)
- Анархист-охранитель. Гибрид, выведенный лучшими селекционерами :-) - SciFi(02.06.2025 12:58)
- :))) - Codavr(02.06.2025 12:58)
- Анархист-охранитель. Гибрид, выведенный лучшими селекционерами :-) - SciFi(02.06.2025 12:58)
- Я всегда был за идеологию первых хакеров (не взломщиков, а былинных
программистов), это так романтично. Но так-как в институте меня
плотно обучали теории надежности, я с грустью понмаю, что в
применении к Большим Системам это порочная практика. А так-как я
всю дорогу делаю Маленькие, то позволяю себе эти небольшие шалости,
но про надежность помню всегда :) - Codavr(02.06.2025 12:35)
- Дык. Головой думать надо и делать так чтобы работало наилучшим
образом в данной конкретной задаче, а не устанавливать для себя не
нужных запретов. - Codavr(02.06.2025 11:29)
- Именно так. Поэтому вызовы функции изнутри прерываний - не харам, а
одно из решений. - Nikolay_Po(02.06.2025 11:25)
- "Быстро", "куча" - это пустой звук, если нет цифр. А цифры бывают оч. разные, такшта консерватория ещё поработает... - SciFi(02.06.2025 10:59)
- ХЗ, конешно, но само понятие прерывания подразумевает, что нужно
быстро вычитать куда-то или, наоборот, записать и поднять флаг, что
было такое. И всё. Когда в прерывании надо сохранять кучу
регистров, это чота в консерватории надо менять. - mse homjak(02.06.2025 10:55)
- Вот как это выглядит в листинге. В регисторовой паре R15:R14 лежит
текущий указатель на нужную функцию. Функция "портит"только пару
регистров. Её вызов происходит мгновено (команда MOVW - 1 такт). А
вот преамбулы и послеамбулы прерывания из-за косвенного вызова
длятся невыносимо долго и бестолково. vpv.vpv(1 знак., 02.06.2025 07:42, картинка)
- У меня с одного древнего проекта не пошедшего в серию осталась прорва tiny15. Вот я их периодически расходую на всякую мелочевку. А у нее стек аппаратный на 3 байта. Вот и чудю. Почти все уже срасходовал. - Codavr(30.05.2025 12:54)
- Если в прерывание вставить вызов другой функции, самой простейшей,
то компилятор уже НЕ видит, какие регистры используются, и пихает в стек вобще всё.
Поэтому я уже много лет использую __raw - vpv.vpv(02.06.2025 07:30)
- Не удивительно, __task и __interrupt не совместимы, ибо требуют от
функции разного поведения: не сохранять и в то же время сохранять
регистры. А если так: ЫЫyкпy(121 знак., 30.05.2025 10:07)
- Тогда прагма интеррапт хочет. Хотел всунуть в нулевой адрес вызов
функции __task, но чота тоже лыжи не едут. - Codavr(30.05.2025 10:12)
- А если перед __interrupt добавить __raw ? - ЫЫyкпy(30.05.2025 10:29)
- Вах! Съело. Варнинг только ругается на то что в нуле более одного
дефинишена, но это и понятно, без __raw такой же варнинг. Спасибо кормилец! Не знал я этого ключевого слова. - Codavr(30.05.2025 10:54)
- Если почитать мануал на компилятор (из хелпа IAR), там много чего
ещё можно найти, полезного. :))) vpv.vpv(1 знак., 02.06.2025 07:26, картинка)
- Да я его от корки до корки еще годов 20 назад прочел, но этот
ключик в памяти не отложился. - Codavr(02.06.2025 11:25)
- Потому, что это "молодой" ключик! За 20 лет, компиляторостроение ушло далеко вперёд. :)) - vpv.vpv(02.06.2025 13:29)
- Да я его от корки до корки еще годов 20 назад прочел, но этот
ключик в памяти не отложился. - Codavr(02.06.2025 11:25)
- Если почитать мануал на компилятор (из хелпа IAR), там много чего
ещё можно найти, полезного. :))) vpv.vpv(1 знак., 02.06.2025 07:26, картинка)
- Вах! Съело. Варнинг только ругается на то что в нуле более одного
дефинишена, но это и понятно, без __raw такой же варнинг. Спасибо кормилец! Не знал я этого ключевого слова. - Codavr(30.05.2025 10:54)
- А если перед __interrupt добавить __raw ? - ЫЫyкпy(30.05.2025 10:29)
- Тогда прагма интеррапт хочет. Хотел всунуть в нулевой адрес вызов
функции __task, но чота тоже лыжи не едут. - Codavr(30.05.2025 10:12)
- Делаешь вызов своей функции в ассемблере. Вот кусок кода из моего
старого проекта: il-2(344 знак., 30.05.2025 09:28)
- Хочется средствами си. Это канешна не жизненно-важно, ибо все равно
компилить буду вначале в ассемблер, а уже потом править его и
ассемблить в код. Можно и это ручками, но вдруг кто-то предложит
тайное знание. - Codavr(30.05.2025 10:20)
- Поищите что-то вроде "AVR mixing assemble add C code cookbook". По памяти: есть способ сказать компилятору ГЦЦ "не трогай прерывание №Х, я сам его напишу." Само прерывание располагается в *.s или *.S файле с глобальной видимостью, написанное на ассемблере. В том числе была возможность сказать, чтобы о регистрах не заботился: программист сам всё нужное сделает (вроде "naked"). Я правильно понял ваши хотелки? Dingo(2 знак., 06.06.2025 08:25, ссылка, ссылка)
- Предлагаю использовать Дипсик в качестве компилятора: SciFi(1 знак., 30.05.2025 10:23, картинка)
- Пора уже осваивать передовые методы. Все руки не доходят. - Codavr(30.05.2025 10:53)
- Он и в хексе может, как полагается настоящим мущщинам: SciFi(1 знак., 30.05.2025 10:28, картинка)
- Хочется средствами си. Это канешна не жизненно-важно, ибо все равно
компилить буду вначале в ассемблер, а уже потом править его и
ассемблить в код. Можно и это ручками, но вдруг кто-то предложит
тайное знание. - Codavr(30.05.2025 10:20)