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

 
 
 
Reply to this topicStart new topic
> проблема со стеком в IAR
Sarez
сообщение Apr 23 2007, 14:41
Сообщение #1


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

Группа: Новичок
Сообщений: 75
Регистрация: 17-08-06
Из: Минск
Пользователь №: 19 630



Доброго всем дня ! Подскажите пожалуйста, что делаю не так. Имеется IAR 4.40A. На вкладке Options/
Linker/Config указываю в качестве Linker Command File свой файл, в котором инициализирую стек следующим образом :

//*************************************************************************
// Stack and heap segments.
//*************************************************************************

-D_CSTACK_SIZE=2000
// -D_SVC_STACK_SIZE=10
-D_IRQ_STACK_SIZE=100
-D_HEAP_SIZE=2000

-Z(DATA)CSTACK+_CSTACK_SIZE=RAMSTART-RAMEND
// -Z(DATA)SVC_STACK+_SVC_STACK_SIZE=RAMSTART-RAMEND
-Z(DATA)IRQ_STACK+_IRQ_STACK_SIZE,HEAP+_HEAP_SIZE=RAMSTART-RAMEND

При отладке с самых первых шагов выскакивает предупреждение:

Mon Apr 23 14:16:34 2007: The stack 'CSTACK' is
filled to 97% (7964 bytes used out of 8192). The
warning threshold is set to 90%.

Откуда на 'CSTACK' берется 8192 байта, если в файле указано 2000? И почему так быстро забивается стек? Возможно я чего-то не понимаю.
Обьясните пожалуйста идиоту.....

Стал копаться в опция линкера, и на той же вкладке нашел Comand file configuration tools. В выскочившем окошке в качестве адресного диапазона INTERNAL ROM указан диапазон 8000-FFFFF, а в качестве диапазона INTERNAL RAM -100000-7FFFFF - это при том, что используется МК LPC2214 ( ROM - 00000000 - 0003FFFF, RAM - 3FFFFFFF-40003FFF ), хотя в качестве таблицы векторов указаны адреса 0x0 - 0x3f, что соответствует действительности... . На следующей вкладке этого окна в качестве HEEP SIZE указан объем 8000,а не 2000 , как в вышеупомянутом файле....

Возможно вопросы глупые, но все же обьясните пожалуйста, что используется для распределения памяти, и почему в Comand file configuration tools такое распределение адресов?
Спасибо...
Go to the top of the page
 
+Quote Post
amw
сообщение Apr 23 2007, 14:47
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



0x2000 = 8192 (десятичное).
Может тут собака порылась?
Про IAR не знаю.


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
Sarez
сообщение Apr 23 2007, 15:15
Сообщение #3


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

Группа: Новичок
Сообщений: 75
Регистрация: 17-08-06
Из: Минск
Пользователь №: 19 630



Пожалуй фраза про идиота и не такая уж и смешная........ Ладно, почему тогда так быстро забивается стек ?
Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 24 2007, 06:51
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Действительно, линкер вомпринимает числа в опциях как шестнадцатеричные. К ним можно приписывать 0x как напоминание.
В опциях линекера Command Line Configuration Tool работает как-то непонятно. Откуда берёт входные данные - неясно. Ясно, что результат пишет в файл. Я бы лучше этот файл руками правил.
Посмотрите в .MAP файл, чтобы проверить, какого размера и где линкер разместил стек. Потом пройдите отладчиком по инициализации стека в cstartup и убедитесь, что инициализация правильная.
При предупреждении проверьте самостоятельно занятость стека. Может быть, отладчик неправильно воспринимает размер стека? Если стек действительно занят, можно при помощи JTAG и WATCHPOINT установить, какой код туда пишет.
Go to the top of the page
 
+Quote Post
amw
сообщение Apr 24 2007, 09:49
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



А еще, на сколько я помню, 0x2000 + 0x2000 равно объему RAM (16К) для LPC2214.
Может это не проблема стека, а проблема нехватки RAM?


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
cf7k
сообщение Apr 24 2007, 10:10
Сообщение #6


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

Группа: Свой
Сообщений: 82
Регистрация: 14-03-06
Из: Санкт-Петербург
Пользователь №: 15 227



Цитата(amw @ Apr 24 2007, 10:49) *
Может это не проблема стека, а проблема нехватки RAM?


Сталкивался с подобным на RM9200, тот же IAR. Область стека специально проверял - забито не более чем несколькими вложенными вызовами. Одна из фич, которые к такому приводили - размещение локальных буферов в main (их размер + вложенные вызовы много меньше размера выделенного стека). После перенесения их за пределы main - подобное предупреждение исчезло. Фича или глюк - но имело место быть.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Apr 24 2007, 10:15
Сообщение #7


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Похоже, что инициализация указателя стека была неверно сделана. Проверьте в отладчике прохождение startup кода.
Возможно также, что в функции main или какой-то другой обьявлен большой локальный массив.
Go to the top of the page
 
+Quote Post
_Sam_
сообщение Apr 24 2007, 11:18
Сообщение #8


Местный
***

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



потому что для линкёра вы всё значения в 16ричной системе должны указывать.
2000(HEX) = 8192(DEC)
Go to the top of the page
 
+Quote Post
Sarez
сообщение Apr 24 2007, 11:47
Сообщение #9


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

Группа: Новичок
Сообщений: 75
Регистрация: 17-08-06
Из: Минск
Пользователь №: 19 630



to cf7k и IgorKossak :

Да, действительно, Вы оказались правы. В main были размещены локальные буфера - работали на прием данных из стека Wiznet...

Большое всем спасибо!
Go to the top of the page
 
+Quote Post
Panych
сообщение Aug 24 2007, 14:16
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 335
Регистрация: 17-06-04
Из: Москва
Пользователь №: 35



Цитата(IgorKossak @ Apr 24 2007, 14:15) *
Возможно также, что в функции main или какой-то другой обьявлен большой локальный массив.

И что в этом случае надо делать?


--------------------
Всегда не хватает времени, чтобы выполнить работу как надо, но на то, чтобы ее переделать, время находится. (Закон Мескимена.)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 24 2007, 14:38
Сообщение #11


Гуру
******

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



Цитата(Panych @ Aug 24 2007, 17:16) *
И что в этом случае надо делать?

Думать, а влезут-ли они в отведенный стек. И если не влезут думать что делать со стеком или буферами, или контроллером smile.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Николай Z
сообщение Aug 26 2007, 16:23
Сообщение #12


Местный
***

Группа: Участник*
Сообщений: 418
Регистрация: 20-08-07
Пользователь №: 29 930



Цитата(Sarez @ Apr 24 2007, 15:47) *
to cf7k и IgorKossak :

Да, действительно, Вы оказались правы. В main были размещены локальные буфера - работали на прием данных из стека Wiznet...

Большое всем спасибо!


Добавлю свои три копейки:
Для анализа размеров получившегося бинарника - вообще-то можно после линковки посмотреть в файл *.map - мне что-то подсказывает, что IAR его тоже делает... Наверное интуиция...

Сообщение отредактировал Николай Z - Aug 26 2007, 17:02
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Aug 26 2007, 19:03
Сообщение #13


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(Николай Z @ Aug 26 2007, 19:23) *
Добавлю свои три копейки:
Для анализа размеров получившегося бинарника - вообще-то можно после линковки посмотреть в файл *.map - мне что-то подсказывает, что IAR его тоже делает... Наверное интуиция...

Локальные обьекты в *.map файле не отражаются, а ведь из-за них основной сыр-бор в данном топике.
Более полезную информацию в данном случае могут дать *.lst файлы, т. к. в них есть информация о потреблении стека функциями.
Go to the top of the page
 
+Quote Post
Ден
сообщение Aug 29 2007, 11:43
Сообщение #14


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

Группа: Свой
Сообщений: 128
Регистрация: 21-06-07
Из: Омск
Пользователь №: 28 594



У меня наблюдалось странное переполнение R стека при вызове vsprintf (на IARAVR 4.20A + mega128), вылечилось сиё дело включением оптимизации (максимальная оптимизация по размеру). С С стеком при этом было всё нормально.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 22:33
Рейтинг@Mail.ru


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