Долой империалистический интернационал!
-
- Зачем? Если нужно уменьшить время в прерывании, то нужно меньше
кода в нём. Ведь сохраняются не все регистры, а только те, которые
используются в прерывании. Ещё такое может понадобиться для
переключения стека в многопоточной системе. Тогда на асме надо
обработчик делать. - Ale3000(30.05.2025 12:30)
- Если в прерывание вставить вызов другой функции, самой простейшей,
то компилятор уже НЕ видит, какие регистры используются, и пихает в стек вобще всё.
Поэтому я уже много лет использую __raw - vpv.vpv(Сегодня, 07:30)
- Вот как это выглядит в листинге. В регисторовой паре R15:R14 лежит
текущий указатель на нужную функцию. Функция "портит"только пару
регистров. Её вызов происходит мгновено (команда MOVW - 1 такт). А
вот преамбулы и послеамбулы прерывания из-за косвенного вызова
длятся невыносимо долго и бестолково. vpv.vpv(1 знак., Сегодня, 07:42, картинка)
- Так тут у вас функция вызывается по указателю. Конечно, компилятор не может знать, куда в данный момент указывает указатель. Если функцию вызывать напрямую, то компилятор не будет сохранять неиспользуемые регистры. - Ale3000(Сегодня, 09:09)
- А вот примерно то же самое, но с "__raw" и зарезервированными
регистрами под т.н. "аппаратный стек" :)) Прерывание отрабатывает в разы быстрее: vpv.vpv(1 знак., Сегодня, 07:54, картинка)
- ХЗ, конешно, но само понятие прерывания подразумевает, что нужно
быстро вычитать куда-то или, наоборот, записать и поднять флаг, что
было такое. И всё. Когда в прерывании надо сохранять кучу
регистров, это чота в консерватории надо менять. - mse homjak(Сегодня, 10:55)
- Когда начинаешь решать реальные задачи, с ужасом осознаёшь, что мир прерываний оказывается черевычайно велик и разнообразен. :-)))) - vpv.vpv(Сегодня, 13:25)
- Если важно выполнить действия по прерыванию, например, выполнить
расчёт параметров реального времени и это приоритетно, то почему бы
не делать это в прерывании? Я даже куски кода из main() выношу в
программные прерывания, чтобы поднять приоритет над фоном. Бывает,
из прерывания периферии, вызываю программное прерывание ниже
приоритетом, чтобы дать возможность для прерываний другой
приоритетной периферии, но, при этом обработать данные до возврата
в main(). - Nikolay_Po(Сегодня, 11:02)
- В моем случае, в фоне не выполняется ваще ничего, пустой цикл
for(;;). Все делается исключительно в прерываниях. Но зато можно
писать в сишнике, то что иначе пришлось бы на асме лабать. - Codavr(Сегодня, 11:23)
- Именно так. Поэтому вызовы функции изнутри прерываний - не харам, а
одно из решений. - Nikolay_Po(Сегодня, 11:25)
- Дык. Головой думать надо и делать так чтобы работало наилучшим
образом в данной конкретной задаче, а не устанавливать для себя не
нужных запретов. - Codavr(Сегодня, 11:29)
- Совершенно, на 100% согласен! - vpv.vpv(Сегодня, 13:27)
- Ничоси. Тут один шаг до призыва "систему менять". Астанавитесь! :-) - SciFi(Сегодня, 11:33)
- Я всегда был за идеологию первых хакеров (не взломщиков, а былинных
программистов), это так романтично. Но так-как в институте меня
плотно обучали теории надежности, я с грустью понмаю, что в
применении к Большим Системам это порочная практика. А так-как я
всю дорогу делаю Маленькие, то позволяю себе эти небольшие шалости,
но про надежность помню всегда :) - Codavr(Сегодня, 12:35)
- Анархист-охранитель. Гибрид, выведенный лучшими селекционерами :-) - SciFi(Сегодня, 12:58)
- :))) - Codavr(Сегодня, 12:58)
- Анархист-охранитель. Гибрид, выведенный лучшими селекционерами :-) - SciFi(Сегодня, 12:58)
- Я всегда был за идеологию первых хакеров (не взломщиков, а былинных
программистов), это так романтично. Но так-как в институте меня
плотно обучали теории надежности, я с грустью понмаю, что в
применении к Большим Системам это порочная практика. А так-как я
всю дорогу делаю Маленькие, то позволяю себе эти небольшие шалости,
но про надежность помню всегда :) - Codavr(Сегодня, 12:35)
- Дык. Головой думать надо и делать так чтобы работало наилучшим
образом в данной конкретной задаче, а не устанавливать для себя не
нужных запретов. - Codavr(Сегодня, 11:29)
- Именно так. Поэтому вызовы функции изнутри прерываний - не харам, а
одно из решений. - Nikolay_Po(Сегодня, 11:25)
- В моем случае, в фоне не выполняется ваще ничего, пустой цикл
for(;;). Все делается исключительно в прерываниях. Но зато можно
писать в сишнике, то что иначе пришлось бы на асме лабать. - Codavr(Сегодня, 11:23)
- "Быстро", "куча" - это пустой звук, если нет цифр. А цифры бывают оч. разные, такшта консерватория ещё поработает... - SciFi(Сегодня, 10:59)
- ХЗ, конешно, но само понятие прерывания подразумевает, что нужно
быстро вычитать куда-то или, наоборот, записать и поднять флаг, что
было такое. И всё. Когда в прерывании надо сохранять кучу
регистров, это чота в консерватории надо менять. - mse homjak(Сегодня, 10:55)
- Вот как это выглядит в листинге. В регисторовой паре R15:R14 лежит
текущий указатель на нужную функцию. Функция "портит"только пару
регистров. Её вызов происходит мгновено (команда MOVW - 1 такт). А
вот преамбулы и послеамбулы прерывания из-за косвенного вызова
длятся невыносимо долго и бестолково. vpv.vpv(1 знак., Сегодня, 07:42, картинка)
- У меня с одного древнего проекта не пошедшего в серию осталась прорва tiny15. Вот я их периодически расходую на всякую мелочевку. А у нее стек аппаратный на 3 байта. Вот и чудю. Почти все уже срасходовал. - Codavr(30.05.2025 12:54)
- Если в прерывание вставить вызов другой функции, самой простейшей,
то компилятор уже НЕ видит, какие регистры используются, и пихает в стек вобще всё.
Поэтому я уже много лет использую __raw - vpv.vpv(Сегодня, 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 знак., Сегодня, 07:26, картинка)
- Да я его от корки до корки еще годов 20 назад прочел, но этот
ключик в памяти не отложился. - Codavr(Сегодня, 11:25)
- Потому, что это "молодой" ключик! За 20 лет, компиляторостроение ушло далеко вперёд. :)) - vpv.vpv(Сегодня, 13:29)
- Да я его от корки до корки еще годов 20 назад прочел, но этот
ключик в памяти не отложился. - Codavr(Сегодня, 11:25)
- Если почитать мануал на компилятор (из хелпа IAR), там много чего
ещё можно найти, полезного. :))) vpv.vpv(1 знак., Сегодня, 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)
- Предлагаю использовать Дипсик в качестве компилятора: SciFi(1 знак., 30.05.2025 10:23, картинка)
- Пора уже осваивать передовые методы. Все руки не доходят. - Codavr(30.05.2025 10:53)
- Он и в хексе может, как полагается настоящим мущщинам: SciFi(1 знак., 30.05.2025 10:28, картинка)
- Предлагаю использовать Дипсик в качестве компилятора: SciFi(1 знак., 30.05.2025 10:23, картинка)
- Хочется средствами си. Это канешна не жизненно-важно, ибо все равно
компилить буду вначале в ассемблер, а уже потом править его и
ассемблить в код. Можно и это ручками, но вдруг кто-то предложит
тайное знание. - Codavr(30.05.2025 10:20)
- Зачем? Если нужно уменьшить время в прерывании, то нужно меньше
кода в нём. Ведь сохраняются не все регистры, а только те, которые
используются в прерывании. Ещё такое может понадобиться для
переключения стека в многопоточной системе. Тогда на асме надо
обработчик делать. - Ale3000(30.05.2025 12:30)