Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 22.08.2011, 00:16  
Godzilla82
Почётный гражданин KAZUS.RU
 
Регистрация: 29.10.2006
Сообщений: 1,448
Сказал спасибо: 96
Сказали Спасибо 319 раз(а) в 233 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Inline функции в CodeVision AVR

Небольшая предыстория. Прислушался к советам форумчан и склонился в пользу WinAVR. Написал нужные прошивки. Всё работает. Хорошо.

Потребовался генератор квадратурных сигналов (как с энкодера). Написал. ATtiny2313, 20 MHz. Заинтересовала максимальная частота. На WinAVR получилась около 200 кГц. Задержки между импульсами задаются таймером. То есть в обработчике прерывания обнуление переменной. И всё.

200 кГц - чё-то маловато. Если ставишь интервал меньше - прерывания не успевают обрабатываться и длительность импульсов получается непостоянной.

Ради прикола откомпилировал в CV. И на своё удивление обнаружил, что частоту можно спокойно поднять до 400 кГц.

И это при том, что его все хаяли именно из-за быстродействия. А вот вход-выход из прерывания у него получается заметно короче.

Ладно. Решил перекомпилировать прежние прошивки. И у всех налицо увеличение быстродействия (за счёт уменьшения циклов на вход/выход из прерываний). Да и размер кода у многих оказался меньше. Вот вам и GCC.

Я с ассемблером на ВЫ. Но при просмотре видно, что WinAVR часто кладёт в стек кучу регистров. CV же вообще редко использует PUSH/POP. У него получается обходиться регистрами. Проекты небольшие. Пару-тройку килобайт кода.

Теперь, собственно, вопрос. Для дальнейшего увеличения быстродействия нужно некоторые функции сделать инлайновыми. Но квалификатор inline компилер игнорирует (старый, 1.25.9).

Что посоветуете, кроме тупого переписывания кода?

Или может есть способ уменьшить количество тактов в WinAVR.
Реклама:

Последний раз редактировалось Godzilla82; 22.08.2011 в 00:21.
Godzilla82 вне форума  
Сказали "Спасибо" Godzilla82
warel (28.06.2019)
Непрочитано 22.08.2011, 10:55  
heady69
Прописка
 
Регистрация: 25.09.2009
Адрес: Ivanovo
Сообщений: 156
Сказал спасибо: 3
Сказали Спасибо 67 раз(а) в 60 сообщении(ях)
heady69 на пути к лучшему
По умолчанию Re: Inline функции в CodeVision AVR

Может IAR попробовать,неплохой код генерит.
heady69 вне форума  
Сказали "Спасибо" heady69
warel (28.06.2019)
Непрочитано 22.08.2011, 11:29  
omercury
Почётный гражданин KAZUS.RU
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Inline функции в CodeVision AVR

Сообщение от Godzilla82 Посмотреть сообщение
Или может есть способ уменьшить количество тактов в WinAVR.
Попробуйте поменять уровень оптимизации в настройках компилятора.
Попробуйте использовать в прерывании переменные типа register. Не помню, кто из них (WinAVR или CWAVR), но кто-то понимал...
Перепишите обработчик прерывания на Асме.
Если чётко представляете логику всей программы, можно отредактировать ассемблерный код и уже из него компилировать прошивку.

Сообщение от Godzilla82 Посмотреть сообщение
200 кГц - чё-то маловато.
................
Я с ассемблером на ВЫ.
Похоже, пришло время знакомиться поближе.
omercury вне форума  
Сказали "Спасибо" omercury
warel (28.06.2019)
Непрочитано 22.08.2011, 16:36  
=GM=
Прописка
 
Регистрация: 21.09.2009
Сообщений: 218
Сказал спасибо: 1
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
=GM= на пути к лучшему
По умолчанию Везде нужна сноровка, закалка, тренировка...и в кодировании тоже

Ради прикола откомпилировал в WinAVR и обнаружил, что частоту можно спокойно поднять до 660 кГц даже с учётом сохранения регистров.

Ну а если в сишную программу вставить ассемблерную подпрограмму, то частота взлетает под 2000 кГц

Последний раз редактировалось =GM=; 22.08.2011 в 16:39.
=GM= вне форума  
Сказали "Спасибо" =GM=
warel (28.06.2019)
Непрочитано 22.08.2011, 17:59  
Godzilla82
Почётный гражданин KAZUS.RU
 
Регистрация: 29.10.2006
Сообщений: 1,448
Сказал спасибо: 96
Сказали Спасибо 319 раз(а) в 233 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: Везде нужна сноровка, закалка, тренировка...и в кодировании тоже

Сообщение от =GM= Посмотреть сообщение
Ну а если в сишную программу вставить ассемблерную подпрограмму, то частота взлетает под 2000 кГц
Не получится. Нужно увеличивать двухбайтный счётчик и сравнивать количество импульсов. Высчитывать фазу (значение из таблицы) и опрашивать кнопки. При этом интервал между фронтами/спадами должен быть постоянный.

Если делать через прерывания (гарантированная длительность) - это ещё лишних 4-6 тактов.
Godzilla82 вне форума  
Сказали "Спасибо" Godzilla82
warel (28.06.2019)
Непрочитано 22.08.2011, 18:10  
Godzilla82
Почётный гражданин KAZUS.RU
 
Регистрация: 29.10.2006
Сообщений: 1,448
Сказал спасибо: 96
Сказали Спасибо 319 раз(а) в 233 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: Inline функции в CodeVision AVR

Сообщение от omercury Посмотреть сообщение
Попробуйте поменять уровень оптимизации в настройках компилятора.
Попробуйте использовать в прерывании переменные типа register. Не помню, кто из них (WinAVR или CWAVR), но кто-то понимал...
Уровень оптимизации - максимальный. Я так понял, что при "3" к тому же инлайнятся все функции.

Много глобальных переменных, которые должны быть доступны как из прерывания, так и из функций.

О сокращении тактов... Я имел ввиду обработчик прерывания. В прерывании, допустим, обнуляется одна единственная переменная и всё.

При входе же в прерывание WinAVR начинает класть в стек кучу регистров, которыми в прерывании и не пахнет.
Godzilla82 вне форума  
Сказали "Спасибо" Godzilla82
warel (28.06.2019)
Непрочитано 22.08.2011, 18:31  
st_1
Заблокирован
 
Регистрация: 26.12.2009
Сообщений: 3,124
Сказал спасибо: 116
Сказали Спасибо 867 раз(а) в 614 сообщении(ях)
st_1 на пути к лучшему
По умолчанию Re: Inline функции в CodeVision AVR

Сообщение от Godzilla82 Посмотреть сообщение
Уровень оптимизации - максимальный. Я так понял, что при "3" к тому же инлайнятся все функции.
Вы явно что-то путаете... Есть разные виды оптимизации... по скорости... по размеру кода...
У вас максимальный по какому критерию???
Попробуйте -Os...
При -O3 код может разростись неимоверно... но прога будет работать быстрее...
st_1 вне форума  
Сказали "Спасибо" st_1
warel (28.06.2019)
Непрочитано 22.08.2011, 18:36  
Godzilla82
Почётный гражданин KAZUS.RU
 
Регистрация: 29.10.2006
Сообщений: 1,448
Сказал спасибо: 96
Сказали Спасибо 319 раз(а) в 233 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: Inline функции в CodeVision AVR

Сообщение от st_1 Посмотреть сообщение
Вы явно что-то путаете... Есть разные виды оптимизации... по скорости... по размеру кода...
У вас максимальный по какому критерию???
Попробуйте -Os...
При -O3 код может разростись неимоверно... но прога будет работать быстрее...
я и говорю, что при 3 уровне (WInAVR) инлайнятся все функции. вот и размер кода растёт.

в общем, повторюсь:

мне надо, чтобы WinAVR не сохранял в стек лишние регистры, которые не используются в прерывании.

мне надо как-то заставить CodeVision инлайнить функции.
Godzilla82 вне форума  
Сказали "Спасибо" Godzilla82
warel (28.06.2019)
Непрочитано 22.08.2011, 18:42  
st_1
Заблокирован
 
Регистрация: 26.12.2009
Сообщений: 3,124
Сказал спасибо: 116
Сказали Спасибо 867 раз(а) в 614 сообщении(ях)
st_1 на пути к лучшему
По умолчанию Re: Inline функции в CodeVision AVR

Сообщение от Godzilla82 Посмотреть сообщение
мне надо, чтобы WinAVR не сохранял в стек лишние регистры, которые не используются в прерывании.
мне надо как-то заставить CodeVision инлайнить функции.
Мне кажется, что вы просто упёрлись в недостаточную производительность камня, но боитесь себе в этом признаться...
st_1 вне форума  
Сказали "Спасибо" st_1
warel (28.06.2019)
Непрочитано 22.08.2011, 18:48  
=GM=
Прописка
 
Регистрация: 21.09.2009
Сообщений: 218
Сказал спасибо: 1
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
=GM= на пути к лучшему
По умолчанию Re: Inline функции в CodeVision AVR

Сообщение от Godzilla82 Посмотреть сообщение
Не получится
А я вставил асмовую программу в прерывание, и получилось. Если полностью на асме, то можно достичь 4000 кГц.

Сообщение от Godzilla82 Посмотреть сообщение
Нужно увеличивать двухбайтный счётчик и сравнивать количество импульсов. Высчитывать фазу (значение из таблицы) и опрашивать кнопки. При этом интервал между фронтами/спадами должен быть постоянный.
Ну покажите свою программу, какие у вас там двухбайтные счётчики...(Кстати, если делать по прерыванию и не предпринимать никаких усилий, то на фронтах будет джиттер в 1-2 такта.
=GM= вне форума  
Сказали "Спасибо" =GM=
warel (28.06.2019)
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Литература по микроконтроллерам (AVR, PIC, ПЛИС и т.д.). Сборка книг - (256 книг+ 27 CD c примерами из книг) [обновление 2011, PDF, DJVU] yurinform Микроконтроллеры, АЦП, память и т.д 5 05.07.2011 19:00
Codevision AVR + AVR Studio помогите разобраться с отладкой Daget Микроконтроллеры, АЦП, память и т.д 24 07.03.2011 14:41
CodeVision AVR 2.05.0 работа с битами портов ajsn Микроконтроллеры, АЦП, память и т.д 4 06.03.2011 23:15
mRTOS - кооперативная ОС для AVR. Порт CodeVision. LVII Микроконтроллеры, АЦП, память и т.д 5 29.11.2008 14:44
Как работать с AT89C5131 в CodeVision AVR? lom771 Микроконтроллеры, АЦП, память и т.д 2 29.08.2006 16:51


Часовой пояс GMT +4, время: 22:03.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot