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