Перейти к содержанию
    

Ещё возник вопрос про IAR:

Я в настройках проекта в "General Options" наткнулся на параметры RSTACK и CSTACK. Первый предназначен, как я понял, для хранения адресов возврата из вызываемых функций или прерываний. Второй - для хранения параметров, передаваемых в функции, а также для хранения локальных переменных.

Для интереса я решил установить оба параметра в 0 и посмотреть, что скажет компилятор. На моё удивление, ни ошибок, ни предупреждений компилятор не выдал, однако выходной файл отличался по содержимому от скомпилированного с "родными" значениями RSTACK и CSTACK.

Отсутствие предупреждений со стороны компилятора - это довольно странно - ведь с нулевыми значениями объёмов стеков программа будет однозначно неработоспособна.

И непонятно, как оценивать требуемый программе объём стека. Если для RSTACK его можно прикинуть по максимальной глубине вложенности функций, то с CSTACK вообще непонятно: кто его знает, как оптимизирует компилятор вызов функций, сколько параметров передаст через регистры, а сколько - через стек, то же самое и про локальные переменные.

Нет ли в компиляторе IAR способа автоматически оценить требуемый объём стека? Просто раньше я компилировал проекты с помощью CodeVisionAVR, там компилятор выдавал прогнозируемый объём стека данных, анализируя самую длинную цепочку вложенных вызовов функций с учётом прерываний. В случае, если рассчитанный объём стека превышал указанный в настройках проекта, выдавалось предупреждение. Понятно, что этот метод не учитывает рекурсию, вложенных вызов прерываний, но всё-таки это уже что-то.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Отсутствие предупреждений со стороны компилятора - это довольно странно - ведь с нулевыми значениями объёмов стеков программа будет однозначно неработоспособна.
Ничего удивитального. Она может быть неработоспособна с любыми значениями. Компилятор определеить потребный размер стека не может, а генерить ошибку единственно в случае заданного размера 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 дерево вызовов с оценкой глубины стека. Но как - не помню. Может кто-то другой подскажет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо Вам за ответ, Сергей.

Всё-таки меня смутило то, что IAR не помогает пользователю оценить размер стека.

Информацию о размере стека, который используется каждой функцией, можно, как оказалось получить из *.LST - файла. В конце его содержится таблица "Maximum stack usage in bytes". Там для текущего модуля проекта содержится список его функций с указанием используемого данной функцией размера CStack и RStack, а также список подфункций, которые вызываются из каждой функции модуля.

 

Чтобы вычислить максимальный требуемый размер каждого из стеков необходимо просмотреть все пути вызовов и выбрать максимальный по каждому из стеков.

Поскольку вручную это делать не очень удобно, я написал программу, которая находит максимальные пути автоматически.

Она приложена к данному сообщению.

Для использования необходимо в опциях проекта включить генерацию *.LST-файлов. Программу нужно скопировать в папку "List" текущей конфигурации. После запуска программа анализирует все *.LST файлы в текущей папке, ищет максимальные пути для вычисления максимальных значений для CStack и RStack. Также программа пытается детектировать процедуры прерываний и анализирует максимальные пути для них отдельно. В качестве результата выводится сумма путей для прерываний и для обычных функций. По идее эти значения могут использоваться для задания параметров CStack и RStack компилятора.

 

На чём мог, я её оттестировал. Замечания и предложения приветствуются.

Stack.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте! Недавно скачал ИАР написал программу всё компилируется---warnings 0 errors 0 (версия ИАР 5.20.1),но :rolleyes: выходной файл у ИАРа .а90 или .д90, а STK500 не понимает и отказывается шить--нужен .hex :laughing: , PonyProg шьёт но неправильно в итоге программа

в железе не работает! Как научить ИАР делать НЕХ?

 

Программа рабочая я её проверял другим компилятором КодеВижн

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как научить ИАР делать НЕХ?
выбрать в настройках линкера формат Intel Extended. Или так. Расширение по умолчанию будет a90, но его можно поменять в соответствующем поле настроек.

Программа рабочая я её проверял другим компилятором КодеВижн
А вот это не показатель. Оптимизатор у CV похуже, некоторые ошибки (часто связанные с отсутствием ключевого слова volatile) могут в нем не проявиться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Зайти в Project\Options\Linker\Output\Format - Other - intel - standart, название и расширение файла выставляем по вкусу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте.

Я тоже раньше работал в Code Vision, а вчера установил IAR.

Естественно, вопросов по работе с ним много.

Code Vision я осваивал по книге Лебедева "Пособие для начинающих Code Vision AVR",

где нашёл ответы почти на все свои вопросы.

Подскажите, существует ли подобное описание работы в IAR ?

Что почитать начинающему осваивать IAR ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что почитать начинающему осваивать IAR ?

Просто документацию идущую в комплекте. Она совсем не плоха.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Просто документацию идущую в комплекте. Она совсем не плоха.

 

Да, информации там действительно много, попробую разобраться.

Спасибо.

 

 

Есть еще интернет. Например.

 

Спасибо, ссылка для меня полезная.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подскажите пожалуйста, как в ИАР работать с битовыми переменными.

В Code Vision это было просто, используешь ключевое слово bit и объявляешь переменную.

Компилятор сам отводит для неё место, начиная с R2.0.

Дальше работаешь с ней как с обычной переменной.

Например

bit b1;

b1 = 0;

....

Как это делать в ИАР ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...

В 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++;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Порядок назначения битов в этом случае - от младшего к старшему. Слыхал, что так может быть не всегда. Кто - нить может привести пример компилятора, который назначает биты в обратном порядке?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кто - нить может привести пример компилятора, который назначает биты в обратном порядке?
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.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, я имел ввиду неперестраиваемый вариант - тупо от MSB к LSB.

Про иар понятно - оне охватывают все возможные варианты.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...