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

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

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

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

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

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

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

 
Опции темы

Inline функции в CodeVision AVR

Непрочитано 23.08.2011, 19:01  
=GM=
Прописка
 
Регистрация: 21.09.2009
Сообщений: 218
Сказал спасибо: 1
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
=GM= на пути к лучшему
По умолчанию Re: Inline функции в CodeVision AVR

Вообще-то, я и два такта могу сделать, не токо 3...
Реклама:
=GM= вне форума  
Непрочитано 23.08.2011, 19:15  
Godzilla82
Почётный гражданин KAZUS.RUN
 
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: Inline функции в CodeVision AVR

Сообщение от =GM= Посмотреть сообщение
Вообще-то, я и два такта могу сделать, не токо 3...
Ага, главное, поймать момент и запустить аппаратные счётчики так, чтобы фазы были повёрнуты на 90°

как точно задавать количество импульсов тогда?
Godzilla82 вне форума  
Непрочитано 23.08.2011, 22:49  
=GM=
Прописка
 
Регистрация: 21.09.2009
Сообщений: 218
Сказал спасибо: 1
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
=GM= на пути к лучшему
По умолчанию А если подумать?

(На асме делается легко и просто)
=GM= вне форума  
Непрочитано 24.08.2011, 02:44  
Godzilla82
Почётный гражданин KAZUS.RUN
 
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: А если подумать?

Сообщение от =GM= Посмотреть сообщение
(На асме делается легко и просто)
Уход от ответа

Уже не в тему... Перекомпилил кое-какие проекты CV AVR.

Обработка прерывания у CV AVR 31 такт, у WinAVR 47 тактов...

Там где у CV AVR всего 6 тактов, у WinAVR аж 21 такт...

С его супер оптимизацией...
Godzilla82 вне форума  
Непрочитано 24.08.2011, 14:26  
=GM=
Прописка
 
Регистрация: 21.09.2009
Сообщений: 218
Сказал спасибо: 1
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
=GM= на пути к лучшему
По умолчанию Ну что за народ,

не разобравшись, сразу начинают поливать...

Вот это прерывание
PHP код:
register unsigned char w asm("r16");

ISR(TIMER1_COMPA_vect,ISR_NAKED)
{
 w=0;
 reti();
} 
WinAVR компилирует в такой код
PHP код:
0000005a ‹__vector_4›:
  5a:    00 e0           ldi    r16, 0x00    ; 0
  5c:    18 95           reti 
Вот вам оптимизация, всего 5 тактов, вручную лучше не напишешь. Ну и где ваш хвалёный CV?
=GM= вне форума  
Непрочитано 24.08.2011, 20:15  
Godzilla82
Почётный гражданин KAZUS.RUN
 
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: Ну что за народ,

Сообщение от =GM= Посмотреть сообщение
не разобравшись, сразу начинают поливать...

Вот это прерывание
PHP код:
register unsigned char w asm("r16");

ISR(TIMER1_COMPA_vect,ISR_NAKED)
{
 w=0;
 reti();
} 
WinAVR компилирует в такой код
PHP код:
0000005a ‹__vector_4›:
  5a:    00 e0           ldi    r16, 0x00    ; 0
  5c:    18 95           reti 
Вот вам оптимизация, всего 5 тактов, вручную лучше не напишешь. Ну и где ваш хвалёный CV?
А в кодевижине не надо указывать какой регистр использовать, не надо заботиться о сохранении используемых регистров (ISR_NAKED). Он это сам всё делает. Например, в моём проекте после явного указания регистра всё перестало работать. И приходится лезть в ассемблер, читать описание на компилятор, какие регистры можно или нельзя использовать. Поставил из разрешённых регистров. Всё равно не заработало. Дальше копать не стал.

Без ISR_NAKED он везде сохраняет свои r1, r0, потом опять обнуляет r1 (который и так всегда по идее должен быть нулём).

В простые прерывания можно и ISR_NAKED поставить, не долго искать ошибки. А если там вычисления идут... Думать, что ты забыл сохранить в стеке... А без NAKED да ещё с volatile мрак получается...

PHP код:
 
     21c:    1f 92           push    r1
     21e:    0f 92           push    r0
     220:    0f b6           in    r0, 0x3f    ; 63
     222:    0f 92           push    r0
     224:    11 24           eor    r1, r1
     226:    1a 98           cbi    0x03, 2    ; 3
     228:    0f 90           pop    r0
     22a:    0f be           out    0x3f, r0    ; 63
     22c:    0f 90           pop    r0
     22e:    1f 90           pop    r1
     230:    18 95           reti 
А там всего одна команда в 2 такта PORTE &= ~SYNC_RV;

CV всего две команды и пишет
PHP код:
 
    CBI  0x3,2
    RETI 
Вот чего меньше всего хочется программисту на Си - так это лезть в ассемблер и корректировать скомпилированный код.

По нескольким критичным программам статистику привёл. CV делает обработку прерываний быстрее. Иногда в 3 раза быстрее. Это меня и удивило.

Выкидывать из функций код обработки глобальных переменных вообще неправильно. На то она и глобальная, что её используют в разных функциях. В одних - только меняют. В другх - только читают.

Вот если бы её во всех функциях программы только меняли или только читали - это другое дело.

Последний раз редактировалось Godzilla82; 24.08.2011 в 20:26.
Godzilla82 вне форума  
Непрочитано 26.08.2011, 12:07  
=GM=
Прописка
 
Регистрация: 21.09.2009
Сообщений: 218
Сказал спасибо: 1
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
=GM= на пути к лучшему
По умолчанию Re: Inline функции в CodeVision AVR

Сообщение от Godzilla82 Посмотреть сообщение
Без ISR_NAKED он везде сохраняет свои r1, r0, потом опять обнуляет r1 (который и так всегда по идее должен быть нулём)
Ну это вы просто архитектуру АВР плохо понимаете. Прерывание может возникнуть когда угодно, в частности, непосредственно после команды MUL, которая использует r0 и r1 для хранения результата перемножения, так что при входе в прерывание в r1 может быть не нуль, а любое значение. Разработчики компилятора WinАVR знают об этом, а вы - пока нет.

(Я на примере вашего проекта в другом месте WinАVR баг нашёл, возможно, поэтому выкидывает ваш код. Нет времени заняться, будет время - разберусь)

Последний раз редактировалось =GM=; 26.08.2011 в 13:03.
=GM= вне форума  
Непрочитано 26.08.2011, 14:02  
Avalon
Временная регистрация
 
Регистрация: 04.03.2005
Адрес: Москва
Сообщений: 71
Сказал спасибо: 25
Сказали Спасибо 30 раз(а) в 14 сообщении(ях)
Avalon на пути к лучшему
По умолчанию Re: Inline функции в CodeVision AVR

Всем доброго дня. В своё время хотел перейти с CV на WinAVR, но отказался. Причин объяснять не буду, ибо на вкус и цвет... CV сам по себе всего лишь инструмент, и как любым инструментом, им надо уметь пользоваться и понимать что и как он делает.
Например
for( x = 0; x ‹ 32; x++)
{
.......
}
и
for( x = 32; x; x--)
{
.........
}
компилируется в принципиально разные ассемблерные конструкции, и исполняются с разной скоростью. Иногда влияет даже такие мелочи которые и значения вроде как не имеют. Для себя пришел к выводу, что наиболее оптимальный вариант, это СИшная программа с ассемблерными вставками, ПО НЕОБХОДИМОСТИ.
Кстати есть вопрос. Как в CV в ассемблерных вставках использовать переменные объявленные в СИшной части кода. Разумеется речь о переменных с постоянным адресом. Сейчас приходится объявлять переменные с привязкой к конкретному адресу в СИ, и потом также в ассемблере. Не очень удобно. Может кто знает более удобный способ.
Avalon вне форума  
Непрочитано 26.08.2011, 18:27  
Godzilla82
Почётный гражданин KAZUS.RUN
 
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: Inline функции в CodeVision AVR

Сообщение от =GM= Посмотреть сообщение
Ну это вы просто архитектуру АВР плохо понимаете. Прерывание может возникнуть когда угодно, в частности, непосредственно после команды MUL, которая использует r0 и r1 для хранения результата перемножения, так что при входе в прерывание в r1 может быть не нуль, а любое значение. Разработчики компилятора WinАVR знают об этом, а вы - пока нет.
Ага. Особенно в этом прерывании. CV, кстати, тоже об этом знает...

Удалось обработку прерывания USI только средствами Си довести до 21 такта.

В WinAVR на это уходило 44 такта... Ну да бог с ним. Вывод для себя я уже сделал.

Сообщение от =GM= Посмотреть сообщение
(Я на примере вашего проекта в другом месте WinАVR баг нашёл, возможно, поэтому выкидывает ваш код. Нет времени заняться, будет время - разберусь)
Не работает. Но я давал не весь код.

Кстати, быстродействие генератора довёл до 625 кГц. Правда через прерывания. Вся обработка прерывания те же 5 тактов. И только средствами Си (CV AVR).
Godzilla82 вне форума  
Непрочитано 26.08.2011, 18:36  
Godzilla82
Почётный гражданин KAZUS.RUN
 
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: Inline функции в CodeVision AVR

Сообщение от Avalon Посмотреть сообщение
Может кто знает более удобный способ.
Может, я и ошибаюсь. Но когда CV создаёт .asm файл, то в нём присутствуют имена Си-переменных, но со знаком '_' в начале (если переменная в памяти, конечно).
Например, в Си глобальная переменная объявлена

PHP код:
char MyValue; 
в ассемблере будет, например

PHP код:
STS  _MyValue,R30 
Godzilla82 вне форума  
 
Опции темы

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

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, время: 06:05.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.