|
|
  |
Версии IAR -> EWAVR 4.30A, Есть ли смысл апгрэдить? |
|
|
|
Jun 20 2007, 15:50
|
Участник

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

|
Цитата(OLEG_BOS @ Jun 20 2007, 15:40)  Незнаю как Вас, Уважаемый IceS, а лично меня в первую очередь интересует конечный результат - это законченное рабочее устройство, а не диссертации на нему "Недостатки и преимущества различных версий IAR". Если бы я не был уверен в сказанном, не стал бы вас утруждать прочтением моего поста, а глюк имел место быть  , к сожалению. Сейчас делаю проект. С включенной оптимизацией долго пытался отладить код, не мог понять что за глюки, без оптимизации все ок. Посмотрел в листинг и ужаснулся, при оптимизации часть процедуры не скомпилена  , она вообще отсутствовала! Думал дело в отсутствии лицензии на софт  , и потому не придал особого значения. А вот счас думаю дело в компиляторе, тем более что сам ИАР об этом пишет. Сейчас, к сожалению, не получается воспроизвести эту ситуацию. Так что можете считать мои высказывания бездоказательными  , либо поверить на слово, что это имело место быть.
Сообщение отредактировал IceS - Jun 20 2007, 15:51
|
|
|
|
|
Jun 20 2007, 16:26
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(IceS @ Jun 20 2007, 21:50)  С включенной оптимизацией долго пытался отладить код, не мог понять что за глюки, без оптимизации все ок. Посмотрел в листинг и ужаснулся, при оптимизации часть процедуры не скомпилена  , она вообще отсутствовала! Думал дело в отсутствии лицензии на софт  , и потому не придал особого значения. А вот счас думаю дело в компиляторе, тем более что сам ИАР об этом пишет. Сейчас, к сожалению, не получается воспроизвести эту ситуацию. Так что можете считать мои высказывания бездоказательными  , либо поверить на слово, что это имело место быть. Не думаю, что кто-то станет опровергать это  Многие с таким поведением компилятора сталкивались. Только проблема не в том, что компилятор плохой, а в том, что программисты не внимательно читают его reference guide. Компилятор совершенно формально оптимизирует написанный вами исходник. И если "видит", что в данной функции переменная не изменяется, либо изменяется, но результат ее изменения не влияет на другие переменные, то он смело выкидывает код ее обработки, который вы перед этим долгое время "вылизывали". Чтобы избежать такой ситуации нужно тоже быть формалистом и внимательно прочитать про использование квалификатора volatile.
|
|
|
|
|
Jun 22 2007, 20:30
|

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

|
Цитата(ivainc1789 @ Jun 22 2007, 23:12)  Вроде бы простой алгоритм. А если подумать, хоть чуть-чуть? Рассмотрим простейший вариант: Имеем два файла в одном подпрограмма номер1 изменяющая некую переменную. В другом файле подпрограмма номер2 раборающая с ней-же. Обе подпрограммы откуда-то вызываются. Излагайте алгоритм.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jun 23 2007, 00:08
|
Гуру
     
Группа: Свой
Сообщений: 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. если я где-то ошибся в описаниях, то надеюсь более опытные товарищи меня поправят
|
|
|
|
|
Jun 25 2007, 21:08
|
Участник

Группа: Свой
Сообщений: 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; } проверьте или просто поверьте, все компилится.
|
|
|
|
|
Jun 25 2007, 21:20
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(IceS @ Jun 26 2007, 03:08)  проверьте или просто поверьте, все компилится. Охотно верю  Почему это не должно комплилиться-то? Тот факт, что вы разбили исходник на два модуля (файла) совершенно нивелируется командой препроцессора include, которая ДО компиляции первого модуля просто "вставляет" в него содержимое второго. Для компилятора ваш пример эквивалентен вот такому тексту исходника. Код unsigned char a; unsigned char b;
void func2() { a=b; } void main() { while(1) { func2(); b ^= a; } }
|
|
|
|
|
Sep 7 2007, 03:49
|

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 варианты  Evaluation версия является вполне полноценной, единственное ее серьезное отличие от релизной (коммерческой) состоит в том, что в ней отсутствуют исходнкики библиотек, поэтому самому собрать библиотеку вы не сможете. В остальном (по функциональности) там все то же самое. Кстати, ХХХ в названии обычно указывает на несколько иной контент, нежели тулчейн для программирования МК.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Sep 8 2007, 04:16
|
Группа: Новичок
Сообщений: 6
Регистрация: 16-06-06
Пользователь №: 18 108

|
4.30 при загрузке проекта начинает отжирать 50% ресурсов проца. У кого нить еще есть такое? Причем ладно бы при дебаге отжирал, так нет, в режиме редактирования. С чего бы это?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|