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

 
 
5 страниц V  < 1 2 3 4 > »   
Reply to this topicStart new topic
> IAR, AVR Studio, WinAVR, вопрос чайника
Dmitro25
сообщение Mar 19 2010, 08:03
Сообщение #16


Участник
*

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



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


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
Dmitro25
сообщение Mar 23 2010, 07:07
Сообщение #18


Участник
*

Группа: Свой
Сообщений: 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
 
Go to the top of the page
 
+Quote Post
proggy
сообщение Mar 29 2010, 17:57
Сообщение #19





Группа: Новичок
Сообщений: 1
Регистрация: 29-03-10
Пользователь №: 56 279



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

Программа рабочая я её проверял другим компилятором КодеВижн
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 29 2010, 18:44
Сообщение #20


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
Stanislav_S
сообщение Mar 29 2010, 18:57
Сообщение #21


извечный пессимист
*****

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



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


--------------------
Slaves are those of this world
Given freedom to lay chains upon The Master
The wolf is no longer free
Release the chains and come for me
Go to the top of the page
 
+Quote Post
Nikkolaj
сообщение Aug 31 2010, 07:12
Сообщение #22


Частый гость
**

Группа: Участник
Сообщений: 147
Регистрация: 25-09-08
Пользователь №: 40 467



Здравствуйте.
Я тоже раньше работал в Code Vision, а вчера установил IAR.
Естественно, вопросов по работе с ним много.
Code Vision я осваивал по книге Лебедева "Пособие для начинающих Code Vision AVR",
где нашёл ответы почти на все свои вопросы.
Подскажите, существует ли подобное описание работы в IAR ?
Что почитать начинающему осваивать IAR ?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 31 2010, 07:26
Сообщение #23


Гуру
******

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



QUOTE (Nikkolaj @ Aug 31 2010, 10:12) *
Что почитать начинающему осваивать IAR ?

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
muravei
сообщение Aug 31 2010, 08:41
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 2 538
Регистрация: 13-08-05
Пользователь №: 7 591



Цитата(zltigo @ Aug 31 2010, 11:26) *
Просто документацию идущую в комплекте.

Есть еще интернет. Например.
Go to the top of the page
 
+Quote Post
Nikkolaj
сообщение Sep 6 2010, 17:21
Сообщение #25


Частый гость
**

Группа: Участник
Сообщений: 147
Регистрация: 25-09-08
Пользователь №: 40 467



Цитата(zltigo @ Aug 31 2010, 10:26) *
Просто документацию идущую в комплекте. Она совсем не плоха.


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


Цитата(muravei @ Aug 31 2010, 11:41) *
Есть еще интернет. Например.


Спасибо, ссылка для меня полезная.
Go to the top of the page
 
+Quote Post
Nikkolaj
сообщение Sep 19 2010, 15:38
Сообщение #26


Частый гость
**

Группа: Участник
Сообщений: 147
Регистрация: 25-09-08
Пользователь №: 40 467



Подскажите пожалуйста, как в ИАР работать с битовыми переменными.
В Code Vision это было просто, используешь ключевое слово bit и объявляешь переменную.
Компилятор сам отводит для неё место, начиная с R2.0.
Дальше работаешь с ней как с обычной переменной.
Например
bit b1;
b1 = 0;
....
Как это делать в ИАР ?
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Sep 19 2010, 17:42
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 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++;
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Sep 19 2010, 17:48
Сообщение #28


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Порядок назначения битов в этом случае - от младшего к старшему. Слыхал, что так может быть не всегда. Кто - нить может привести пример компилятора, который назначает биты в обратном порядке?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 19 2010, 21:50
Сообщение #29


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Sep 20 2010, 05:26
Сообщение #30


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Спасибо, я имел ввиду неперестраиваемый вариант - тупо от MSB к LSB.
Про иар понятно - оне охватывают все возможные варианты.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 10:33
Рейтинг@Mail.ru


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