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

IAR. Помогите разобраться с настройками

Потребовалось написать проект для ATTINY c 1 kB flash. IAR. При компиляции выдал ошибку и ругнулся на CSTACK и RSTACK. На жирных МК меня эти настройки не волновали. Поставил с TINY на SMALL и все. Сейчас наступил момент подробно разобраться с этими настройками. Поясните пожалуйста так, чтобы я понял как правильно лезть в эти настройки.

При таких настройках как на картинке ошибка исчезла. Как смутно понял, так и поставил.

post-79709-1441803847_thumb.jpg

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


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

Как смутно понял, так и поставил.

Пока Вы сами не поймете, как работает микроконтрорллер со стеками, что это за стеки и какая глубина их ВАМ В ВАШЕЙ ПРОГРАММЕ требуется ДЛЯ РАБОТЫ, а не зачем-то какому-то там "IAR" которому нужно заткунуть предупреждения, придется учить матчасть.

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


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

...

Не спешите желчь изливаться. Я знаю что это за стеки. Скажем, про глубину вложений я понял. RSTACK. Здесь я полностью ориентируюсь, какая глубина вложений у меня в программе. А вот CSTACK мне непонятно, что именно означает это число, и из каких соображений исходить, чтобы изменять это число.

Изменено пользователем demiurg1978

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


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

вот CSTACK мне непонятно

Ну так изучите так-же, как и RSTACK. Явно ведь в том-же букваре, где и про Return STACK прочитали есть и про CSTACK в принципе это "просто" стек, как "у всех" для данных. Сколько Вы данных в стеке храните и через стек передаете, это только Вы знаете.

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


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

...

То есть я должен исходить из максимального объема передаваемых параметров функций?

Изменено пользователем demiurg1978

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


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

То есть я должен исходить из максимального объема параметров функций?

При этом параметры не всегда предаются через стек. Но на стеке хранятся и локальные переменные функции, опять-же те, которым места в регистрах не хватило. А любая функция может быть прервана обработчиком прерывания, которому так-же требуется стек...

Пути два - смотреть листинги, как регистровая пара указателя на стек меняется, либо ставить "побольше" до упора ругани линкера и во время работы контролировать степень использования, например по степени затирания заренее занесенной в стек информации.

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


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

То есть я должен исходить из максимального объема передаваемых параметров функций?

Скорее нет, чем да.

Важно тело функции - как много ему требуется на стеке для локальных переменных, не уместившихся в регистрах.

Прочитайте про стековый фрейм, применительно к конкретной архитектуре и конкретному компилятору.

Также важна и алгоритмическая часть: рекурсии например...

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


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

...

Рекурсии пока отложим в сторону. Есть у меня функция. Как я могу понять, что у меня все будет нормально работать, хватит стека данных?

Изменено пользователем demiurg1978

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


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

Рекурсии пока отложим в сторону. Есть у меня функция. Как я могу понять, что у меня все будет нормально работать, хватит стека данных?

Повторяю - смотрите листинг. По сишному соглашению стек восстанавливает вызываемая функция, таким образом увидите на сколько при выходе меняется указатель стека даже не вникая в содержимое кодов функции.

 

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


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

...

Я вернул настройки, когда выдало ошибку.

Building configuration: timer_easy - Debug 
Updating build tree... 
F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\Debug\List\events.lst 
F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\Debug\Obj\events.r90 
F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\Debug\List\kbd_drv.lst 
F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\Debug\Obj\kbd_drv.r90 
F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\Debug\List\main.lst 
F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\Debug\Obj\main.r90 
F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\Debug\List\main_def_func.lst 
F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\Debug\Obj\main_def_func.r90 
F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\Debug\List\proc_timer.lst 
F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\Debug\Obj\proc_timer.r90 
F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\Debug\List\sys_timer.lst 
F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\Debug\Obj\sys_timer.r90 
F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\Debug\Obj\events.pbi 
F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\Debug\Obj\kbd_drv.pbi 
F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\Debug\Obj\main.pbi 
F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\Debug\Obj\main_def_func.pbi 
F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\Debug\Obj\proc_timer.pbi 
F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\Debug\Obj\sys_timer.pbi 
F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\Debug\Exe\timer_easy.dbg 
F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\Debug\Exe\timer_easy.eep 
F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\Debug\Exe\timer_easy.hex 
F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\Debug\Obj\timer_easy.pbd 

22  file(s) deleted. 
Updating build tree... 

main_def_func.c  
iccavr.exe F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\main_def_func.c --cpu=tiny13 -mt -o F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\Debug\Obj\ 
-lCN F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\Debug\List\ --initializers_in_flash --debug -DENABLE_BIT_DEFINITIONS -e --eeprom_size 64 --clib  
-Ohz 

  IAR C/C++ Compiler V6.12.1.50500 for Atmel AVR 
  Copyright 1996-2012 IAR Systems AB.  

164 bytes of CODE memory 
  0 bytes of DATA memory (+ 2 bytes shared) 

Errors: none 
Warnings: none 

events.c  
iccavr.exe F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\events.c --cpu=tiny13 -mt -o F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\Debug\Obj\ -lCN  
F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\Debug\List\ --initializers_in_flash --debug -DENABLE_BIT_DEFINITIONS -e --eeprom_size 64 --clib -Ohz 

  IAR C/C++ Compiler V6.12.1.50500 for Atmel AVR 
  Copyright 1996-2012 IAR Systems AB.  

82 bytes of CODE memory (+ 4 bytes shared) 
 2 bytes of DATA memory 

Errors: none 
Warnings: none 

kbd_drv.c  
iccavr.exe F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\kbd_drv.c --cpu=tiny13 -mt -o F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\Debug\Obj\ -lCN  
F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\Debug\List\ --initializers_in_flash --debug -DENABLE_BIT_DEFINITIONS -e --eeprom_size 64 --clib -Ohz 

  IAR C/C++ Compiler V6.12.1.50500 for Atmel AVR 
  Copyright 1996-2012 IAR Systems AB.  

156 bytes of CODE memory (+ 4 bytes shared) 
  2 bytes of DATA memory (+ 1 byte  shared) 

Errors: none 
Warnings: none 

main.c  
iccavr.exe F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\main.c --cpu=tiny13 -mt -o F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\Debug\Obj\ -lCN F:\ 
Work\Projects\ATMEL\IAR\C\TIMER_EASY\Debug\List\ --initializers_in_flash --debug -DENABLE_BIT_DEFINITIONS -e --eeprom_size 64 --clib -Ohz 

  IAR C/C++ Compiler V6.12.1.50500 for Atmel AVR 
  Copyright 1996-2012 IAR Systems AB.  

22 bytes of CODE memory 

Errors: none 
Warnings: none 

proc_timer.c  
iccavr.exe F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\proc_timer.c --cpu=tiny13 -mt -o F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\Debug\Obj\  
-lCN F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\Debug\List\ --initializers_in_flash --debug -DENABLE_BIT_DEFINITIONS -e --eeprom_size 64 --clib  
-Ohz 

  IAR C/C++ Compiler V6.12.1.50500 for Atmel AVR 
  Copyright 1996-2012 IAR Systems AB.  
Warning[Pe550]: variable "_led_blink" was set but never used F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\proc_timer.c 86 
Warning[Pe550]: variable "led_1_blink_mode" was set but never used F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\proc_timer.c 87 
Warning[Pe177]: variable "tmp_cnt_minutes" was declared but never referenced F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\proc_timer.c 88 

106 bytes of CODE memory (+ 4 bytes shared) 
  4 bytes of DATA memory (+ 2 bytes shared) 

Errors: none 
Warnings: 3 

sys_timer.c  
iccavr.exe F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\sys_timer.c --cpu=tiny13 -mt -o F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\Debug\Obj\  
-lCN F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\Debug\List\ --initializers_in_flash --debug -DENABLE_BIT_DEFINITIONS -e --eeprom_size 64 --clib  
-Ohz 

  IAR C/C++ Compiler V6.12.1.50500 for Atmel AVR 
  Copyright 1996-2012 IAR Systems AB.  

192 bytes of CODE memory (+ 6 bytes shared) 
 16 bytes of DATA memory (+ 4 bytes shared) 

Errors: none 
Warnings: none 

Linking 
xlink.exe -Ointel-standard,(CODE)=.hex -Ointel-standard,(XDATA)=.eep F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\Debug\Obj\events.r90 F:\Work\ 
Projects\ATMEL\IAR\C\TIMER_EASY\Debug\Obj\kbd_drv.r90 F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\Debug\Obj\main.r90 F:\Work\Projects\ 
ATMEL\IAR\C\TIMER_EASY\Debug\Obj\main_def_func.r90 F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\Debug\Obj\proc_timer.r90 F:\Work\Projects\ 
ATMEL\IAR\C\TIMER_EASY\Debug\Obj\sys_timer.r90 -o F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\Debug\Exe\timer_easy.dbg -Fubrof8 -IC:\ 
Program Files\IAR Systems\Embedded Workbench 6.0\avr\LIB\ -f C:\Program Files\IAR Systems\Embedded Workbench 6.0\avr\src\template\ 
cfgtiny13.xcl -D_..X_HEAP_SIZE=10 -D_..X_TINY_HEAP_SIZE=0 -D_..X_NEAR_HEAP_SIZE=0 -D_..X_FAR_HEAP_SIZE=0 -D_..X_HUGE_HEAP_SIZE=0  
-D_..X_CSTACK_SIZE=20 -D_..X_RSTACK_SIZE=10 -D_..X_FLASH_CODE_END=_..X_FLASH_END -f C:\Program Files\IAR Systems\Embedded  
Workbench 6.0\avr\src\template\cfg0t.xcl -D_..X_FLASH_BASE=_..X_INTVEC_SIZE -H1895 -h(CODE)0-(_..X_INTVEC_SIZE-1)  
-D_..X_CSTACK_BASE=_..X_SRAM_BASE -D_..X_CSTACK_END=_..X_SRAM_END -D_..X_RSTACK_BASE=_..X_SRAM_BASE  
-D_..X_RSTACK_END=_..X_SRAM_END -s __program_start C:\Program Files\IAR Systems\Embedded Workbench 6.0\avr\LIB\CLIB\cl0t-ec_nomul.r90  
-e_large_write=_formatted_write -e_large_read=_formatted_read 

    IAR Universal Linker V5.3.2.26 
    Copyright 1987-2012 IAR Systems AB. 
Error[e16]: Segment RSTACK (size: 0x10 align: 0) is too long for segment definition. At least 0x8 more bytes needed. The problem occurred while  
processing the segment placement command "-Z(DATA)RSTACK+_..X_RSTACK_SIZE=_..X_RSTACK_BASE-_..X_RSTACK_END", where at the  
moment of placement the available memory ranges were "DATA:98-9f" 
  Reserved ranges relevant to this placement: 
  DATA:60-77           TINY_Z 
  DATA:78-97           CSTACK 
  DATA:98-9f           RSTACK 
Error while running Linker 

Total number of errors: 1 
Total number of warnings: 3 

 

Как мне здесь понять, где смотреть? Я специально очистил проект и скомпилировал. Листинги модулей есть.

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


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

Как мне здесь понять, где смотреть?

Это НЕ листинг. Тут смотреть нечего. Ну разве только то, что не хватает 8 байт памяти и думать, рассматривая map файл, кто ее сожрал.

Листинги модулей есть.

Ну и изучайте В ЛИСТИНГЕ интересующую Вас функцию. Как - УЖЕ написал. Не переспрашивайте третий раз!

 

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


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

...

Я понимаю, что это не листинг. Как понять, какой именно листинг смотреть, какую функцию смотреть?

 

Не переспрашивайте третий раз!

 

Так поясните ПРИНЦИП, как это понять, где смотреть?

Изменено пользователем demiurg1978

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


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

Я понимаю, что это не листинг.

Радует.

Как понять, какой именно листинг смотреть, какую функцию смотреть?

Тот в котором есть интересующая Вас функция. Листинги по именам файлов. Это вообще-то более, чем очевидно.

Так поясните ПРИНЦИП, как это понять, где смотреть?

http://electronix.ru/forum/index.php?showt...130340&hl=#

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


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

Сколько Вы данных в стеке храните и через стек передаете, это только Вы знаете.

Извините за такой вопрос, вы именно с AVR работаете? Это не подначка. Работу со стеком определяет компилятор. На стек я не могу повлиять.

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


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

Извините за такой вопрос, вы именно с AVR работаете?

И еще с более, чем с десятком котроллеров.

Работу со стеком определяет компилятор.

Да компилятор исходя из Ваших приказов.

На стек я не могу повлиять.

Да ну!!! Можете. Не прямо, конечно, сказав - а займи-ка компилятор стека в два раза меньше, ну и заодно ROM и RAM раза в три поменьше. Но программу пишете Вы. Значит влияете.

В данном случае речь идет об ОБЯЗАННОСТИ выделить нужное компиляторок количество памяти под стек.

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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