|
WinAVR - как оно?, Эффективность компилятора |
|
|
|
Jul 29 2005, 10:47
|
Гуру
     
Группа: СуперМодераторы
Сообщений: 2 065
Регистрация: 11-01-05
Из: Москва
Пользователь №: 1 892

|
Задумал я тут тулзы унифицировать окончательно. И понял, что альтернативы GNU / GCC нет - ибо, например, покупку IAR, считаю бессмысленной. Я просто понял, что оптимизация кода головой программера (и инвестирование денег в этого программера, и стимулирование оного (сделал хорошо - получи премию), разумеется, вздрачивание - куда же без него) дает больший эффект, чем выигрыш самого лучшего компилятора. Что касается среды - http://www.eclipse.org/ ок. С Армами все понятно. Там GCC рулит. Сами проверяли, инфы есть много на эту тему. Но вот для AVR (иногда надо делать "контроллеры светодиодов" за 1.5$) никогда не пробовал subj. Каково мнение народа? http://winavr.sourceforge.net/
|
|
|
|
3 страниц
< 1 2 3
|
 |
Ответов
(30 - 41)
|
Jun 2 2006, 09:45
|

Профессионал
    
Группа: Свой
Сообщений: 1 262
Регистрация: 13-10-05
Из: Санкт-Петербург
Пользователь №: 9 565

|
Цитата(defunct @ May 29 2006, 18:10)  Цитата(_4afc_ @ May 29 2006, 15:54)  Ну и вообще прерывания лучше на ассемблере писать, а то слишком много ресурсов съедает.
Не убедительно ;> В таком случае лучше вообще все писать на асм.. Я так и сделал. Просто компилируется всё данным пакетом (WinAVR). В прерываниях я имел в виду, что при входе там несколько регистров суются в стэк. Я же выделил несколько регистров для прерываний и в одном из них хранил регистр флагов. Это ускоряет начало работы вашего обработчика. Больше всего мешает тормознутость самой A48 - посылки SPI выполняются с ощутимой задержкой. По поводу printf и прочего - не знаю, я использую только синтаксис си, без использования каких-либо функций из поставок компилятора. CVAVR- не удобен своим визардом, в частности в визарде делители для таймеров ограничены. Кроме того для A128 генерился код, который не работал сразу (пара регистров не инитилась). ImageCraft - очень близок к WinAVR, но я замучился ставить каждое действие в скобки и постоянно преобразовывать типы перенося рабочий проект из WinAVR в ImageCraft. Читаемость текста пропала абсолютно. Цитата Я WinAVR использую года 2 и за это время сложилось достаточно положительное впечатление, но не без причуд. Похоже на уровне оптимизации WinAVR "не знает" что регистры 8 разрядные (разработчики портировали с другой архитектуры без существенной переработки, это моё личное мнение) полностью согласен, отсюда и страсть к перенисению всех данных в озу.
|
|
|
|
|
Jun 2 2006, 12:10
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
Цитата отсутствие прагмы управления оптимизацией. А зачем? Цитата Кроме того, хотя можно смириться, makefile в таком случае становится кошмаром. Если это действительно нужно, пишется makefile не настолько навороченный универсальный как в mfile, а обычный с явно указанными ключами компилятора к каждому файлу и все дела. ИМХО вся прелесть makefile - возможность накрутить такой режим компиляции, который ни одной IDE не под силу.
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Jun 2 2006, 12:32
|

Знающий
   
Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768

|
Цитата(_4afc_ @ Jun 2 2006, 13:45)  Больше всего мешает тормознутость самой A48 - посылки SPI выполняются с ощутимой задержкой.
CVAVR- не удобен своим визардом, в частности в визарде делители для таймеров ограничены. Кроме того для A128 генерился код, который не работал сразу (пара регистров не инитилась). Можно пару вопросов? А как вы меряли задержку посылки SPI-тестовой прогой в цикле-загрузка данных-дернуть пин.И как частотомером в интервальном режиме или осцилом с внешней синхронизацией? И вывод по поллингу или по прерываниям? И сколько тактов получилась задержка? А насчет кодвижина вы попали пальцем в небо  В визарде устнавливаются все разряды прескалера,и насчет меги128-у меня сейчас на столе девайс лежит-все путем,в стартап не лазил. С какими регистрами проблема-то была?
--------------------
"Hello, word!" - 17 errors 56 warnings
|
|
|
|
|
Jun 2 2006, 12:54
|
Местный
  
Группа: Участник
Сообщений: 328
Регистрация: 1-06-06
Из: USA
Пользователь №: 17 672

|
Цитата(beer_warrior @ Jun 2 2006, 08:10)  Цитата отсутствие прагмы управления оптимизацией. А зачем? Это примерно тоже самое как и иностранный язык! Не понимаю ну и зачем?! Есть такое понятие как инкапсуляция. Чтобы какая-нибудь переменная была видима только в одном файле ее делают static. Теперь представем себе, что она нам необходима в нескольких местах, которые хотелось бы оптимизировать по-разному, но переменная-то static... IAR, как наиболее профессиональный компилятор эту прагму поддерживает.
--------------------
|
|
|
|
|
Jun 2 2006, 13:07
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
Цитата Теперь представем себе, что она нам необходима в нескольких местах, которые хотелось бы оптимизировать по-разному Вот этого то и не понимаю, код или отпимизируеться или нет. Зачем это нужно с отдельно взятыми модулями? Все равно оно все ляжет в один бинарник. Тем более как сделать это я показал.
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Jun 2 2006, 13:59
|
Местный
  
Группа: Участник
Сообщений: 328
Регистрация: 1-06-06
Из: USA
Пользователь №: 17 672

|
Цитата(beer_warrior @ Jun 2 2006, 09:07)  Вот этого то и не понимаю. А вот тут, извините, помочь не смогу...
Сообщение отредактировал pitt - Jun 2 2006, 14:00
--------------------
|
|
|
|
|
Jun 8 2006, 07:11
|
Участник

Группа: Новичок
Сообщений: 34
Регистрация: 2-10-05
Пользователь №: 9 141

|
Помогите разобраться. Не собирается проект. Линковщик ругается, что не определить ссылку. Вот что пытаюсь собрать: main.cpp Код #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include <avr/wdt.h> #include <avr/pgmspace.h> #include "clDS1820.h"
int main(void) { clDS1820<4> dd; volatile uint8_t d=dd.Finish(); for(;;); return (0); }; clDS1820.h Код #ifndef _DS1820_MY_LIBRARY_ #define _DS1820_MY_LIBRARY_ #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h>
template <uint8_t count> class clDS1820 { private: static const uint8_t dsd=4; public: uint8_t Finish(void); }; #endif clDS1820.cpp Код #include "clDS1820.h" template <uint8_t count> uint8_t clDS1820<count>::Finish(void) { return(dsd); } Вот что выдает компилятор: Код avr-gcc (GCC) 3.4.5 Copyright (C) 2004 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Compiling: main.cpp avr-g++ -c -mmcu=at90can128 -I. -gdwarf-2 -DF_CPU=14745600UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wa,-adhlns=main.lst -Ic:\Sourse\Library -std=gnu++98 -MD -MP -MF .dep/main.o.d main.cpp -o main.o main.cpp: In function `int main()': main.cpp:12: warning: unused variable 'd'
Compiling: clDS1820.cpp avr-g++ -c -mmcu=at90can128 -I. -gdwarf-2 -DF_CPU=14745600UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wa,-adhlns=clDS1820.lst -Ic:\Sourse\Library -std=gnu++98 -MD -MP -MF .dep/clDS1820.o.d clDS1820.cpp -o clDS1820.o
Linking: main.elf avr-g++ -mmcu=at90can128 -I. -gdwarf-2 -DF_CPU=14745600UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wa,-adhlns=main.o -Ic:\Sourse\Library -std=gnu++98 -MD -MP -MF .dep/main.elf.d main.o clDS1820.o --output main.elf -Wl,-Map=main.map,--cref -lm main.o: In function `main': C:\Sourse\Spirit\trunk\GCC/main.cpp:12: undefined reference to `clDS1820<(unsigned char)4>::Finish()' C:\WinAVR\utils\bin\make.exe: *** [main.elf] Error 1
> Process Exit Code: 2 > Time Taken: 00:00 Если функцию Final описать в файле clDS1820.h, т.е. при объявлении класса, то все собирается. Т.е. вот так: Код template <uint8_t count> class clDS1820 { private: static const uint8_t dsd=4; public: uint8_t Finish(void){return(dsd);}; };
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|