|
|
  |
IAR, AVR Studio, WinAVR, вопрос чайника |
|
|
|
Mar 19 2010, 08:03
|
Участник

Группа: Свой
Сообщений: 60
Регистрация: 4-04-07
Пользователь №: 26 770

|
Ещё возник вопрос про IAR: Я в настройках проекта в "General Options" наткнулся на параметры RSTACK и CSTACK. Первый предназначен, как я понял, для хранения адресов возврата из вызываемых функций или прерываний. Второй - для хранения параметров, передаваемых в функции, а также для хранения локальных переменных. Для интереса я решил установить оба параметра в 0 и посмотреть, что скажет компилятор. На моё удивление, ни ошибок, ни предупреждений компилятор не выдал, однако выходной файл отличался по содержимому от скомпилированного с "родными" значениями RSTACK и CSTACK. Отсутствие предупреждений со стороны компилятора - это довольно странно - ведь с нулевыми значениями объёмов стеков программа будет однозначно неработоспособна. И непонятно, как оценивать требуемый программе объём стека. Если для RSTACK его можно прикинуть по максимальной глубине вложенности функций, то с CSTACK вообще непонятно: кто его знает, как оптимизирует компилятор вызов функций, сколько параметров передаст через регистры, а сколько - через стек, то же самое и про локальные переменные. Нет ли в компиляторе IAR способа автоматически оценить требуемый объём стека? Просто раньше я компилировал проекты с помощью CodeVisionAVR, там компилятор выдавал прогнозируемый объём стека данных, анализируя самую длинную цепочку вложенных вызовов функций с учётом прерываний. В случае, если рассчитанный объём стека превышал указанный в настройках проекта, выдавалось предупреждение. Понятно, что этот метод не учитывает рекурсию, вложенных вызов прерываний, но всё-таки это уже что-то.
|
|
|
|
|
Mar 19 2010, 10:36
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Dmitro25 @ Mar 19 2010, 10:03)  Отсутствие предупреждений со стороны компилятора - это довольно странно - ведь с нулевыми значениями объёмов стеков программа будет однозначно неработоспособна. Ничего удивитального. Она может быть неработоспособна с любыми значениями. Компилятор определеить потребный размер стека не может, а генерить ошибку единственно в случае заданного размера 0 - какой смысл? Ну кому придет в голову ставить размер стека 0, ведь "программа будет однозначно неработоспособна". Цитата(Dmitro25 @ Mar 19 2010, 10:03)  И непонятно, как оценивать требуемый программе объём стека. Если для 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 Цитата(Dmitro25 @ Mar 19 2010, 10:03)  Нет ли в компиляторе IAR способа автоматически оценить требуемый объём стека? Как-то можно было получить в .map дерево вызовов с оценкой глубины стека. Но как - не помню. Может кто-то другой подскажет.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Mar 23 2010, 07:07
|
Участник

Группа: Свой
Сообщений: 60
Регистрация: 4-04-07
Пользователь №: 26 770

|
Спасибо Вам за ответ, Сергей. Всё-таки меня смутило то, что IAR не помогает пользователю оценить размер стека. Информацию о размере стека, который используется каждой функцией, можно, как оказалось получить из *.LST - файла. В конце его содержится таблица "Maximum stack usage in bytes". Там для текущего модуля проекта содержится список его функций с указанием используемого данной функцией размера CStack и RStack, а также список подфункций, которые вызываются из каждой функции модуля. Чтобы вычислить максимальный требуемый размер каждого из стеков необходимо просмотреть все пути вызовов и выбрать максимальный по каждому из стеков. Поскольку вручную это делать не очень удобно, я написал программу, которая находит максимальные пути автоматически. Она приложена к данному сообщению. Для использования необходимо в опциях проекта включить генерацию *.LST-файлов. Программу нужно скопировать в папку "List" текущей конфигурации. После запуска программа анализирует все *.LST файлы в текущей папке, ищет максимальные пути для вычисления максимальных значений для CStack и RStack. Также программа пытается детектировать процедуры прерываний и анализирует максимальные пути для них отдельно. В качестве результата выводится сумма путей для прерываний и для обычных функций. По идее эти значения могут использоваться для задания параметров CStack и RStack компилятора. На чём мог, я её оттестировал. Замечания и предложения приветствуются.
Прикрепленные файлы
Stack.zip ( 40.08 килобайт )
Кол-во скачиваний: 65
|
|
|
|
|
Mar 29 2010, 17:57
|
Группа: Новичок
Сообщений: 1
Регистрация: 29-03-10
Пользователь №: 56 279

|
Здравствуйте! Недавно скачал ИАР написал программу всё компилируется---warnings 0 errors 0 (версия ИАР 5.20.1),но  выходной файл у ИАРа .а90 или .д90, а STK500 не понимает и отказывается шить--нужен .hex  , PonyProg шьёт но неправильно в итоге программа в железе не работает! Как научить ИАР делать НЕХ? Программа рабочая я её проверял другим компилятором КодеВижн
|
|
|
|
|
Mar 29 2010, 18:44
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(proggy @ Mar 29 2010, 19:57)  Как научить ИАР делать НЕХ? выбрать в настройках линкера формат Intel Extended. Или так. Расширение по умолчанию будет a90, но его можно поменять в соответствующем поле настроек. Цитата(proggy @ Mar 29 2010, 19:57)  Программа рабочая я её проверял другим компилятором КодеВижн А вот это не показатель. Оптимизатор у CV похуже, некоторые ошибки (часто связанные с отсутствием ключевого слова volatile) могут в нем не проявиться.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Sep 6 2010, 17:21
|
Частый гость
 
Группа: Участник
Сообщений: 147
Регистрация: 25-09-08
Пользователь №: 40 467

|
Цитата(zltigo @ Aug 31 2010, 10:26)  Просто документацию идущую в комплекте. Она совсем не плоха. Да, информации там действительно много, попробую разобраться. Спасибо. Цитата(muravei @ Aug 31 2010, 11:41)  Есть еще интернет. Например.Спасибо, ссылка для меня полезная.
|
|
|
|
|
Sep 19 2010, 17:42
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(Nikkolaj @ Sep 19 2010, 18:38)  ... В 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++;
|
|
|
|
|
Sep 19 2010, 21:50
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(_Pasha @ Sep 19 2010, 20:48)  Кто - нить может привести пример компилятора, который назначает биты в обратном порядке? 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.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|