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

 
 
> Стек в IAR, IAR выдает ошибку
ILYCHOFF
сообщение Jul 3 2006, 05:13
Сообщение #1


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

Группа: Свой
Сообщений: 78
Регистрация: 5-07-05
Из: Великий Новгород
Пользователь №: 6 536



Не очень давно работаю с IAR. Вот линкер выдал такую ошибку. Что это значит, слишком большой стек? Как тогда правильно определить его размер?


Error[e16]: Segment CSTACK (size: 0x20 align: 0) is too long for segment definition. At least 0x1e more bytes needed. The problem occurred while
processing the segment placement command "-Z(DATA)CSTACK+_..X_CSTACK_SIZE=_..X_SRAM_TBASE:+_..X_SRAM_TSIZE", where at the moment
of placement the available memory ranges were "DATA:fe-ff"
Reserved ranges relevant to this placement:
DATA:60-dc TINY_I
DATA:dd-fd TINY_Z
DATA:fe-ff CSTACK
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Andy_F
сообщение Aug 3 2006, 07:57
Сообщение #2


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

Группа: Свой
Сообщений: 109
Регистрация: 27-07-06
Из: С.-Петербург
Пользователь №: 19 148



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

Просто создаётся ощущение ненадёжности программирования - программа поработала-поработала, и зависла. Стек увеличил (CSTACK) - вроде работает нормально. Но где гарантия, что при выполнении ещё чего-то стек опять не исчерпается ?
Go to the top of the page
 
+Quote Post
_Bill
сообщение Aug 3 2006, 08:53
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(Andy_F @ Aug 3 2006, 10:57) *
Просто создаётся ощущение ненадёжности программирования - программа поработала-поработала, и зависла. Стек увеличил (CSTACK) - вроде работает нормально. Но где гарантия, что при выполнении ещё чего-то стек опять не исчерпается ?

На этапе трансляции компилятор выдает информацию по потребности стека в каждой функции, можно посчитать с учетом вложенности функций. На этапе компоновке линкер выдает сообщение о нехватке стека. Кроме того, использование ОЗУ, размер программных сегментов и их размещение в памяти можно посмотреть в файле карты памяти на выходе линкера. При определении размера стека нужно учитывать потребности стека в процедурах прерывания. Самый худший случай: прерывание в при выполнении функции с наибольшим уровнем вложенности.
А общие рекомендации таковы:
1. не размещать большие наборы данных в стековой памяти. Особенно это относится к массивам или переменным типов long и float. Для них лучше использовать статическую память, использование которой легче контроллировать.
2. не вызывать из процедур прерываний друге функции и делать сами процедуры обработки прерываний по возможности короче. Чем короче функция, тем меньше регистров в ней используется.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 3 2006, 19:57
Сообщение #4


Гуру
******

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



Цитата(_Bill @ Aug 3 2006, 11:53) *
На этапе компоновке линкер выдает сообщение о нехватке стека.

Увы, линкер принципиально не может ничего сказать о нехватке каких-либо runtime распределяемых областей памяти. Единственно, что линкер может(вынужден) сообщить, это о полном отсутствии сегмента стека.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
rezident
сообщение Aug 3 2006, 20:51
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(zltigo @ Aug 4 2006, 01:57) *
Цитата(_Bill @ Aug 3 2006, 11:53) *

На этапе компоновке линкер выдает сообщение о нехватке стека.

Увы, линкер принципиально не может ничего сказать о нехватке каких-либо runtime распределяемых областей памяти. Единственно, что линкер может(вынужден) сообщить, это о полном отсутствии сегмента стека.

Угу. Намедни с этим столкнулся и тоже при использовании sprintf. Надо-то было всего навсего одну переменную float преобразовать к виду x.xx со знаком. А sprintf аж под 80 байт стека отожрала для этого sad.gif И обнаружил я это (наползание стека на данные) лишь в симуляторе, когда пошагово стал смотреть выполнение процедуры, одновременно следя за указателем стека. Сам IAR даже не "мяргнул" про нехватку памяти или о столь большом стеке.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ILYCHOFF   Стек в IAR   Jul 3 2006, 05:13
- - arttab   Какой мк и сколько вы выделили под стек?   Jul 3 2006, 07:21
- - ILYCHOFF   МК Мега 16 CSTACK Size 0x20 RSTACK 16 значения п...   Jul 3 2006, 07:52
- - Andy Mozzhevilov   Сегмент стека не удалось разместить в памяти, то е...   Jul 3 2006, 07:57
- - Abatt   наверно программа у вас очень много ОЗУ использует...   Jul 3 2006, 08:32
- - ILYCHOFF   Вот я и не могу понять почему не хватает ОЗУ... Я ...   Jul 3 2006, 10:32
|- - _Bill   Цитата(ILYCHOFF @ Jul 3 2006, 13:32) Вот ...   Jul 3 2006, 11:47
- - ILYCHOFF   Разместил весь текст во флеш проблемы решились... ...   Jul 4 2006, 10:45
|- - _Bill   Цитата(ILYCHOFF @ Jul 4 2006, 13:45) Разм...   Jul 4 2006, 11:03
|- - Andy_F   Цитата(_Bill @ Aug 3 2006, 12:53) На этап...   Aug 3 2006, 19:50
|- - _Bill   Цитата(zltigo @ Aug 3 2006, 22:57) Увы, л...   Aug 5 2006, 16:44
- - junoSynthesizer   позволю себе поднять тему. люди, подскажите... а ...   Nov 28 2006, 17:34
- - IgorKossak   junoSynthesizer, судя по листингу сегментов, Вы вы...   Nov 28 2006, 17:58
- - junoSynthesizer   к куче обращаются команды malloc и иже с ней? а ес...   Nov 28 2006, 19:03
- - IgorKossak   Цитата(junoSynthesizer @ Nov 28 2006, 18...   Nov 30 2006, 13:43


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


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


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