|
WINAvr или IAR?, для тех, кто работал в обеих средах. |
|
|
3 страниц
1 2 3 >
|
 |
Ответов
(1 - 38)
|
Aug 18 2005, 12:36
|

Шаман
     
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221

|
Это не столько трата времени, сколько полезное освоение нового. Работал в обеих средах, начинал с WinAVR, но больше нравится IAR. Его преимущества: - полный, но ненагружающий контроль за всем процессом (компиляция, линковка, получение выходных файлов всевозможных форматов); - простота прошивки и отладки, особенно через JTAG (AVR Studio практически не использую); - компактный и быстрый код; - наблюдения показали, что темпы совершенствования среды превосходят WinAVR; - ...
|
|
|
|
|
Aug 19 2005, 09:41
|

Знающий
   
Группа: Свой
Сообщений: 521
Регистрация: 10-02-05
Пользователь №: 2 544

|
Цитата(Igor26 @ Aug 19 2005, 12:33) Цитата(Karl @ Aug 19 2005, 12:22) Последняя версия - EWAVR 4.10B? EWAVR 11A Извиняюсь. EWAVR 4.11A
|
|
|
|
|
Aug 19 2005, 10:01
|
Частый гость
 
Группа: Свой
Сообщений: 179
Регистрация: 4-02-05
Пользователь №: 2 429

|
Цитата(Igor26 @ Aug 19 2005, 14:41) Цитата(Igor26 @ Aug 19 2005, 12:33) Цитата(Karl @ Aug 19 2005, 12:22) Последняя версия - EWAVR 4.10B? EWAVR 11A Извиняюсь. EWAVR 4.11A Догадался  . Спасибо, качаю.
|
|
|
|
|
Aug 19 2005, 10:05
|

Знающий
   
Группа: Свой
Сообщений: 521
Регистрация: 10-02-05
Пользователь №: 2 544

|
Цитата(Karl @ Aug 19 2005, 13:01) Цитата(Igor26 @ Aug 19 2005, 14:41) Цитата(Igor26 @ Aug 19 2005, 12:33) Цитата(Karl @ Aug 19 2005, 12:22) Последняя версия - EWAVR 4.10B? EWAVR 11A Извиняюсь. EWAVR 4.11A Догадался  . Спасибо, качаю. Недели две назад на этом форуме кто-то выкладывал серийные номера для его установки. Удачи
|
|
|
|
|
Aug 22 2005, 05:49
|

Профессионал
    
Группа: Свой
Сообщений: 1 301
Регистрация: 30-11-04
Из: Россия, Н.Новгород
Пользователь №: 1 264

|
Цитата(Karl @ Aug 22 2005, 09:28) А где бы раздобыть примерчики проектов под IAR? После инсталяции 4.10В и его лечения, откройте tutorials.eww. Это и есть примеры небольших проектов для IAR AVR. Остальное как Вы знаете все из личного опыта, изучение help и общение на форуме с товарищами по "несчастию"  . Давно как то находил проекты в интернете, но они для старой версии компилятора и никак не подходят для 4.10В. Но если есть желание можете ознакомиться:
--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
|
|
|
|
|
Aug 22 2005, 08:56
|

Профессионал
    
Группа: Свой
Сообщений: 1 301
Регистрация: 30-11-04
Из: Россия, Н.Новгород
Пользователь №: 1 264

|
Цитата(Karl @ Aug 22 2005, 12:46) Что-то я библиотек стандартных функций в ИАР найти не могу... Вот пример стандартных функций из WinAvr: Bootloader Support Utilities CRC Computations Busy-wait delay loops EEPROM handling и т.д. Я думал, в ИАР подобные есть... Bootloader Support Utilities, CRC Computations, ... - а разьве это стандартные функции? Вроде бы стандартными функциями считались те, которые определены в ANSI 'C'.
--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
|
|
|
|
|
Aug 22 2005, 09:43
|

Профессионал
    
Группа: Свой
Сообщений: 1 301
Регистрация: 30-11-04
Из: Россия, Н.Новгород
Пользователь №: 1 264

|
Цитата(Karl @ Aug 22 2005, 12:59) не стандартные, но очень удобные при разработке  . Если они Вам очень дороги как память или Вы действительно привыкли с ними работать, что просто не обойтись возьмите исходники (если таковые имеются) и перекомпилируйте в новой среде. Так поступают многие, были бы исходники!  Ну а если все "плохо", приходиться делать свои. Например из-за необьятного размера кода на использование функции sprintf (форматирование в строку) мне в свое время пришлось писать свои функции - ограниченные под задачу.
--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
|
|
|
|
|
Aug 22 2005, 12:58
|
Группа: Новичок
Сообщений: 5
Регистрация: 8-07-05
Пользователь №: 6 645

|
Доброго времени, Все.
Что характерно - буржуи с avrfreaks практически не используют IAR. Вместо этого они активно юзают GCC и WinAVR.
Базару нет, что IAR круче (он ведь денег стоит) чем халявный GCC.
Только вот как быстро вы "с нуля" реализуете проект какой-нибудь "пикалки" с LCD и i2c-периферией ?
Под IAR прийдется прописывать все низкоуровневые операции самостоятельно. Да - в итоге вы будете полность контролировать код (ведь это будет ваш код). Только вот времени на это уйдет - не одна неделя.
Чем берет GCC (CodeVision, etc...) - "в них есть все, что нужно". Вы пишите только свою бизнес-логику. А весь низкоуровневый геморр отдаете на совесть разработчика компилятора. Здесь тоже есть свои минусы - ибо реализация "стандартной" (которая на самом деле как раз и включает в себя кучу полезных "фишек") библиотеки не идеальна и, как правило, содержит трудноуловимые ошибки.
И тут, как всегда, мы приходим к вопросу - так что же делать ?
Лично я на своем опыте убедился - если важно сделать быстро (дабы обойти конкурентов и предъявить хотя бы что-то) - нужно юзать CodeVision (WinAvr, Atman). Пусть и "сырое" зато уже есть. Кстати - вы вспомните как развивались продукты Microsoft...
Если времени дофига и хочется сделать "конфетку" - базара нет - только IAR.
Это ситуация на данный момент. А что будет через полгода - посмотрим.
Спасибо за внимание...
|
|
|
|
|
Aug 22 2005, 13:34
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(axis @ Aug 22 2005, 18:58) Что характерно - буржуи с avrfreaks практически не используют IAR. Вместо этого они активно юзают GCC и WinAVR. Ясно, денег своих платить не хотят. А кто на приличной фирме работает, для того это не проблема - три тонны баксов окупаются на той же поддержке довольно быстро. Цитата(axis @ Aug 22 2005, 18:58) Только вот как быстро вы "с нуля" реализуете проект какой-нибудь "пикалки" с LCD и i2c-периферией ?
Под IAR прийдется прописывать все низкоуровневые операции самостоятельно. Да - в итоге вы будете полность контролировать код (ведь это будет ваш код). Только вот времени на это уйдет - не одна неделя. Какие низкоуровневые операции переписывать? С чего переписывать?... Цитата(axis @ Aug 22 2005, 18:58) Чем берет GCC (CodeVision, etc...) - "в них есть все, что нужно". Вы пишите только свою бизнес-логику. А весь низкоуровневый геморр отдаете на совесть разработчика компилятора. В самом GCC никаких прикладных нестандартных вещей нет - это обычный программерский пакет, такой же как и IAR. Если кто-то для него написал библиотеку, так это другое дело. Для IAR тоже много чего написано. По большому счету, совершенно не важно, для какого пакета написан код, если он написан на С/С++ и написан грамотно. Наличие в CodeVision поддержки LCD для кого-то, возможно, и является значимым плюсом, но, имхо, это просто мелкая фенька. Гораздо важнее, что кодогенерация у IAR'а заметно лучше, и вообще фичи языка IAR поддерживает несравненно лучше - взять хотя бы ++, которых у CV вообще нет (и вряд ли появятся). К тому же лично, например, предпочитаю реализовывать подобные вещи сам - разобраться надо по-любому, а собственно реализация, когда уже знаешь, что к чему, много времени и сил не занимает. Цитата(axis @ Aug 22 2005, 18:58) Лично я на своем опыте убедился - если важно сделать быстро (дабы обойти конкурентов и предъявить хотя бы что-то) - нужно юзать CodeVision (WinAvr, Atman). Пусть и "сырое" зато уже есть. Кстати - вы вспомните как развивались продукты Microsoft... Если времени дофига и хочется сделать "конфетку" - базара нет - только IAR. Прошу простить, но это звучит достаточно бредово. Пакет как таковой тут вообще роль играет довольно слабо. На первом месте всегда сложность прикладной задачи и квалификация разарботчика в предметной области. Это главное. На втором месте то, как разработчик владеет тем или иным инстуменатрием. Если привык к GCC, на нем сделаешь быстрее, чем на IAR', даже, если по всем признакам IAR рулит (другое дело, что в данной ситуации имеет смысл задуматься об освоении более подходящего инструмента)... И напоследок. Вот подумайте над такой вещью. Вот надо мне кольцевой буфер. Для байтов. Вот написал я его. А потом понадобилось то же самое для целых. Или для структур. На IAR'е я напишу шаблон: template<typename T, word size, typename S = byte> class ring_buffer { ... } и буду инстанцировать себе буфера: Код ring_buffer<char, 16> CharBuf; // колцевой буфер на 16 char ring_buffer<int, 8> IntBuf; // колцевой буфер на 8 интов IAR это позволяет. GCC тоже. А CV? И сколько нужно времени, чтобы переписывать для CV одно и то же? И надо ли? Т.ч. еще вопрос, откуда и что переписывать. И где на выходе результат быстрее получится.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Aug 23 2005, 08:32
|

Шаман
     
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221

|
Что касается буржуйских форумов, то надо знать их специфику. Там в основном всё ориентировано на бесплатное или, по крайней мере, не дорогое (AtmanAVR, например). Во вторых, любые разговоры о лекарствах пресекаются либо модераторами либо "продвинутыми" юзерами (электрода, например). В третьих, купившие дорогой продукт больше предпочитают общаться с производителем, т. к. он как-никак обязан. В последних, AVRfreaks далеко не последний и далеко не лучший форум.
|
|
|
|
|
Aug 23 2005, 11:26
|
Группа: Новичок
Сообщений: 5
Регистрация: 8-07-05
Пользователь №: 6 645

|
Цитата(dxp @ Aug 22 2005, 19:34) Цитата(axis @ Aug 22 2005, 18:58) Что характерно - буржуи с avrfreaks практически не используют IAR. Вместо этого они активно юзают GCC и WinAVR. Ясно, денег своих платить не хотят. А кто на приличной фирме работает, для того это не проблема - три тонны баксов окупаются на той же поддержке довольно быстро. Цитата(axis @ Aug 22 2005, 18:58) Только вот как быстро вы "с нуля" реализуете проект какой-нибудь "пикалки" с LCD и i2c-периферией ?
Под IAR прийдется прописывать все низкоуровневые операции самостоятельно. Да - в итоге вы будете полность контролировать код (ведь это будет ваш код). Только вот времени на это уйдет - не одна неделя. Какие низкоуровневые операции переписывать? С чего переписывать?... Цитата(axis @ Aug 22 2005, 18:58) Чем берет GCC (CodeVision, etc...) - "в них есть все, что нужно". Вы пишите только свою бизнес-логику. А весь низкоуровневый геморр отдаете на совесть разработчика компилятора. В самом GCC никаких прикладных нестандартных вещей нет - это обычный программерский пакет, такой же как и IAR. Если кто-то для него написал библиотеку, так это другое дело. Для IAR тоже много чего написано. По большому счету, совершенно не важно, для какого пакета написан код, если он написан на С/С++ и написан грамотно. Наличие в CodeVision поддержки LCD для кого-то, возможно, и является значимым плюсом, но, имхо, это просто мелкая фенька. Гораздо важнее, что кодогенерация у IAR'а заметно лучше, и вообще фичи языка IAR поддерживает несравненно лучше - взять хотя бы ++, которых у CV вообще нет (и вряд ли появятся). К тому же лично, например, предпочитаю реализовывать подобные вещи сам - разобраться надо по-любому, а собственно реализация, когда уже знаешь, что к чему, много времени и сил не занимает. Цитата(axis @ Aug 22 2005, 18:58) Лично я на своем опыте убедился - если важно сделать быстро (дабы обойти конкурентов и предъявить хотя бы что-то) - нужно юзать CodeVision (WinAvr, Atman). Пусть и "сырое" зато уже есть. Кстати - вы вспомните как развивались продукты Microsoft... Если времени дофига и хочется сделать "конфетку" - базара нет - только IAR. Прошу простить, но это звучит достаточно бредово. Пакет как таковой тут вообще роль играет довольно слабо. На первом месте всегда сложность прикладной задачи и квалификация разарботчика в предметной области. Это главное. На втором месте то, как разработчик владеет тем или иным инстуменатрием. Если привык к GCC, на нем сделаешь быстрее, чем на IAR', даже, если по всем признакам IAR рулит (другое дело, что в данной ситуации имеет смысл задуматься об освоении более подходящего инструмента)... И напоследок. Вот подумайте над такой вещью. Вот надо мне кольцевой буфер. Для байтов. Вот написал я его. А потом понадобилось то же самое для целых. Или для структур. На IAR'е я напишу шаблон: template<typename T, word size, typename S = byte> class ring_buffer { ... } и буду инстанцировать себе буфера: Код ring_buffer<char, 16> CharBuf; // колцевой буфер на 16 char ring_buffer<int, 8> IntBuf; // колцевой буфер на 8 интов IAR это позволяет. GCC тоже. А CV? И сколько нужно времени, чтобы переписывать для CV одно и то же? И надо ли? Т.ч. еще вопрос, откуда и что переписывать. И где на выходе результат быстрее получится. Ответ понятен. Теоретически все правильно и логично. Хочу сказать за себя. Я не делаю денег на встроенных приложениях (по крайней мере сейчас) - занимаюсь этим как хобби (ибо для другого моего хобби нужны "умные" девайсы, купить которые в магазине, к сожалению, не возможно). Так вот, примерно год назад встал вопрос - чем написать софт под Мегу128. Выбирал между CV и IAR. IAR понравился сразу (ибо есть большой опыт работы под Visual Studio). Начал и погряз в рутине. Может быть плохо искал, но не нашел библиотек для работы с LCD на HD44780 и периферией на i2c. А затачивать под него написанное под другие среды оказалось не проще чем писать свое. А прописывать самому эту рутину было не в кайф (этож все-таки хобби). Поэтому пришлось смотреть в сторону CV. Да - это "вещь в себе", Но юзабельность CV на порядок превосходит IAR. Ибо достаточно функциональный проект можно забацать буквально за полчаса. И я считаю, что в качестве инструмента DIY-содера (типа,"сделай сам") это оптимальный выбор. IAR же птица "высокого полета" - инструмент более функциональный (с++ все-таки). Но отсутствие (поправьте если не так) поддержки стандартной периферии, делает его малопригодным для разработчика начального уровня. Еще раз хочу подчеркнуть, что никого ни к чему не принуждаю - все вышеописанное лишь мой личный опыт. Возможно кому-то он окажется полезен. P.S. А вот в качетстве средства отладки _ОДНОЗНАЧНО_ всем рекомендую Proteus - вещь просто супер!
|
|
|
|
|
Aug 29 2005, 12:50
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(halfdoom @ Aug 19 2005, 07:42) С точки зрения качества генерируемого кода IAR безусловно опережает gcc. Буквально неделю назад собрал проект под gcc и iar: gcc 3.4.1 нагенерил 18096, а iar 2.28a 12238 байт. У обоих включена оптимизация по скорости с максимальным уровнем оптимизации. GCC при -O3 (максимальная по скорости) инлайнит от себя всё, что считает нужным. Но если функция не была объявлена на уровне файла static (а, как показывают мои наблюдения, всё-таки мало кто ставит static пере функциями, которые вызываются только в данном файле), то её "основное" тело остаётся заодно с инлайновоё инкарнацией, что сильно раздувает код. Кроме того, при -O3 автоматически включается -funroll-all-loops, что тоже сильно раздувает код. Как правило, достаточно -O2, возможно с некоторыми доп ключами и ручное static inline для нужных коротких функций. В этом случае разница в объёме не в полтора раза, а 5-15%. Два основных источника: - прологи/эпилоги функций, gcc использует один стек и ему надо модифицировать каждый раз SPH,SPL, да ещё и с запретом прерываний. - gcc как правило обращается к глобальным переменным через sts/lds, тогда как зачастую выгоднее по коду загрузить указатель и ldd/std, IAR этого не упускает. А вот на коротких функциях с малым числом аргументов/локальных переменных (без стекового кадра) gcc действительно зачастую даёт более короткий и быстрый код.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Oct 27 2005, 09:41
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(beer_warrior @ Oct 27 2005, 14:15) Серьезным преимуществом IAR IMHO являеться более удобная работа с флеш-памятью. Преимуществом WinAVR (опять же IMHO), более развитая библиотека и контроль над процессом компиляции благодаря make. В остальном они сравнимы. IAR лучше avr-gcc во всем, кроме цены. Кодогенерация у него лучше, управление проще, поддержка оперативнее. Ничего не мешает использовать для сборки make (или хоть батник), чем лично я и пользуюсь.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Oct 27 2005, 20:18
|

фанат Linux'а
    
Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008

|
Цитата(IgorKossak @ Oct 27 2005, 10:26) Цитата(AVR @ Oct 26 2005, 23:34) Существуют ли готовые библиотеки функций для работы с LCD на HD44780 в среде IAR версии 4.11А? А причём тут IAR? Ищите просто библиотеки на C. Например на том же AVRFreaks или здесь на форуме. Массу полезных ссылок можно найти. Есть ли программные эмуляторы HD44780 для IAR или AVRStudio? Нужен такой плагин, т.к. у меня нет возможности проверить вывод на lcd на реальном железе.
--------------------
|
|
|
|
|
Oct 28 2005, 04:21
|
Участник

Группа: Свой
Сообщений: 48
Регистрация: 5-11-04
Пользователь №: 1 053

|
Цитата(AVR @ Oct 27 2005, 23:18) Есть ли программные эмуляторы HD44780 для IAR или AVRStudio? Нужен такой плагин, т.к. у меня нет возможности проверить вывод на lcd на реальном железе. Эмулятор VMLAB. Насколько я в курсе WinAVR/GCC он поддерживает. Правда надо менять тип дебаговой информации для объектныъ модулей.
|
|
|
|
|
Oct 28 2005, 07:50
|
Местный
  
Группа: Свой
Сообщений: 242
Регистрация: 27-01-05
Пользователь №: 2 225

|
Цитата(AVR @ Oct 27 2005, 23:18) Есть ли программные эмуляторы HD44780 для IAR или AVRStudio? Нужен такой плагин, т.к. у меня нет возможности проверить вывод на lcd на реальном железе. Features: supports Atmel AVR Studio 4, Version 4.09, 4.10.356, 4.11.401 and 4.11.403-405. simultaniously simulates one or more of each of the following components: HD44780U compatible LC-Display with up to 40 x 2 characters. Pushbuttons connected to Input Port Pins. LEDs connected to Output Port Pins. Terminal connected to USART, UART or TWI(I2C) ports. easy configuration of the components. configuration files are stored in future-save XML format. target device selection with all devices supported by the AVR Simulator. LCD features: acts like a real HD44780U. 1 or 2 Display lines. 8 to 40 characters per line. 4bit AND 8bit I/O mode support. supports the complete original character set (5 x 8 dot) including all the characters above 0x80 ;-) support for 8 user defined characters. supports blinking cursor, display shifting, cursor movement. selectable background color and display size (zoom factor). How to use HAPSIM - Quickstart: Download and unzip HYPERLINK "http://www.helmix.at/hapsim.htm" \l "hapsimdownload#hapsimdownload" HAPSIM and HYPERLINK "http://www.helmix.at/hapsim.htm" \l "hapsimdownload#hapsimdownload" LCDTest вот что-то подобное но сам не пробовал
Прикрепленные файлы
hapsim.rar ( 46.05 килобайт )
Кол-во скачиваний: 1355
|
|
|
|
|
Oct 28 2005, 08:08
|

Частый гость
 
Группа: Свой
Сообщений: 157
Регистрация: 14-11-04
Из: Санкт-Петербург
Пользователь №: 1 125

|
Кто тут "С"шные библиотеки искал? Есть в природе Procyon AVRlib от Pascal Stang, например, здесь: http://ccrma.stanford.edu/courses/250a/docs/avrlib/main.htmlHere is a list of all modules: Drivers (for AVR peripherals) A/D Converter Function Library (a2d.c) I2C Serial Interface Function Library (i2c.c) EEPROM Parameter Storage Library (param.c) Pulse/Frequency Generation Function Library (pulse.c) SPI (Serial Peripheral Interface) Function Library (spi.c) Timer Function Library (timer.c) Timer PWM Commands Timer Function Library for ATmega128 (timer128.c) Timer Function Library for ATmegaXX8 (timerx8.c) Timer PWM Commands UART Driver/Function Library (uart.c) UART Driver/Function Library for dual-UART processors (uart2.c) Drivers (for external hardware) TI ADS7828 I2C A/D Converter Driver (ads7828.c) TI ADS7870 SPI A/D Converter Driver (ads7870.c) IDE/ATA Interface Driver (ata.c) Dallas DS1631 Temperature Sensor Driver (ds1631.c) Quadrature Encoder Driver (encoder.c) Graphic LCD API (application programmer's interface) (glcd.c) GPS Positioning and Navigation Function Library (gps.c) Interface for standard I2C EEPROM memories (i2ceeprom.c) Graphic LCD Driver for HD61202/KS0108-based Displays (ks0108.c) Character LCD Driver for HD44780/SED1278-based displays (lcd.c) ST LIS3L02 3-axis I2C Accelerometer Library (lis3l02.c) MultiMedia and SD Flash Card Interface (mmc.c) NMEA Packet Interface for GPS Receivers (nmea.c) Interface for standard SPI EEPROM memories (spieeprom.c) ST STA013 MP3 Player Driver (sta013.c) TSIP Packet Interface for Trimble GPS Receivers (tsip.c) Drivers (software-based) Software I2C Serial Interface Function Library (i2csw.c) Interrupt-driven RC Servo Function Library (servo.c) Software Interrupt-driven UART Driver (uartsw.c) Software Interrupt-driven UART Driver (uartsw2.c) General Libraries Generic Bit-Buffer Structure and Function Library (bitbuf.c) Circular Byte-Buffer Structure and Function Library (buffer.c) Command-line Implementation (cmdline.c) FAT16/32 File System Interface (fat.c) Fixed-Point Math Function Library (fixedpt.c) printf() Function Library (rprintf.c) STX/ETX Packet Protocol Library (stxetx.c) VT100 Terminal Function Library (vt100.c) Network Library ARP Protocol Library (arp.c) ASIX AX88796 Ethernet Interface Driver (ax88796.c) Crystal CS8900 Ethernet Interface Driver (cs8900.c) DHCP Protocol Library (dhcp.c) ICMP Protocol Library (icmp.c) IP (Internet Protocol) Library (ip.c) Network support library (net.c) Network Stack (netstack.c) Network Interface Card (NIC) software definition (nic.h) PrismII 802.11b WLAN Interface Driver (prism2.c) Realtek RTL8019AS Ethernet Interface Driver (rtl8019.c) -------------------------------------------------------------------------------- Приятель разбирался - "не все оптимально, но вроде работает" Библиотека заточена под WinAVR/GCC
--------------------
WBR, ROC.
|
|
|
|
|
Oct 29 2005, 04:18
|

учащийся
    
Группа: Свой
Сообщений: 1 065
Регистрация: 29-10-05
Из: города контрастов
Пользователь №: 10 249

|
Nate, mozet prigoditsya - drayver dlya uart ucos RTOS pod avr. Mozet prigoditsya. Pisal sam .
dobavte v os_cpu_a.s90
EXTERN uart_UDREIsrAvr EXTERN uart_RXIsrAvr
COMMON INTVEC
DS 4 ; 1 RESET = $000 Reset interrupt Vector Address DS 4 ; 2 INT0addr = $002 External Interrupt0 Vector Address DS 4 ; 3 INT1addr = $004 External Interrupt1 Vector Address DS 4 ; 4 INT2addr = $006 External Interrupt2 Vector Address DS 4 ; 5 INT3addr = $008 External Interrupt3 Vector Address DS 4 ; 6 INT4addr = $00a External Interrupt4 Vector Address DS 4 ; 7 INT5addr = $00c External Interrupt5 Vector Address DS 4 ; 8 INT6addr = $00e External Interrupt6 Vector Address DS 4 ; 9 INT7addr = $010 External Interrupt7 Vector Address DS 4 ; 10 OC2addr = $012 Output Compare2 Interrupt Vector Address DS 4 ; 11 OVF2addr = $014 Overflow2 Interrupt Vector Address DS 4 ; 12 ICP1addr = $016 Input Capture1 Interrupt Vector Address DS 4 ; 13 OC1Aaddr = $018 Output Compare1A Interrupt Vector Address DS 4 ; 14 OC1Baddr = $01a Output Compare1B Interrupt Vector Address DS 4 ; 15 OVF1addr = $01c Overflow1 Interrupt Vector Address DS 4 ; 16 OC0addr = $01e Output Compare0 Interrupt Vector Address JMP OSTickISR ; 17 OVF0addr = $020 Overflow0 Interrupt Vector Address JMP spi_SpiIsr ; 18 SPIaddr = $022 SPI Interrupt Vector Address JMP uart_RXIsr0 ; 19 URXC0addr = $024 USART0 Receive Complete Interrupt Vector Address JMP uart_UDREIsr0 ; 20 UDRE0addr = $026 USART0 Data Register Empty Interrupt Vector Address DS 4 ; 21 UTXC0addr = $028 USART0 Transmit Complete Interrupt Vector Address DS 4 ; 22 ADCCaddr = $02a ADC Conversion Complete Handle JMP eep_ERDYIsr ; 23 ERDYaddr = $02c EEPROM Write Complete Handle DS 4 ; 24 ACIaddr = $02e Analog Comparator Interrupt Vector Address DS 4 ; 25 OC1Caddr = $030 Output Compare1C Interrupt Vector Address DS 4 ; 26 ICP3addr = $032 Input Capture3 Interrupt Vector Address DS 4 ; 27 OC3Aaddr = $034 Output Compare3A Interrupt Vector Address DS 4 ; 28 OC3Baddr = $036 Output Compare3B Interrupt Vector Address DS 4 ; 29 OC3Caddr = $038 Output Compare3C Interrupt Vector Address DS 4 ; 30 OVF3addr = $03A Overflow3 Interrupt Vector Address JMP uart_RXIsr1 ; 31 URXC1addr = $03C USART1 Receive Complete Interrupt Vector Address JMP uart_UDREIsr1 ; 32 UDRE1addr = $03E USART1 Data Register Empty Interrupt Vector Address DS 4 ; 33 UTXC1addr = $040 USART1 Transmit Complete Interrupt Vector Address DS 4 ; 34 TWIaddr = $042 TWI Interrupt Vector Address DS 4 ; 35 SPMRaddr = $044 Store Program Memory Ready Interrupt Vector Address END
;******************************************************************************* ************************* ; USART0 RX Complete handling ISR Routine ;******************************************************************************* *************************
uart_RXIsr0: PUSH_ALL ; Save all registers and status register IN R16,SREG ; Save the SREG but with interrupts enabled SBR R16,BIT07 ST -Y,R16 PUSH_SP ; Save the task's hardware stack pointer onto task's stack
LDS R16,OSIntNesting ; OSIntNexting++; INC R16 ; STS OSIntNesting,R16 ;
CPI R16,1 ; if (OSIntNesting == 1) { BRNE uart_rxc0_lab1 LDS R30,OSTCBCur ; OSTCBCur->OSTCBStkPtr = Y LDS R31,OSTCBCur+1 ST Z+,R28 ST Z+,R29 ; }
uart_rxc0_lab1: LDI R16, 0 ; Set previously stored port number CALL uart_RXIsrAvr ; Call ISR handling C Code function CALL OSIntExit
POP_SP ; Restore the hardware stack pointer from task's stack POP_SREG ; Restore the SREG register POP_ALL ; Restore all registers
RET ; Note: RET instead of RETI
;******************************************************************************* ************************* ; UART0 DATA REGISTER EMPTY Interrupt handling Routine ;******************************************************************************* ************************* uart_UDREIsr0: PUSH_ALL ; Save all registers and status register IN R16,SREG ; Save the SREG but with interrupts enabled SBR R16,BIT07 ST -Y,R16 PUSH_SP ; Save the task's hardware stack pointer onto task's stack LDS R16,OSIntNesting ; Notify uC/OS-II of ISR INC R16 ; STS OSIntNesting,R16 ;
CPI R16,1 ; if (OSIntNesting == 1) { BRNE uart_udre0_lab1 LDS R30,OSTCBCur ; OSTCBCur->OSTCBStkPtr = Y LDS R31,OSTCBCur+1 ST Z+,R28 ST Z+,R29 ; }
uart_udre0_lab1: LDI R16, 0 ; Set port to 0 CALL uart_UDREIsrAvr ; Call ISR handling C Code function CALL OSIntExit POP_SP ; Restore the hardware stack pointer from task's stack POP_SREG ; Restore the SREG register POP_ALL ; Restore all registers
RET ; Note: RET instead of RETI
a eto programma dlya raboti s uartom - read write with timeouts
/*@****************************************************************************** ****************************** * * * The comm.c module implementes platform independent functions for serial UART communication . * It must be cooperate with port dependent fucntions which are platform dependent . * * Data types : * typedef struct * { * INT8U state; // Port state * INT8U txstate; // Tx state * // Receive related data * OS_EVENT *rxsem; // Rx waiting semaphore * INT8U rxbuf[UART_RXBUF_SIZE]; // Pointer to UART Rx ring buffer * INT8U rxput; // Pointer to first empty pos in Rx ring buffer * INT8U rxget; // Pointer to first nonemtpy pos in Rx ring buffer * INT16U rxtimer; // Byte receive timer * // Transmit related data * OS_EVENT *txsem; // Tx waiting semaphore * INT8U txbuf[UART_TXBUF_SIZE]; // Pointer to UART Tx ring buffer * INT8U txput; // Pointer to first empty pos in Tx ring buffer * INT8U txget; // Pointer to first nonempty pos in Tx ring buffer * INT16U txtimer; // Byte transmit timer * }uart_uart; * * Functions : * Externaly UART subsystem communicates using 5 functions : * - uart_InitUart() * - uart_OpenUart() * - uart_CloseUart() * - uart_PutByte() * - uart_GetByte() * * Typical function usage is as follow : * - Initialize the whole uart subsystem with uart_InitUart() * - Then to use uart port invoke uart_OpenUart(). * - If result from uart_OpenUart() is not COM_NO_ERR it is possible to send and receive data to/from UART via * uart_PutByte() and uart_GetByte(). * - Finally if particular uart port is not needed - its resources can be deallocated by uart_CloseUart(). * ******************************************************************************** ******************************/ #include "uart.h" #include "uart_avr.h"
/******************************************************************************** ****************************** * . TYPEDEFS SECTION ******************************************************************************** ******************************/ typedef struct { INT8U state; // Port state INT8U txstate; // Tx state // Receive related data OS_EVENT *rxsem; // Rx waiting semaphore INT8U rxbuf[UART_RXBUF_SIZE]; // Pointer to UART Rx ring buffer INT8U rxput; // Pointer to first empty pos in Rx ring buffer INT8U rxget; // Pointer to first nonemtpy pos in Rx ring buffer INT16U rxtimer; // Byte receive timer // Transmit related data */ OS_EVENT *txsem; // Tx waiting semaphore INT8U txbuf[UART_TXBUF_SIZE]; // Pointer to UART Tx ring buffer INT8U txput; // Pointer to first empty pos in Tx ring buffer INT8U txget; // Pointer to first nonempty pos in Tx ring buffer INT16U txtimer; // Byte transmit timer }uart_uart;
/******************************************************************************** ****************************** * . STATIC DATA SECTION ******************************************************************************** ******************************/ static uart_uart uartbuf[UART_UART_SIZE];
/******************************************************************************** ****************************** * . DEFINITION SECTION ******************************************************************************** ******************************/ /*@-----------------------------------------------------------------------------------------------------------* | uart_InitUart() INITIALIZE UART SUBSYSTEM | | Syntax : | INT8S uart_InitUart(void) | | Arguments : | - | | Returns : | COM_NO_ERR - Function executed OK | | Description : | This function must be called at system startup before any UART related functions can be used | Function initializes UART internal data . | *------------------------------------------------------------------------------------------------------------*/ INT8S uart_InitUart(void) { INT8U cnt;
for(cnt =0; cnt < UART_UART_SIZE; cnt++) // Block all UARTs uartbuf[cnt].state = UART_STATE_CLOSE;
return COM_NO_ERR; }
/*@-----------------------------------------------------------------------------------------------------------* | uart_OpenUart() OPEN AND CONFIGURE UART PORT | | Syntax : | INT8S uart_OpenUart(INT8U port,INT16U rxtimer,INT16U txtimer,INT8U speed,INT8U length,INT8U parity,INT8U stopbit) | | Arguments : | INT8U port Port Identifier - UART_1, or UART_2 | INT8U rxtimer Receive timer value in number of clock ticks | INT8U txtimer Transmit timer value in number of clock ticks | INT8U speed UART speed - in form UART_SPEED_XXX, where XXX could be (300, 600, 1200, 2400, 4800, | 9600, 14400, 19200, 38400, 57600, 115200. | INT8U length Word data length - in form UART_SIZE_X, where X could be 5, 6, 7, 8, 9 | INT8U parity Parity setting - one of the UART_PARITY_EVEN, UART_PARITY_ODD, UART_PARITY_NONE | INT8U stopbit Stop bits setting - UART_STOPBIT_1, UART_STOPBT_15 and UART_STOPBIT_2 | | | Returns : | COM_NO_ERR If function executes OK | COM_ERR_PORTID If port identifier supplied is not correct | COM_ERR_PORT_OPEN If port is already opened | COM_ERR_TX_SEM Fault when creating Tx semaphore | COM_ERR_RX_SEM Fault when creating Rx semaphore | | Description : | *------------------------------------------------------------------------------------------------------------*/ INT8S uart_OpenUart ( INT8U port, // UART port ID INT16U rxtimer, // UART receive timeout INT16U txtimer, // UART transmit timeout INT8U speed, // UART port speed INT8U length, // UART data word size INT8U parity, // UART parity settings INT8U stopbit // UART stop bits ) { uart_uart *uart_p;
if(port >= UART_UART_SIZE ) // Check port value return COM_ERR_PORTID; // uart_p = &uartbuf[port]; // Fetch pointer to port data record // if((uart_p->rxsem = OSSemCreate(0)) == NULL) // Create RX Semaphore return COM_ERR_RX_SEM; // uart_p->rxput = 0; // Reset read position from Rx ring buffer uart_p->rxget = 0; // Reset write position to Rx ring buffer uart_p->rxtimer = rxtimer; // Set uart_uart receive timer // if((uart_p->txsem = OSSemCreate(UART_TXBUF_SIZE -1)) == NULL) // Create TX semaphore return COM_ERR_TX_SEM; // uart_p->txput = 0; // init read position from Tx ring buffer uart_p->txget = 0; // init write position to Tx ring buffer uart_p->txtimer = txtimer; // set uart_uart transmitt timer uart_p->txstate = UART_TX_STATE_OFF; // Set txstate to OFF // uart_OpenPortAvr(port, speed, length, parity, stopbit); // initalize platform dependent port data uart_p->state = UART_STATE_OPEN; // Bring port to traffic // return COM_NO_ERR; // }
/*@-----------------------------------------------------------------------------------------------------------* | uart_CloseUart() CLOSE UART PORT AND FREE ITS RESOURCES | | Syntax : | INT8S uart_CloseUart(INT8U port) | | Arguments : | COM_ERR_PORTID - Port Id assigned invalid value | COM_ERR_PORT_CLOSED - Port already in closed state | COM_NO_ERR - Function executed OK | | Returns : | COM_ERR_PORTID - Invalid (nonexisting) port referred | COM_NO_ERR - Function executed OK | | Description : | Function closes uart port and release its allocated reasources. | *------------------------------------------------------------------------------------------------------------*/ INT8S uart_CloseUart(INT8U port) { uart_uart *uart_p; INT8U err;
if(port >= UART_UART_SIZE ) // Validate port value return COM_ERR_PORTID; uart_p = &uartbuf[port]; // Select port to close if(uart_p->state == UART_STATE_CLOSE) // Check port state return COM_NO_ERR;
uart_p->state = UART_STATE_CLOSE; // Set port state uart_ClosePortAvr(port); // Down the port on platform dependent side OSSemDel(uart_p->rxsem, OS_DEL_ALWAYS, &err); // Delete receive semaphore OSSemDel(uart_p->txsem, OS_DEL_ALWAYS, &err); // Delete transmit semaphore
return COM_NO_ERR; }
/*@-----------------------------------------------------------------------------------------------------------* | uart_PutByte() SEND BYTE OVER UART PORT FUNCTION | | Syntax : | INT8S uart_PutByte(INT8U portid, INT8U byte ) | | Arguments : | INT8U portid - UART port identifier | INT8U byte - byte to send | | Return values : | COM_NO_ERR Character sent to transmit buffer OK | COM_ERR_PORT_CLOSED The port where transmit is attempted is not opened | COM_ERR_TX_SEM Problem occured on UART's TX semaphore | | Description : | The function is used to transfer one single byte over UART port . | *------------------------------------------------------------------------------------------------------------*/ INT8S uart_PutByte(INT8U portid, INT8U byte ) { #if OS_CRITICAL_METHOD == 3 // Allocate storage for CPU status register OS_CPU_SR cpu_sr; // #endif // INT8U err; // temp var for error uart_uart *uart_p; // pointer to uart data structure // if(portid >= UART_UART_SIZE) // Check port value return -1; // // uart_p = &uartbuf[portid]; // Fetch pointer to uart data record if(uart_p->state == UART_STATE_CLOSE) // Validate UART state return COM_ERR_PORT_CLOSED; // // if(uart_p->txstate == UART_TX_STATE_OFF) // If no ongoing transmit is active - send byte directly to port { // uart_p->txstate = UART_TX_STATE_ON; // Mar TX is active uart_StartTxAvr(portid, byte); // Invoke port gunction to send byte to the port } // else // Else if Transmitt is ongoing - put byte to transmit buffer { // OSSemPend(uart_p->txsem, 0, &err); // Wait on Tx Semaphore if buffer full if(err != OS_NO_ERR) // If semaphore error return COM_ERR_TX_SEM; // return error // OS_ENTER_CRITICAL(); // uart_p->txbuf[uart_p->txput++] = byte; // Put byte into transmit ring buffer if(uart_p->txput == UART_TXBUF_SIZE) // Increment ring buffer pointer uart_p->txput = 0; // OS_EXIT_CRITICAL(); // } // return COM_NO_ERR; // Return OK }
/*@-----------------------------------------------------------------------------------------------------------* | uart_GetByte() RECEIVE BYTE FORM UART PORT FUNCTION | | Syntax : | INT8S uart_GetByte(INT8U port, INT8U* rxbyte) | | Arguments : | INT8U port - UART port identifier | INT8U* rxbyte - Pointer to memory where received character will be stored | | Returns : | COM_NO_ERR - OK result | COM_ERR_PORT_CLOSED - Port is not initialised | COM_ERR_RX_TIMEOUT - Receive timeout occured | COM_ERR_RX_SEM - Problem with Rx semaphore happened | | Description : | Function receives one byte from the uart port. If byte is received OK it will be stored in memory | pointed by *rxbyte. Function will return error: | - if uart_OpenUart() fucntion was not invoked before on referred port | - if no byte received within uart timeout | - if system error with rx semaphore happened | *------------------------------------------------------------------------------------------------------------*/ INT8S uart_GetByte(INT8U port, INT8U* rxbyte) { #if OS_CRITICAL_METHOD == 3 // Allocate storage for CPU status register OS_CPU_SR cpu_sr; // #endif // uart_uart *uart_p; // pointer to port data INT8U err; // error var for semaphore handling // if(port >= UART_UART_SIZE) // Check uart port id return COM_ERR_PORT_CLOSED; // uart_p = &uartbuf[port]; // select port data to use if(uart_p->state == UART_STATE_CLOSE) // if port is not opened return COM_ERR_PORT_CLOSED; // return error - 'attempt to use closed port' // OSSemPend(uart_p->rxsem, uart_p->rxtimer, &err); // Wait for byte from Rx line switch(err) // Branch on the result { // case OS_NO_ERR : break; // Byte is ready - proceed case OS_TIMEOUT: return COM_ERR_RX_TIMEOUT; // Semaphore timeout default : return COM_ERR_RX_SEM; // Semaphore or OS problem } // // if(uart_p->rxget == uart_p->rxput) // Check if there is byte to process return COM_ERR_RX_TIMEOUT; // This is not needed as semaphore handles that // Extract received character from ring buffer OS_ENTER_CRITICAL(); // *rxbyte = uart_p->rxbuf[uart_p->rxget++]; // read byte from Rx ring buffer if(uart_p->rxget== UART_RXBUF_SIZE) // if overflow on Rx ring buffer ? uart_p->rxget = 0; // wrap around ring buffer OS_EXIT_CRITICAL();
return COM_NO_ERR; }
/*------------------------------------------------------------------------------------------------------------* | uart_PutByteIsr() - PUT RECEIVED BUFFER INTO RX BUFFER FUNCTION | | Syntax : | INT8S uart_PutByteIsr(INT8U port, INT8U byte) | | Arguments : | INT8U port - Uart port id | INT8U byte - Byte to store in rx buffer | | Returns : | COM_ERR_PORT_CLOSED - Port is not ready | COM_ERR_RXBUF_FULL - RX buffer full | COM_NO_ERR - Function executed OK | | Description : | The function is called from ISR device dependent uart source when new character received | from Rx line . | *------------------------------------------------------------------------------------------------------------*/ INT8S uart_PutByteIsr(INT8U port, INT8U byte) { #if OS_CRITICAL_METHOD == 3 // Allocate storage for CPU status register OS_CPU_SR cpu_sr; // #endif // uart_uart *uart_p; // // uart_p = &uartbuf[port]; // Select port data to use if(uart_p->state == UART_STATE_CLOSE) // If port is not ready return COM_ERR_PORT_CLOSED; // return error - 'attempt to use closed port' // OS_ENTER_CRITICAL(); // uart_p->rxbuf[uart_p->rxput] = byte; // Store byte in Rx ring buffer if(++(uart_p->rxput) == UART_RXBUF_SIZE) // Increment write pointer to rx buffer uart_p->rxput = 0; // wrap around Rx ring buffer read pointer // if(uart_p->rxput == uart_p->rxget) // if Rx ring buffer full ? { // uart_p->rxget++; // discard oldest character in ring buffer OS_EXIT_CRITICAL(); // disable interrupt and DO NOT POST SEMAPHORE return COM_ERR_RXBUF_FULL; // return error - 'Rx ring buffer full' } // OSSemPost(uart_p->rxsem); // Post semaphore to user task OS_EXIT_CRITICAL(); // // return COM_NO_ERR; // Return OK }
/*------------------------------------------------------------------------------------------------------------* | uart_GetByteIsr() - get byte from transmit buffer to send | | Syntax : | INT8S uart_GetByteIsr(INT8U portid, INT8U *byte) | | Arguments : | INT8U portid | INT8U *byte | | Returns : | Description : | The function is called from ISR when hardware completes character transfer on Tx line and ready to | transmit new character . When porting this code - hardware dependent function must analyse return | code from this function as follow : | - If return code is COM_NO_ERR transfer must proceed | - If return code either COM_ERR_PORT_CLOSED or COM_ERR_TXBUF_EMPTY transfer must be stopped | and Transmit interrupts must be disabled . | *------------------------------------------------------------------------------------------------------------*/ INT8S uart_GetByteIsr(INT8U portid, INT8U *byte) { #if OS_CRITICAL_METHOD == 3 // Allocate storage for CPU status register OS_CPU_SR cpu_sr; // #endif // uart_uart *uart_p; // pointer to uart data structure // uart_p = &uartbuf[portid]; // select port data // if(uart_p->state == UART_STATE_CLOSE) // if port is not opened return COM_ERR_PORT_CLOSED; // return error - 'attempt to use closed port' // Fetch byte from TX buffer if(uart_p->txget != uart_p->txput) // If TX buffer IS NOT EMPTY { // OS_ENTER_CRITICAL(); // Disable interrupts *byte = uart_p->txbuf[uart_p->txget]; // Get character from Tx ring buffer if(++(uart_p->txget) == UART_TXBUF_SIZE) // Increment read pointer uart_p->txget = 0; // OS_EXIT_CRITICAL(); // Enable interrupts OSSemPost(uart_p->txsem); // Post TX semaphore } // else // Else if Tx buffer is EMPTY { // uart_p->txstate = UART_TX_STATE_OFF; // set transimt state to passive return COM_ERR_TXBUF_EMPTY; // and report error - 'tx ring buffer empty' } // return COM_NO_ERR; // }
/******************************************************************************** ****************************** * . SECTIONS END ******************************************************************************** ******************************/
--------------------
Зачем лаять на караван , когда на него можно плюнуть?
|
|
|
|
|
Dec 17 2005, 20:09
|

Местный
  
Группа: Свой
Сообщений: 268
Регистрация: 4-11-05
Пользователь №: 10 470

|
Спасибо за http://ccrma.stanford.edu/courses/250a/docs/avrlib/main.htmlНо всетаки хотелось бы подобную библиотеку для ИАР!!! Можно конечно править эту. Так и делаю пока. Просто достало уже. Неужели таких для ИАР несуществует в мире?!!!  Поделитесь пожалуйста люди добрыи, кто чем сможет! Можно даже сборную такую библиотечку собрать, типа с миру по нитке...
Сообщение отредактировал Waso - Dec 17 2005, 20:11
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|