Dmitro25 0 19 марта, 2010 Опубликовано 19 марта, 2010 · Жалоба Ещё возник вопрос про IAR: Я в настройках проекта в "General Options" наткнулся на параметры RSTACK и CSTACK. Первый предназначен, как я понял, для хранения адресов возврата из вызываемых функций или прерываний. Второй - для хранения параметров, передаваемых в функции, а также для хранения локальных переменных. Для интереса я решил установить оба параметра в 0 и посмотреть, что скажет компилятор. На моё удивление, ни ошибок, ни предупреждений компилятор не выдал, однако выходной файл отличался по содержимому от скомпилированного с "родными" значениями RSTACK и CSTACK. Отсутствие предупреждений со стороны компилятора - это довольно странно - ведь с нулевыми значениями объёмов стеков программа будет однозначно неработоспособна. И непонятно, как оценивать требуемый программе объём стека. Если для RSTACK его можно прикинуть по максимальной глубине вложенности функций, то с CSTACK вообще непонятно: кто его знает, как оптимизирует компилятор вызов функций, сколько параметров передаст через регистры, а сколько - через стек, то же самое и про локальные переменные. Нет ли в компиляторе IAR способа автоматически оценить требуемый объём стека? Просто раньше я компилировал проекты с помощью CodeVisionAVR, там компилятор выдавал прогнозируемый объём стека данных, анализируя самую длинную цепочку вложенных вызовов функций с учётом прерываний. В случае, если рассчитанный объём стека превышал указанный в настройках проекта, выдавалось предупреждение. Понятно, что этот метод не учитывает рекурсию, вложенных вызов прерываний, но всё-таки это уже что-то. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 133 19 марта, 2010 Опубликовано 19 марта, 2010 · Жалоба Отсутствие предупреждений со стороны компилятора - это довольно странно - ведь с нулевыми значениями объёмов стеков программа будет однозначно неработоспособна.Ничего удивитального. Она может быть неработоспособна с любыми значениями. Компилятор определеить потребный размер стека не может, а генерить ошибку единственно в случае заданного размера 0 - какой смысл? Ну кому придет в голову ставить размер стека 0, ведь "программа будет однозначно неработоспособна". И непонятно, как оценивать требуемый программе объём стека. Если для RSTACK его можно прикинуть по максимальной глубине вложенности функций, то с CSTACK вообще непонятно: кто его знает, как оптимизирует компилятор вызов функций, сколько параметров передаст через регистры, а сколько - через стек, то же самое и про локальные переменные.Я изменял скрипт линкера так, чтобы под CSTACK оказывалась доступной вся свободная память. RSTACK, как вы сами заметили, можно легко прикинуть, а CSTACK ставил произвольный - все равно фактически ему доступна вся свободная память. Для этого я копировал в проект скрипт линкера из папок компилятора и изменял в нем строчки -Z(DATA)RSTACK+_..X_RSTACK_SIZE=_..X_SRAM_BASE-_..X_SRAM_END -Z(DATA)CSTACK+_..X_CSTACK_SIZE=_..X_SRAM_BASE-_..X_SRAM_END на -Z(DATA)RSTACK+_..X_RSTACK_SIZE#_..X_SRAM_BASE-_..X_SRAM_END -Z(DATA)CSTACK+_..X_CSTACK_SIZE#_..X_SRAM_BASE-_..X_SRAM_END Нет ли в компиляторе IAR способа автоматически оценить требуемый объём стека?Как-то можно было получить в .map дерево вызовов с оценкой глубины стека. Но как - не помню. Может кто-то другой подскажет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dmitro25 0 23 марта, 2010 Опубликовано 23 марта, 2010 · Жалоба Спасибо Вам за ответ, Сергей. Всё-таки меня смутило то, что IAR не помогает пользователю оценить размер стека. Информацию о размере стека, который используется каждой функцией, можно, как оказалось получить из *.LST - файла. В конце его содержится таблица "Maximum stack usage in bytes". Там для текущего модуля проекта содержится список его функций с указанием используемого данной функцией размера CStack и RStack, а также список подфункций, которые вызываются из каждой функции модуля. Чтобы вычислить максимальный требуемый размер каждого из стеков необходимо просмотреть все пути вызовов и выбрать максимальный по каждому из стеков. Поскольку вручную это делать не очень удобно, я написал программу, которая находит максимальные пути автоматически. Она приложена к данному сообщению. Для использования необходимо в опциях проекта включить генерацию *.LST-файлов. Программу нужно скопировать в папку "List" текущей конфигурации. После запуска программа анализирует все *.LST файлы в текущей папке, ищет максимальные пути для вычисления максимальных значений для CStack и RStack. Также программа пытается детектировать процедуры прерываний и анализирует максимальные пути для них отдельно. В качестве результата выводится сумма путей для прерываний и для обычных функций. По идее эти значения могут использоваться для задания параметров CStack и RStack компилятора. На чём мог, я её оттестировал. Замечания и предложения приветствуются. Stack.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
eric47 0 29 марта, 2010 Опубликовано 29 марта, 2010 · Жалоба Здравствуйте! Недавно скачал ИАР написал программу всё компилируется---warnings 0 errors 0 (версия ИАР 5.20.1),но :rolleyes: выходной файл у ИАРа .а90 или .д90, а STK500 не понимает и отказывается шить--нужен .hex :laughing: , PonyProg шьёт но неправильно в итоге программа в железе не работает! Как научить ИАР делать НЕХ? Программа рабочая я её проверял другим компилятором КодеВижн Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 133 29 марта, 2010 Опубликовано 29 марта, 2010 · Жалоба Как научить ИАР делать НЕХ?выбрать в настройках линкера формат Intel Extended. Или так. Расширение по умолчанию будет a90, но его можно поменять в соответствующем поле настроек. Программа рабочая я её проверял другим компилятором КодеВижнА вот это не показатель. Оптимизатор у CV похуже, некоторые ошибки (часто связанные с отсутствием ключевого слова volatile) могут в нем не проявиться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Stanislav_S 0 29 марта, 2010 Опубликовано 29 марта, 2010 · Жалоба Зайти в Project\Options\Linker\Output\Format - Other - intel - standart, название и расширение файла выставляем по вкусу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nikkolaj 0 31 августа, 2010 Опубликовано 31 августа, 2010 · Жалоба Здравствуйте. Я тоже раньше работал в Code Vision, а вчера установил IAR. Естественно, вопросов по работе с ним много. Code Vision я осваивал по книге Лебедева "Пособие для начинающих Code Vision AVR", где нашёл ответы почти на все свои вопросы. Подскажите, существует ли подобное описание работы в IAR ? Что почитать начинающему осваивать IAR ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 31 августа, 2010 Опубликовано 31 августа, 2010 · Жалоба Что почитать начинающему осваивать IAR ? Просто документацию идущую в комплекте. Она совсем не плоха. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
muravei 3 31 августа, 2010 Опубликовано 31 августа, 2010 · Жалоба Просто документацию идущую в комплекте. Есть еще интернет. Например. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nikkolaj 0 6 сентября, 2010 Опубликовано 6 сентября, 2010 · Жалоба Просто документацию идущую в комплекте. Она совсем не плоха. Да, информации там действительно много, попробую разобраться. Спасибо. Есть еще интернет. Например. Спасибо, ссылка для меня полезная. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nikkolaj 0 19 сентября, 2010 Опубликовано 19 сентября, 2010 · Жалоба Подскажите пожалуйста, как в ИАР работать с битовыми переменными. В Code Vision это было просто, используешь ключевое слово bit и объявляешь переменную. Компилятор сам отводит для неё место, начиная с R2.0. Дальше работаешь с ней как с обычной переменной. Например bit b1; b1 = 0; .... Как это делать в ИАР ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 19 сентября, 2010 Опубликовано 19 сентября, 2010 · Жалоба ... В Code Vision это было просто, используешь ключевое слово bit и объявляешь переменную. .... Как это делать в ИАР ? Ну если учить не CV, а просто язык Си, то оказывается, что это просто сделать в любом компиляторе. Причём программа потом перенесётся для любого другого компилятора (возможно даже и для CV). Кроме того можно работать даже с битовыми полями. Итак согласно стандарта языка Си. struct { char bZum600 : 1, bit1xxx :1, bit3 : 3; } Flag; ... Flag.bZum600 = TRUE; ... if(Flag.bZum600) Flag.bit3 = 5; ... Flag.bit3++; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 19 сентября, 2010 Опубликовано 19 сентября, 2010 · Жалоба Порядок назначения битов в этом случае - от младшего к старшему. Слыхал, что так может быть не всегда. Кто - нить может привести пример компилятора, который назначает биты в обратном порядке? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 133 19 сентября, 2010 Опубликовано 19 сентября, 2010 · Жалоба Кто - нить может привести пример компилятора, который назначает биты в обратном порядке?IAR. By default, the compiler places bitfield members from the least significant to the most significant bit in the container type. By using the directive #pragma bitfields=reversed, the bitfield members are placed from the most significant to the least significant bit. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 20 сентября, 2010 Опубликовано 20 сентября, 2010 · Жалоба Спасибо, я имел ввиду неперестраиваемый вариант - тупо от MSB к LSB. Про иар понятно - оне охватывают все возможные варианты. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться