учтите, я ответил на ваши вопросы, но что вы там при помощи этих советов накодите, будет целиком на вашей совести
P.S. кстати, static-функции достаточно неплохо инлайнятся автоматически при включении оптимизиции, особенно, если вызываются из одного места
ОК. Спасибо. Пожалуй я смогу выйти из своего затруднительного положения с малой кровью. Для этого нужно оформить все функции в "фиктивном" прерывании. И которое буду вызывать программно перед выходом из основного. Единственный недостаток - потеря 1 вывода чипа.
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
у вас какое-то странное понимание поведения компилятора. искусственно генерируемое прерывание в конечном итоге ничем не лучше простого обращения к функции. пролог в обработчике прерывания делается только на основе двух фактов: 1. используемые переменные в обработчике 2. обращения к функциям из обработчика первый пункт означает, что если переменных в обработчике задействовано минимум, минимальным будет и пролог. всегда в прологе сохраняется SREG и один из регистров (точно не помню, какой именно). если одним этим регистром удастся обеспечить логику обработчика, ничего больше в прологе не будет. соответственно и в эпилоге второй пункт означает, что если в обработчике есть обращение к функциям из библиотек или других модулей, то в прологе всегда будут сохранены ВСЕ РАБОЧИЕ РЕГИСТРЫ в стек, если я не ошибаюсь, это начиная с r16 и далее по порядку. ну и SREG с дополнительным регистром, само собой если же в обработчике используются функции из этого же модуля, пролог с эпилогом будут какими-то средними по отношению к описанным вариантам. если используемые в обработчике функции будут static, то с большой долей вероятности они могут быть проинлайнены в обаботчик, но это не гарантия - надо контролировать по листингу
в общем, ваши загадочные телодвижения скорее говорят о неправильном подходе к решению вашей задачи, нежели о реальной необходимости уменьшать "пролог".
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Я уже писал, что мне нужна быстрая реакция на прерывание. А функций из других модулей не позволяют иметь короткий пролог. Оформив функции в искусственном прерывании. и программно вызывая его (уже после быстрой реакции на прерывание), я получу требуемый эффект. И в этом как раз и будет отличие программного прерывания от функции/функций внутри прерывания.
не понимаю. не могли бы вы более подробно рассказать, что за загадочно быстрой реакции вы добиваетесь, но при этом обязательно с каким-то переподвыподвертом? в чем быстрота реакции должна проявляться?
из ваших слов я понял такое: 1. возникло прерывание 2. вы попадаете в "быстрый" обработчик 3. перед завершением быстрого обработчика дрыгаете ножкой, которая вызывает запрос на очередное прерывание, "медленное" 4. выходите из "быстрого" прерывания, программа отрабатывает 1 команду и попадает в "медленный" обработчик 5. в медленном обработчике с большим прологом что-то страшное делаете с помощью всяких функций 6. завершаете "медленный" обработчик
я верно все понял? в каком месте по-вашему происходит "быстрая" реакция на первый запрос прерывания?
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Да, Вы всё правильно поняли. И поэтому мне непонятен Ваш вопрос... Очевидно же, во 2-м пункте. Именно в нём я отвечаю на прерывание по изменению сигнала в линии.
Очевидно лишь то, что во втором пункте никакой реакции не происходит. Реакция на внешнее событие явно где-то дальше. Толку от того, что быстро вошли в обработчик, если никакой поставленной задачи не выполнено, ничего не обработано. Не понятно, что мешает показать код. Или огласить полностью задачу.
Получается что вам необходима быстрая реакция на прерывание, что-то быстро зафиксировать а уже потом можно делать отложенные вычисления и скорость этих вычислений уже не так важна. Так почему бы тогда в прерывании не зафиксировать это что-то, выставить признак фиксации а обсчёт и вызовы подпрограмм переложить на основной цикл.
Сейчас так и делается. Но, занимаясь другой задачей, не всегда успеваю обслужить результат обработки прерывания. Поэтому и хочу ВСЮ обработку возложить на прерывание.
Подскажите пожалуйста как определить структуру в сегменте кода и по указателю на эту структуру, передаваемому как параметр, обращатся к её полям? В мануалах везде только про строки и их массив.
Сама структура объявляется как обычно. Переменные - экземпляры структуры создаются как обычно, с указанием const PROGMEM. Ну а доступ к полям - через pgm_read_xxx, где xxx зависит от разрядности поля.
Заголовок сообщения: Re: WinAvr в вопросах и ответах
Добавлено: Пн авг 29, 2016 19:58:00
Первый раз сказал Мяу!
Зарегистрирован: Вс май 22, 2016 21:19:03 Сообщений: 29
Рейтинг сообщения:0
Здравствуйте! Давно уже пользуюсь WinAVR, ни когда не было ни каких проблем. Устанавливал на Windows 8.1, 10 x64 все прекрасно работало. И вот сегодня возникла проблема: при компиляции появилась ошибка.
Couldn't reserve space for cygwin's heap, win32 error 0
Она гадина в цикле ни с нуля считает (просматривал в AVR4). Да и в прерывании, ей почемуто ничего неприсваиваеться. И при компиляции выскакивают такие сообщения: 5.c:25: warning: type defaults to 'int' in declaration of 'N' Тоесть компилятор незнает что N имеет тип integer, хотя обявлено вроде нормально.
он ее должен был вообще выбросить, т.к. переменная нигде больше не используется volatile наше все
используйте uint16_t (int16_t) при объявлении, перестанет ругаться
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 27
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения