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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Стек в 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
arttab
сообщение Jul 3 2006, 07:21
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



Какой мк и сколько вы выделили под стек?


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
ILYCHOFF
сообщение Jul 3 2006, 07:52
Сообщение #3


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

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



МК Мега 16 CSTACK Size 0x20 RSTACK 16

значения по умолчанию

когда первый раз выскочила такая ошибка я изменил CSTACK на 0x10 ошибка пропала все собралось.

а теперь уже меньше ставить не помогает..

Что это за ошибка? Не хватает ОЗУ? Из-за стека?
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение Jul 3 2006, 07:57
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



Сегмент стека не удалось разместить в памяти, то есть ОЗУ не хватает.
Можно урезать стек на 0x1e, тогда влезет.
Вопрос в том, сколько реально нужно.


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
Abatt
сообщение Jul 3 2006, 08:32
Сообщение #5


Участник
*

Группа: Новичок
Сообщений: 18
Регистрация: 22-06-06
Пользователь №: 18 277



наверно программа у вас очень много ОЗУ использует и на стек места не остается.
Go to the top of the page
 
+Quote Post
ILYCHOFF
сообщение Jul 3 2006, 10:32
Сообщение #6


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

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



Вот я и не могу понять почему не хватает ОЗУ... Я хоть и не так давно пишу на си но все же стараюсь следовать рекомендациям. У меня в коде используются переменные long но они локальные, а как я понимаю локальные переменные уничтожаются при выходе из функции.
В функции я вывожу на LCD некий текст, после выхода из функции он остается в ОЗУ или сохраняется???? Я закоментировал строки с текстом ошибка пропала.
Как тогда с ним поступать писать его во флешь и выводить от туда??
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jul 3 2006, 11:47
Сообщение #7


Местный
***

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



Цитата(ILYCHOFF @ Jul 3 2006, 13:32) *
Вот я и не могу понять почему не хватает ОЗУ... Я хоть и не так давно пишу на си но все же стараюсь следовать рекомендациям. У меня в коде используются переменные long но они локальные, а как я понимаю локальные переменные уничтожаются при выходе из функции.
В функции я вывожу на LCD некий текст, после выхода из функции он остается в ОЗУ или сохраняется???? Я закоментировал строки с текстом ошибка пропала.
Как тогда с ним поступать писать его во флешь и выводить от туда??

Вся проблема в том, что все строчные литералы, обычно, размещаются в ОЗУ. Если явно не задать их размещение в памяти программ, то ОЗУ можно занять текстом и под переменные места не останется.
Go to the top of the page
 
+Quote Post
ILYCHOFF
сообщение Jul 4 2006, 10:45
Сообщение #8


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

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



Разместил весь текст во флеш проблемы решились...
Но у меня в проекте используется еще функция sprintf хочу ее заменить на что-нибудь менее прожорливое к ресурсам. Из ICC никак itoa и ltoa не получилось вытащить, может кто поделится исходником, если есть, или алгоритмом. Заранее благодарен.
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jul 4 2006, 11:03
Сообщение #9


Местный
***

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



Цитата(ILYCHOFF @ Jul 4 2006, 13:45) *
Разместил весь текст во флеш проблемы решились...
Но у меня в проекте используется еще функция sprintf хочу ее заменить на что-нибудь менее прожорливое к ресурсам. Из ICC никак itoa и ltoa не получилось вытащить, может кто поделится исходником, если есть, или алгоритмом. Заранее благодарен.

Тут файл от IAR, я думаю, этого будет достаточно, если все лишнее убрать.
Прикрепленный файл  frmwri.txt ( 20.63 килобайт ) Кол-во скачиваний: 704
Go to the top of the page
 
+Quote Post
Andy_F
сообщение Aug 3 2006, 07:57
Сообщение #10


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

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



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

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


Местный
***

Группа: Участник
Сообщений: 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
Andy_F
сообщение Aug 3 2006, 19:50
Сообщение #12


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

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



Цитата(_Bill @ Aug 3 2006, 12:53) *
На этапе трансляции компилятор выдает информацию по потребности стека в каждой функции, можно посчитать с учетом вложенности функций. На этапе компоновке линкер выдает сообщение о нехватке стека. Кроме того, использование ОЗУ, размер программных сегментов и их размещение в памяти можно посмотреть в файле карты памяти на выходе линкера. При определении размера стека нужно учитывать потребности стека в процедурах прерывания. Самый худший случай: прерывание в при выполнении функции с наибольшим уровнем вложенности.
А общие рекомендации таковы:
1. не размещать большие наборы данных в стековой памяти. Особенно это относится к массивам или переменным типов long и float. Для них лучше использовать статическую память, использование которой легче контроллировать.
2. не вызывать из процедур прерываний друге функции и делать сами процедуры обработки прерываний по возможности короче. Чем короче функция, тем меньше регистров в ней используется.


Спасибо. Будем разбираться...


Цитата(_Bill @ Aug 3 2006, 12:53) *
На этапе трансляции компилятор выдает информацию по потребности стека в каждой функции, можно посчитать с учетом вложенности функций. На этапе компоновке линкер выдает сообщение о нехватке стека. Кроме того, использование ОЗУ, размер программных сегментов и их размещение в памяти можно посмотреть в файле карты памяти на выходе линкера. При определении размера стека нужно учитывать потребности стека в процедурах прерывания. Самый худший случай: прерывание в при выполнении функции с наибольшим уровнем вложенности.
А общие рекомендации таковы:
1. не размещать большие наборы данных в стековой памяти. Особенно это относится к массивам или переменным типов long и float. Для них лучше использовать статическую память, использование которой легче контроллировать.
2. не вызывать из процедур прерываний друге функции и делать сами процедуры обработки прерываний по возможности короче. Чем короче функция, тем меньше регистров в ней используется.


Спасибо, буду разбираться...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 3 2006, 19:57
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 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
_Bill
сообщение Aug 5 2006, 16:44
Сообщение #15


Местный
***

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



Цитата(zltigo @ Aug 3 2006, 22:57) *
Увы, линкер принципиально не может ничего сказать о нехватке каких-либо runtime распределяемых областей памяти. Единственно, что линкер может(вынужден) сообщить, это о полном отсутствии сегмента стека.

Само собой. Линкер выдает сообщение о нехватке памяти, в том числе и стека. Точнее, выдается сообщение о нехватке сегмента под стек. Но это, опять же, тогда, когда вообще не хватает памяти данных (ОЗУ).
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 07:02
Рейтинг@Mail.ru


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