реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Версии IAR -> EWAVR 4.30A, Есть ли смысл апгрэдить?
IceS
сообщение Jun 20 2007, 15:50
Сообщение #16


Участник
*

Группа: Свой
Сообщений: 43
Регистрация: 17-10-06
Из: Санкт Петербург
Пользователь №: 21 387



Цитата(OLEG_BOS @ Jun 20 2007, 15:40) *
Незнаю как Вас, Уважаемый IceS, а лично меня в первую очередь интересует конечный результат - это законченное рабочее устройство, а не диссертации на нему "Недостатки и преимущества различных версий IAR".

Если бы я не был уверен в сказанном, не стал бы вас утруждать прочтением моего поста, а глюк имел место быть sad.gif, к сожалению. Сейчас делаю проект. С включенной оптимизацией долго пытался отладить код, не мог понять что за глюки, без оптимизации все ок. Посмотрел в листинг и ужаснулся, при оптимизации часть процедуры не скомпилена 07.gif , она вообще отсутствовала! Думал дело в отсутствии лицензии на софт wink.gif , и потому не придал особого значения. А вот счас думаю дело в компиляторе, тем более что сам ИАР об этом пишет.

Сейчас, к сожалению, не получается воспроизвести эту ситуацию. Так что можете считать мои высказывания бездоказательными sad.gif, либо поверить на слово, что это имело место быть.

Сообщение отредактировал IceS - Jun 20 2007, 15:51
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 20 2007, 16:26
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(IceS @ Jun 20 2007, 21:50) *
С включенной оптимизацией долго пытался отладить код, не мог понять что за глюки, без оптимизации все ок. Посмотрел в листинг и ужаснулся, при оптимизации часть процедуры не скомпилена 07.gif , она вообще отсутствовала! Думал дело в отсутствии лицензии на софт wink.gif , и потому не придал особого значения. А вот счас думаю дело в компиляторе, тем более что сам ИАР об этом пишет.

Сейчас, к сожалению, не получается воспроизвести эту ситуацию. Так что можете считать мои высказывания бездоказательными sad.gif, либо поверить на слово, что это имело место быть.

Не думаю, что кто-то станет опровергать это wink.gif Многие с таким поведением компилятора сталкивались. Только проблема не в том, что компилятор плохой, а в том, что программисты не внимательно читают его reference guide. Компилятор совершенно формально оптимизирует написанный вами исходник. И если "видит", что в данной функции переменная не изменяется, либо изменяется, но результат ее изменения не влияет на другие переменные, то он смело выкидывает код ее обработки, который вы перед этим долгое время "вылизывали". Чтобы избежать такой ситуации нужно тоже быть формалистом и внимательно прочитать про использование квалификатора volatile.
Go to the top of the page
 
+Quote Post
ivainc1789
сообщение Jun 22 2007, 20:12
Сообщение #18


Профессионал
*****

Группа: Свой
Сообщений: 1 175
Регистрация: 5-01-05
Пользователь №: 1 807



Я конечно не эксперт в программировании, но объясните плиз почему оптимизатор не может САМ себе объявить соотв переменные прерываний, к которым есть обращение в основной программе как volatile ? Вроде бы простой алгоритм. А то тут столько народу на эти вилы попадает...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 22 2007, 20:30
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(ivainc1789 @ Jun 22 2007, 23:12) *
Вроде бы простой алгоритм.

А если подумать, хоть чуть-чуть? Рассмотрим простейший вариант:
Имеем два файла в одном подпрограмма номер1 изменяющая некую переменную. В другом файле подпрограмма номер2 раборающая с ней-же. Обе подпрограммы откуда-то вызываются.
Излагайте алгоритм.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 22 2007, 20:50
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(ivainc1789 @ Jun 23 2007, 02:12) *
Я конечно не эксперт в программировании, но объясните плиз почему оптимизатор не может САМ себе объявить соотв переменные прерываний, к которым есть обращение в основной программе как volatile ?

Любая программа не умнее программиста, написавшего его. Это медицинский факт! laughing.gif
Если вы сможете формализировать (придумать алгоритм) правило по которому оптимизатор должен самостоятельно присваивать переменным квалификатор volatile, то сразу же напишите об этом авторам компилятора. Ни сколько не сомневаюсь, что они очень обрадуются такому подарку. Я не шучу!
Go to the top of the page
 
+Quote Post
ivainc1789
сообщение Jun 22 2007, 22:19
Сообщение #21


Профессионал
*****

Группа: Свой
Сообщений: 1 175
Регистрация: 5-01-05
Пользователь №: 1 807



Цитата(zltigo @ Jun 23 2007, 00:30) *
А если подумать, хоть чуть-чуть? Рассмотрим простейший вариант:
Имеем два файла в одном подпрограмма номер1 изменяющая некую переменную. В другом файле подпрограмма номер2 раборающая с ней-же. Обе подпрограммы откуда-то вызываются.
Излагайте алгоритм.


Так я "пыталсо" думать... lol.gif Но видимо безуспешно... biggrin.gif
Я рассматриваю случай, когда переменная изменяется В ПРЕРЫВАНИИ (в обработчике). Компилятор (или оптимизатор, в данном контексте - не суть) может просто не оптимизировать переменные, которые изменяют свое значение в прерываниях. Соответственно, любые вхождения данной переменной в других файлах также не оптимизируются. И как бы не вижу тут проблем. Компилятор по отношению к сорцам - внешняя программа, можно запросто получить список переменных обработчиков и передать оптимизатору указание не выкидывать эти переменные вне обработчиков. Что я не понимаю, изложите плиз...
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 23 2007, 00:08
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(ivainc1789 @ Jun 23 2007, 03:19) *
Я рассматриваю случай, когда переменная изменяется В ПРЕРЫВАНИИ (в обработчике). Компилятор (или оптимизатор, в данном контексте - не суть) может просто не оптимизировать переменные, которые изменяют свое значение в прерываниях.

А откуда компилятор должен знать, что переменная изменяется в прерывании? Для него функция обработчика прерывания это такая же функция как и другие. Отличие ее лишь в том, что адрес вызова этой функции компилятор размещает по указанному вектору и заканчивается функция оператором reti, а не ret.
Цитата(ivainc1789 @ Jun 23 2007, 03:19) *
Соответственно, любые вхождения данной переменной в других файлах также не оптимизируются. И как бы не вижу тут проблем. Компилятор по отношению к сорцам - внешняя программа, можно запросто получить список переменных обработчиков и передать оптимизатору указание не выкидывать эти переменные вне обработчиков. Что я не понимаю, изложите плиз...

Не сочтите за грубость, но чтобы разбираться далее предлагаю небольшой ликбез.
Напомню, что в Си есть четыре класса переменных: автоматические (локальные), регистровые, статические и глобальные (внешние). Регистровые можно вообще не рассматривать, т.к. обычно компиляторы для embedded приложений "чихали" на такое объявление. Они используют регистры по своему усмотрению, так как им более удобно ускорить выполнение программы.
Из оставшихся трех у локальных и статических переменных ограниченная область "видимости". Локальные "видны" компилятору в пределах функции или блока (части функции). Под локальные переменные отводится область памяти на стеке или в регистрах.
Глобальные переменные располагаются в основном ОЗУ. Область видимости у них весь модуль, где они объявлены. Чтобы глобальная переменная была видна в другом модуле, ее нужно объявить в нем тоже, но только обязательно указав, что она является внешней (с квалификатором extern). Иначе компилятор сделает попытку создасть еще одну переменную с таким же именем, а линковщик потом выдаст ошибку, указав на дублирование имен глобальных переменных.
Статические переменные могут быть как локальными, так и глобальными, но с перечисленными выше особенностями. Отличие статической локальной переменной от обычной автоматической (локальной) в том, что для статических переменных всегда отводится память в основном ОЗУ. А статические глобальные переменные имеют область видимости ограниченную текущим модулем.
Вы многомодульные программы писали когда-нибудь? Имею в виду программу (проект) состоящую из нескольких файлов. Если да, то странно, что не понимаете разницу в работе компилятора и линковщика. Компилятор содает объектные модули для кажого исходного файла отдельно, обрабатывая исходный текст в соответствии со своими алгоритмами оптимизации. Т.е. "переводит" с языка Си на язык ассемблера, а затем в объектный код. По большому счету он не "знает" о глобальных переменных, объявленных в других файлах. О всех переменных "знает" только линковщик. Но линковщик уже НЕ оптимизирует код, он только редактирует связи между объектами, подставляя и проверяя адреса для меток и переменных. Оптимизирует код компилятор, но он НЕ знает о всех переменных, расположенных во всех файлах проекта.
Понимаете какой замкнутый круг получается? Поэтому-то формализация автоматического объявления переменных в тип volatile весьма неординарна и "в лоб" не решается.
P.S. если я где-то ошибся в описаниях, то надеюсь более опытные товарищи меня поправят laughing.gif
Go to the top of the page
 
+Quote Post
IceS
сообщение Jun 25 2007, 21:08
Сообщение #23


Участник
*

Группа: Свой
Сообщений: 43
Регистрация: 17-10-06
Из: Санкт Петербург
Пользователь №: 21 387



Цитата(rezident @ Jun 23 2007, 04:08) *
А откуда компилятор должен знать, что переменная изменяется в прерывании? Для него функция обработчика прерывания это такая же функция как и другие. Отличие ее лишь в том, что адрес вызова этой функции компилятор размещает по указанному вектору и заканчивается функция оператором reti, а не ret.

ну так присвоение происходит переменной, значит она изменяется, все - таки обработчик прерывания для компилятора не такая уж и обычная функия, хотя бы даже по тому что у нее другая команда возврата!

Цитата
...
Область видимости у них весь модуль, где они объявлены. Чтобы глобальная переменная была видна в другом модуле, ее нужно объявить в нем тоже
...


модуль 1
Код
unsigned char a;
#include "module2.c"
void main()
{
  while(1)
  {
    func2();
    b ^= a;
  }
}


модуль 2 "module2.c"
Код
unsigned char b;

void func2()
{
  a=b;
}

проверьте или просто поверьте, все компилится.
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 25 2007, 21:20
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(IceS @ Jun 26 2007, 03:08) *
проверьте или просто поверьте, все компилится.

Охотно верю smile.gif Почему это не должно комплилиться-то? Тот факт, что вы разбили исходник на два модуля (файла) совершенно нивелируется командой препроцессора include, которая ДО компиляции первого модуля просто "вставляет" в него содержимое второго. Для компилятора ваш пример эквивалентен вот такому тексту исходника.
Код
unsigned char a;
unsigned char b;

void func2()
{
  a=b;
}
void main()
{
  while(1)
  {
    func2();
    b ^= a;
  }
}
Go to the top of the page
 
+Quote Post
aspID
сообщение Sep 6 2007, 18:24
Сообщение #25


Местный
***

Группа: Свой
Сообщений: 343
Регистрация: 24-01-07
Из: Новосибирск
Пользователь №: 24 714



Простите новичка, но кто-нибудь может подсказать по поводу версии "не -ev-"? Очень хотелось бы отладчик возыметь... Общаться приходится в основном с Tiny2313. Отлаживаюсь в AVR Studio, но хотелось бы иметь отладчик в IAR. Насколько такое возможно? Нахожу только ewavr-ev-web-XXX(a).exe варианты sad.gif

Первый приходящий в голову нормальному человеку, не нарушающему права не предлагать smile.gif

Сообщение отредактировал aspID - Sep 6 2007, 18:26
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 6 2007, 18:54
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(aspID @ Sep 6 2007, 21:24) *
кто-нибудь может подсказать...

Попробуйте более прямо спросить - я чего-то не понял sad.gif. Ну взяли EV версию и пользуйтесь в том числе и отладчиком.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
rezident
сообщение Sep 6 2007, 19:36
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



aspID, чего надо-то? cranky.gif В версии evaluation отладчик/дебаггер (C-Cpy) не только имеется, но и работает. Если же хочется купить полную версию продукта, то при наличии денег это тоже не проблема. См. прайсы у дилеров IAR в России, например, у МТ-Систем.
Go to the top of the page
 
+Quote Post
dxp
сообщение Sep 7 2007, 03:49
Сообщение #28


Adept
******

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



Цитата(aspID @ Sep 7 2007, 01:24) *
Простите новичка, но кто-нибудь может подсказать по поводу версии "не -ev-"? Очень хотелось бы отладчик возыметь... Общаться приходится в основном с Tiny2313. Отлаживаюсь в AVR Studio, но хотелось бы иметь отладчик в IAR. Насколько такое возможно? Нахожу только ewavr-ev-web-XXX(a).exe варианты sad.gif

Evaluation версия является вполне полноценной, единственное ее серьезное отличие от релизной (коммерческой) состоит в том, что в ней отсутствуют исходнкики библиотек, поэтому самому собрать библиотеку вы не сможете. В остальном (по функциональности) там все то же самое.

Кстати, ХХХ в названии обычно указывает на несколько иной контент, нежели тулчейн для программирования МК. smile.gif


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
aspID
сообщение Sep 7 2007, 04:51
Сообщение #29


Местный
***

Группа: Свой
Сообщений: 343
Регистрация: 24-01-07
Из: Новосибирск
Пользователь №: 24 714



Да, перечитал инфо на сайте иара. Спутал видимо "It does not include support for MISRA C." с отладчиком.
Но тогда я не понял, почему может не запускаться отладчик. При попытке запуска Debug происходит сборка проекта и.... и на этом все заканчивается. IAR C/C++ Compiler for AVR 4.30A/W32 [Evaluation] (4.30.1.3)

Удалось запустить отладчик. Спасибо отозвавшимся! Не понимаю, почему на другой машине вчера не мог запустить... Буду пробовать еще вечером.

Сообщение отредактировал aspID - Sep 7 2007, 05:08
Go to the top of the page
 
+Quote Post
JimBin
сообщение Sep 8 2007, 04:16
Сообщение #30





Группа: Новичок
Сообщений: 6
Регистрация: 16-06-06
Пользователь №: 18 108



4.30 при загрузке проекта начинает отжирать 50% ресурсов проца. У кого нить еще есть такое? Причем ладно бы при дебаге отжирал, так нет, в режиме редактирования. С чего бы это?
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 21:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.01507 секунд с 7
ELECTRONIX ©2004-2016