| Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
Inline функции в CodeVision AVR
23.08.2011, 19:01
|
|
|
Прописка
Регистрация: 21.09.2009
Сообщений: 218
Сказал спасибо: 1
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
|
Re: Inline функции в CodeVision AVR
Вообще-то, я и два такта могу сделать, не токо 3...
|
|
|
|
23.08.2011, 19:15
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
|
Re: Inline функции в CodeVision AVR
Сообщение от =GM=
|
|
Вообще-то, я и два такта могу сделать, не токо 3...
|
Ага, главное, поймать момент и запустить аппаратные счётчики так, чтобы фазы были повёрнуты на 90°
как точно задавать количество импульсов тогда?
|
|
|
|
23.08.2011, 22:49
|
|
|
Прописка
Регистрация: 21.09.2009
Сообщений: 218
Сказал спасибо: 1
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
|
А если подумать?
(На асме делается легко и просто)
|
|
|
|
24.08.2011, 02:44
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
|
Re: А если подумать?
Сообщение от =GM=
|
|
(На асме делается легко и просто)
|
Уход от ответа
Уже не в тему... Перекомпилил кое-какие проекты CV AVR.
Обработка прерывания у CV AVR 31 такт, у WinAVR 47 тактов...
Там где у CV AVR всего 6 тактов, у WinAVR аж 21 такт...
С его супер оптимизацией...
|
|
|
|
24.08.2011, 14:26
|
|
|
Прописка
Регистрация: 21.09.2009
Сообщений: 218
Сказал спасибо: 1
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
|
Ну что за народ,
не разобравшись, сразу начинают поливать...
Вот это прерывание
|
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?
|
|
|
|
24.08.2011, 20:15
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
|
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 всего две команды и пишет
Вот чего меньше всего хочется программисту на Си - так это лезть в ассемблер и корректировать скомпилированный код.
По нескольким критичным программам статистику привёл. CV делает обработку прерываний быстрее. Иногда в 3 раза быстрее. Это меня и удивило.
Выкидывать из функций код обработки глобальных переменных вообще неправильно. На то она и глобальная, что её используют в разных функциях. В одних - только меняют. В другх - только читают.
Вот если бы её во всех функциях программы только меняли или только читали - это другое дело.
Последний раз редактировалось Godzilla82; 24.08.2011 в 20:26.
|
|
|
|
26.08.2011, 12:07
|
|
|
Прописка
Регистрация: 21.09.2009
Сообщений: 218
Сказал спасибо: 1
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
|
Re: Inline функции в CodeVision AVR
Сообщение от Godzilla82
|
|
Без ISR_NAKED он везде сохраняет свои r1, r0, потом опять обнуляет r1 (который и так всегда по идее должен быть нулём)
|
Ну это вы просто архитектуру АВР плохо понимаете. Прерывание может возникнуть когда угодно, в частности, непосредственно после команды MUL, которая использует r0 и r1 для хранения результата перемножения, так что при входе в прерывание в r1 может быть не нуль, а любое значение. Разработчики компилятора WinАVR знают об этом, а вы - пока нет.
(Я на примере вашего проекта в другом месте WinАVR баг нашёл, возможно, поэтому выкидывает ваш код. Нет времени заняться, будет время - разберусь)
Последний раз редактировалось =GM=; 26.08.2011 в 13:03.
|
|
|
|
26.08.2011, 14:02
|
|
|
Временная регистрация
Регистрация: 04.03.2005
Адрес: Москва
Сообщений: 71
Сказал спасибо: 25
Сказали Спасибо 30 раз(а) в 14 сообщении(ях)
|
Re: Inline функции в CodeVision AVR
Всем доброго дня. В своё время хотел перейти с CV на WinAVR, но отказался. Причин объяснять не буду, ибо на вкус и цвет... CV сам по себе всего лишь инструмент, и как любым инструментом, им надо уметь пользоваться и понимать что и как он делает.
Например
for( x = 0; x ‹ 32; x++)
{
.......
}
и
for( x = 32; x; x--)
{
.........
}
компилируется в принципиально разные ассемблерные конструкции, и исполняются с разной скоростью. Иногда влияет даже такие мелочи которые и значения вроде как не имеют. Для себя пришел к выводу, что наиболее оптимальный вариант, это СИшная программа с ассемблерными вставками, ПО НЕОБХОДИМОСТИ.
Кстати есть вопрос. Как в CV в ассемблерных вставках использовать переменные объявленные в СИшной части кода. Разумеется речь о переменных с постоянным адресом. Сейчас приходится объявлять переменные с привязкой к конкретному адресу в СИ, и потом также в ассемблере. Не очень удобно. Может кто знает более удобный способ.
|
|
|
|
26.08.2011, 18:27
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
|
Re: Inline функции в CodeVision AVR
Сообщение от =GM=
|
|
Ну это вы просто архитектуру АВР плохо понимаете. Прерывание может возникнуть когда угодно, в частности, непосредственно после команды MUL, которая использует r0 и r1 для хранения результата перемножения, так что при входе в прерывание в r1 может быть не нуль, а любое значение. Разработчики компилятора WinАVR знают об этом, а вы - пока нет.
|
Ага. Особенно в этом прерывании. CV, кстати, тоже об этом знает...
Удалось обработку прерывания USI только средствами Си довести до 21 такта.
В WinAVR на это уходило 44 такта... Ну да бог с ним. Вывод для себя я уже сделал.
Сообщение от =GM=
|
|
(Я на примере вашего проекта в другом месте WinАVR баг нашёл, возможно, поэтому выкидывает ваш код. Нет времени заняться, будет время - разберусь)
|
Не работает. Но я давал не весь код.
Кстати, быстродействие генератора довёл до 625 кГц. Правда через прерывания. Вся обработка прерывания те же 5 тактов. И только средствами Си (CV AVR).
|
|
|
|
26.08.2011, 18:36
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
|
Re: Inline функции в CodeVision AVR
Сообщение от Avalon
|
|
Может кто знает более удобный способ.
|
Может, я и ошибаюсь. Но когда CV создаёт .asm файл, то в нём присутствуют имена Си-переменных, но со знаком ' _' в начале (если переменная в памяти, конечно).
Например, в Си глобальная переменная объявлена
в ассемблере будет, например
|
PHP код:
|
STS _MyValue,R30
|
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
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.
|
|