|
Стек в IAR, IAR выдает ошибку |
|
|
|
Jul 3 2006, 08:32
|
Участник

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

|
наверно программа у вас очень много ОЗУ использует и на стек места не остается.
|
|
|
|
|
Jul 3 2006, 11:47
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(ILYCHOFF @ Jul 3 2006, 13:32)  Вот я и не могу понять почему не хватает ОЗУ... Я хоть и не так давно пишу на си но все же стараюсь следовать рекомендациям. У меня в коде используются переменные long но они локальные, а как я понимаю локальные переменные уничтожаются при выходе из функции. В функции я вывожу на LCD некий текст, после выхода из функции он остается в ОЗУ или сохраняется???? Я закоментировал строки с текстом ошибка пропала. Как тогда с ним поступать писать его во флешь и выводить от туда?? Вся проблема в том, что все строчные литералы, обычно, размещаются в ОЗУ. Если явно не задать их размещение в памяти программ, то ОЗУ можно занять текстом и под переменные места не останется.
|
|
|
|
|
Jul 4 2006, 11:03
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(ILYCHOFF @ Jul 4 2006, 13:45)  Разместил весь текст во флеш проблемы решились... Но у меня в проекте используется еще функция sprintf хочу ее заменить на что-нибудь менее прожорливое к ресурсам. Из ICC никак itoa и ltoa не получилось вытащить, может кто поделится исходником, если есть, или алгоритмом. Заранее благодарен. Тут файл от IAR, я думаю, этого будет достаточно, если все лишнее убрать.
frmwri.txt ( 20.63 килобайт )
Кол-во скачиваний: 704
|
|
|
|
|
Aug 3 2006, 08:53
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(Andy_F @ Aug 3 2006, 10:57)  Просто создаётся ощущение ненадёжности программирования - программа поработала-поработала, и зависла. Стек увеличил (CSTACK) - вроде работает нормально. Но где гарантия, что при выполнении ещё чего-то стек опять не исчерпается ? На этапе трансляции компилятор выдает информацию по потребности стека в каждой функции, можно посчитать с учетом вложенности функций. На этапе компоновке линкер выдает сообщение о нехватке стека. Кроме того, использование ОЗУ, размер программных сегментов и их размещение в памяти можно посмотреть в файле карты памяти на выходе линкера. При определении размера стека нужно учитывать потребности стека в процедурах прерывания. Самый худший случай: прерывание в при выполнении функции с наибольшим уровнем вложенности. А общие рекомендации таковы: 1. не размещать большие наборы данных в стековой памяти. Особенно это относится к массивам или переменным типов long и float. Для них лучше использовать статическую память, использование которой легче контроллировать. 2. не вызывать из процедур прерываний друге функции и делать сами процедуры обработки прерываний по возможности короче. Чем короче функция, тем меньше регистров в ней используется.
|
|
|
|
|
Aug 3 2006, 19:50
|
Частый гость
 
Группа: Свой
Сообщений: 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. не вызывать из процедур прерываний друге функции и делать сами процедуры обработки прерываний по возможности короче. Чем короче функция, тем меньше регистров в ней используется. Спасибо, буду разбираться...
|
|
|
|
|
Aug 5 2006, 16:44
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(zltigo @ Aug 3 2006, 22:57)  Увы, линкер принципиально не может ничего сказать о нехватке каких-либо runtime распределяемых областей памяти. Единственно, что линкер может(вынужден) сообщить, это о полном отсутствии сегмента стека. Само собой. Линкер выдает сообщение о нехватке памяти, в том числе и стека. Точнее, выдается сообщение о нехватке сегмента под стек. Но это, опять же, тогда, когда вообще не хватает памяти данных (ОЗУ).
|
|
|
|
|
Nov 28 2006, 17:34
|
Частый гость
 
Группа: Свой
Сообщений: 83
Регистрация: 25-11-05
Из: odessa
Пользователь №: 11 397

|
позволю себе поднять тему.
люди, подскажите... а то тоже возникли проблемы с нехваткой ОЗУ в АТмеге16. первый раз столкнулся с этим, необходима помощь в понимании.
вопрос первый: под что идут CSTACK и RSTACK соответственно при работе программы? насколько я понимаю, RSTACK - исключительно под адреса возврата из функций (может ещё под локальные переменные), а CSTACK под передаваемые в функции параметры?
я никак не могу понять, что куда и зачем мне в памяти размещает иар.
в карте линковщика написано 474 bytes of DATA memory (+ 21 absolute ) при 1 кб доступных. но стоит мне добавить 9-байтовый массив - всё, начинается фигня, как бы я ни крутил параметры стека.
TINY_I DATA 00000060 Predefined 0 TINY_Z DATA 00000060 - 000000C0 61 Relative 0 CSTACK DATA 000000C1 - 000000F5 35 Predefined 0 RSTACK DATA 000000F6 - 00000239 144 Predefined 0 помогите так же разобраться с этим. под что идёт куча?
у меня максимальная вложенность функций равна 5. но при размере RSTACK меньше 140 еначинаются зависания... совсем запутался. да, ещё: в программе не используется ничего больше uint. максимально объёмные передаваемые данные в функцию - в сумме не больше 4х байт.
--------------------
Вся жизнь - ништяк, все бабы - леди, а солнце - шар дающий свет
|
|
|
|
|
Nov 28 2006, 19:03
|
Частый гость
 
Группа: Свой
Сообщений: 83
Регистрация: 25-11-05
Из: odessa
Пользователь №: 11 397

|
к куче обращаются команды malloc и иже с ней? а если я их не использую? тогда мне вообще куча не нужна получается?
и таки-да, Вы правы, у меня стоит модель тини. попробую сделать смолл. спасибо за совет.
----------------- спасибо, действительно всё дело было в модели памяти. совсем забыл что при тини пхается и стек и данные в одну область (по х86 асму так вроде)
ещё попросматривал листинги - и увидел, что стек данных так же необходим для сохранения регистров ОН.
Сообщение отредактировал junoSynthesizer - Nov 28 2006, 21:46
--------------------
Вся жизнь - ништяк, все бабы - леди, а солнце - шар дающий свет
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|