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

 
 
> Keil 9+Silabs C51+pdata, Как зарезервировать память под стек?
1kvi1
сообщение Mar 17 2011, 06:59
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 5-12-10
Пользователь №: 61 414



Всем, привет!
Делаю первый проект на С для С51.
Возникла следующая проблема.
При использовании модели памяти compact не удается определить местоположение стека.
То есть при вызове reentrant функции портятся переменные расположенные в памяти xdata по адресу меньше 0x100.
Проверил все опции, прочитал хелп, пользовался поиском - не могу найти решения проблемы.
Подскажите кто знает как исправить проблему.
Заранее спасибо!

Линкер генерит такую таблицу памяти

ACTIVE MEMORY CLASSES OF MODULE: msd-silabs (F34X_MSD_USB_MAIN)

BASE START END USED MEMORY CLASS
==========================================================
X:000000H X:000000H X:000FFFH 000CECH XDATA
X:000000H X:000000H X:000FFFH HDATA
C:000000H C:000000H C:00FFFFH ECODE
B00:0000H C:000000H C:00FFFFH HCONST
C:000000H C:000000H C:00FFFFH 008E13H CODE
X:000000H X:000000H X:0000FFH 0000B7H PDATA
I:000000H I:000000H I:00007FH 000046H DATA
C:000000H C:000000H C:00FFFFH 000131H CONST
I:000000H I:000000H I:0000FFH 000080H IDATA


Сообщение отредактировал 1kvi1 - Mar 17 2011, 06:21
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
1kvi1
сообщение Mar 19 2011, 00:57
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 5-12-10
Пользователь №: 61 414



Старт-ап код я исправил и указал вершину на 0x100. Я так понимаю линкер должен это учесть и не располагать переменые и структуры ниже адреса 0x100? Но он так не делает и игнорирует. Сейчас после каждой компиляции проверяю по листингу с какого адреса лежат переменные и в стартапе устанавливаю соответствующее значение.

Кроме того ассемблерная инструкция - совсем не указание линкеру освободить данную область памяти?

Как решить проблему?
Go to the top of the page
 
+Quote Post
O.L.
сообщение Mar 19 2011, 11:51
Сообщение #3


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

Группа: Свой
Сообщений: 96
Регистрация: 10-06-05
Из: Новосибирск
Пользователь №: 5 890



Цитата(1kvi1 @ Mar 19 2011, 06:57) *
Старт-ап код я исправил и указал вершину на 0x100. Я так понимаю линкер должен это учесть и не располагать переменые и структуры ниже адреса 0x100?

Нет смысла править STARTUP.A51 для этого. Линкер его не анализирует. А располагает все переменные и структуры согласно выбранной модели памяти. Попробуйте установить модель памяти LARGE и увидите совсем другую картину, если конечно в программе нет ошибок.
Что бы убедиться в том где располагается стек, а так же насколько глубоко и куда он "растет", можно попробовать вот такую рекомендацию от Keil-а, - http://www.keil.com/support/docs/192.htm
Если очень хочется проверить работу со стеком не в стимуляторе, а на боевой программе, то можно воспользоваться вот такой рекомендацией, - http://www.keil.com/support/docs/2095.htm.

Цитата(1kvi1 @ Mar 19 2011, 06:57) *
Кроме того ассемблерная инструкция - совсем не указание линкеру освободить данную область памяти?

Совершенно не указ. Если необходимо располагать переменные по абсолютному и заранее известному адресу в RAM, то почитайте вот эту рекомендацию, - http://www.keil.com/support/docs/1455.htm Но такой подход требует повышенной внимательности и аккуратности от программиста.

Цитата(1kvi1 @ Mar 19 2011, 06:57) *
Как решить проблему?

Несколько раз перечитал всю ветку, но так и не понял, что Вы называете проблемой, какое поведение хотите получить, а главное зачем?
Если переменные "забивают" стек, то это либо ошибка (ошибки) в программе, либо неверно выбранная модель памяти. Но в любом случае, танцы с бубном вокруг месторасположения стека этих проблем не решат.
Go to the top of the page
 
+Quote Post



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

 


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


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