ILYCHOFF 0 3 июля, 2006 Опубликовано 3 июля, 2006 · Жалоба Не очень давно работаю с 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arttab 0 3 июля, 2006 Опубликовано 3 июля, 2006 · Жалоба Какой мк и сколько вы выделили под стек? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYCHOFF 0 3 июля, 2006 Опубликовано 3 июля, 2006 · Жалоба МК Мега 16 CSTACK Size 0x20 RSTACK 16 значения по умолчанию когда первый раз выскочила такая ошибка я изменил CSTACK на 0x10 ошибка пропала все собралось. а теперь уже меньше ставить не помогает.. Что это за ошибка? Не хватает ОЗУ? Из-за стека? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Andy_Mozzhevilov 0 3 июля, 2006 Опубликовано 3 июля, 2006 · Жалоба Сегмент стека не удалось разместить в памяти, то есть ОЗУ не хватает. Можно урезать стек на 0x1e, тогда влезет. Вопрос в том, сколько реально нужно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Abatt 0 3 июля, 2006 Опубликовано 3 июля, 2006 · Жалоба наверно программа у вас очень много ОЗУ использует и на стек места не остается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYCHOFF 0 3 июля, 2006 Опубликовано 3 июля, 2006 · Жалоба Вот я и не могу понять почему не хватает ОЗУ... Я хоть и не так давно пишу на си но все же стараюсь следовать рекомендациям. У меня в коде используются переменные long но они локальные, а как я понимаю локальные переменные уничтожаются при выходе из функции. В функции я вывожу на LCD некий текст, после выхода из функции он остается в ОЗУ или сохраняется???? Я закоментировал строки с текстом ошибка пропала. Как тогда с ним поступать писать его во флешь и выводить от туда?? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bill 0 3 июля, 2006 Опубликовано 3 июля, 2006 · Жалоба Вот я и не могу понять почему не хватает ОЗУ... Я хоть и не так давно пишу на си но все же стараюсь следовать рекомендациям. У меня в коде используются переменные long но они локальные, а как я понимаю локальные переменные уничтожаются при выходе из функции. В функции я вывожу на LCD некий текст, после выхода из функции он остается в ОЗУ или сохраняется???? Я закоментировал строки с текстом ошибка пропала. Как тогда с ним поступать писать его во флешь и выводить от туда?? Вся проблема в том, что все строчные литералы, обычно, размещаются в ОЗУ. Если явно не задать их размещение в памяти программ, то ОЗУ можно занять текстом и под переменные места не останется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYCHOFF 0 4 июля, 2006 Опубликовано 4 июля, 2006 · Жалоба Разместил весь текст во флеш проблемы решились... Но у меня в проекте используется еще функция sprintf хочу ее заменить на что-нибудь менее прожорливое к ресурсам. Из ICC никак itoa и ltoa не получилось вытащить, может кто поделится исходником, если есть, или алгоритмом. Заранее благодарен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bill 0 4 июля, 2006 Опубликовано 4 июля, 2006 · Жалоба Разместил весь текст во флеш проблемы решились... Но у меня в проекте используется еще функция sprintf хочу ее заменить на что-нибудь менее прожорливое к ресурсам. Из ICC никак itoa и ltoa не получилось вытащить, может кто поделится исходником, если есть, или алгоритмом. Заранее благодарен. Тут файл от IAR, я думаю, этого будет достаточно, если все лишнее убрать. frmwri.txt Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Andy_F 0 3 августа, 2006 Опубликовано 3 августа, 2006 · Жалоба А существуют ли какие-то более ли менее чёткие критерии для выбора модели памяти и размеров стеков в IAR, или это чисто эмпирически ? Ну, с моделью памяти понятно, если программа начинает превышать определённый объём - надо переходить к "большей" модели. А стеки ? Может быть, где-то можно почитать рекомендации на этот счёт ? Просто создаётся ощущение ненадёжности программирования - программа поработала-поработала, и зависла. Стек увеличил (CSTACK) - вроде работает нормально. Но где гарантия, что при выполнении ещё чего-то стек опять не исчерпается ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bill 0 3 августа, 2006 Опубликовано 3 августа, 2006 · Жалоба Просто создаётся ощущение ненадёжности программирования - программа поработала-поработала, и зависла. Стек увеличил (CSTACK) - вроде работает нормально. Но где гарантия, что при выполнении ещё чего-то стек опять не исчерпается ? На этапе трансляции компилятор выдает информацию по потребности стека в каждой функции, можно посчитать с учетом вложенности функций. На этапе компоновке линкер выдает сообщение о нехватке стека. Кроме того, использование ОЗУ, размер программных сегментов и их размещение в памяти можно посмотреть в файле карты памяти на выходе линкера. При определении размера стека нужно учитывать потребности стека в процедурах прерывания. Самый худший случай: прерывание в при выполнении функции с наибольшим уровнем вложенности. А общие рекомендации таковы: 1. не размещать большие наборы данных в стековой памяти. Особенно это относится к массивам или переменным типов long и float. Для них лучше использовать статическую память, использование которой легче контроллировать. 2. не вызывать из процедур прерываний друге функции и делать сами процедуры обработки прерываний по возможности короче. Чем короче функция, тем меньше регистров в ней используется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Andy_F 0 3 августа, 2006 Опубликовано 3 августа, 2006 · Жалоба На этапе трансляции компилятор выдает информацию по потребности стека в каждой функции, можно посчитать с учетом вложенности функций. На этапе компоновке линкер выдает сообщение о нехватке стека. Кроме того, использование ОЗУ, размер программных сегментов и их размещение в памяти можно посмотреть в файле карты памяти на выходе линкера. При определении размера стека нужно учитывать потребности стека в процедурах прерывания. Самый худший случай: прерывание в при выполнении функции с наибольшим уровнем вложенности. А общие рекомендации таковы: 1. не размещать большие наборы данных в стековой памяти. Особенно это относится к массивам или переменным типов long и float. Для них лучше использовать статическую память, использование которой легче контроллировать. 2. не вызывать из процедур прерываний друге функции и делать сами процедуры обработки прерываний по возможности короче. Чем короче функция, тем меньше регистров в ней используется. Спасибо. Будем разбираться... На этапе трансляции компилятор выдает информацию по потребности стека в каждой функции, можно посчитать с учетом вложенности функций. На этапе компоновке линкер выдает сообщение о нехватке стека. Кроме того, использование ОЗУ, размер программных сегментов и их размещение в памяти можно посмотреть в файле карты памяти на выходе линкера. При определении размера стека нужно учитывать потребности стека в процедурах прерывания. Самый худший случай: прерывание в при выполнении функции с наибольшим уровнем вложенности. А общие рекомендации таковы: 1. не размещать большие наборы данных в стековой памяти. Особенно это относится к массивам или переменным типов long и float. Для них лучше использовать статическую память, использование которой легче контроллировать. 2. не вызывать из процедур прерываний друге функции и делать сами процедуры обработки прерываний по возможности короче. Чем короче функция, тем меньше регистров в ней используется. Спасибо, буду разбираться... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 3 августа, 2006 Опубликовано 3 августа, 2006 · Жалоба На этапе компоновке линкер выдает сообщение о нехватке стека. Увы, линкер принципиально не может ничего сказать о нехватке каких-либо runtime распределяемых областей памяти. Единственно, что линкер может(вынужден) сообщить, это о полном отсутствии сегмента стека. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 3 августа, 2006 Опубликовано 3 августа, 2006 · Жалоба На этапе компоновке линкер выдает сообщение о нехватке стека. Увы, линкер принципиально не может ничего сказать о нехватке каких-либо runtime распределяемых областей памяти. Единственно, что линкер может(вынужден) сообщить, это о полном отсутствии сегмента стека. Угу. Намедни с этим столкнулся и тоже при использовании sprintf. Надо-то было всего навсего одну переменную float преобразовать к виду x.xx со знаком. А sprintf аж под 80 байт стека отожрала для этого :( И обнаружил я это (наползание стека на данные) лишь в симуляторе, когда пошагово стал смотреть выполнение процедуры, одновременно следя за указателем стека. Сам IAR даже не "мяргнул" про нехватку памяти или о столь большом стеке. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bill 0 5 августа, 2006 Опубликовано 5 августа, 2006 · Жалоба Увы, линкер принципиально не может ничего сказать о нехватке каких-либо runtime распределяемых областей памяти. Единственно, что линкер может(вынужден) сообщить, это о полном отсутствии сегмента стека. Само собой. Линкер выдает сообщение о нехватке памяти, в том числе и стека. Точнее, выдается сообщение о нехватке сегмента под стек. Но это, опять же, тогда, когда вообще не хватает памяти данных (ОЗУ). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться