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

 
 
> 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 17 2011, 08:00
Сообщение #2


Участник
*

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



0000B7H PDATA + 000CECH XDATA
Памяти хватает, проблема в том что указатель программного стека не инициализируется на вершину.
Инициализироваться он должен в стартап коде, но его местоположение заранее не известно.
Как узнать адрес и размер программного стека или как заставить линкер самому вычислять?
Go to the top of the page
 
+Quote Post
O.L.
сообщение Mar 17 2011, 08:50
Сообщение #3


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

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



На самом деле не совсем так. Судя по таблице линкера 0000B7H PDATA + 000CECH XDATA + 000FFFH HDATA. Стек то ведь то же туда же укладывается.
Посмотрите в симуляторе, что пишется в регистр SP. Можно так же "покрутить" программу и посмотреть значение SP_max. Впрочем можно посмотреть эти значения и в листинге, если он генерируется.
Потом изменить модель памяти на LARGE и посмотреть все те же значения.
Уверяю Вас, все строго определено и ни компайлер ни линкер каких либо вольностей себе не позволяют.

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



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

 


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


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