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

 
 
> Почему в small-модели стеки находятся снизу?, (IAR EW AVR)
Xenia
сообщение Jun 13 2009, 18:15
Сообщение #1


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Почему в small-модели стеки находятся снизу и как это исправить?

Работая с ATtiny2313 я уже привыкла к тому, что стеки (CSTACK и RSTACK) находятся сверху (в старших адресах). Это было очень удобно тем, что в программе можно было явно установить указатель RSTACK'а на самый верх, тем самым, задействуя всю неиспользованную память под стеки. Вручную же рассчитывать размеры стеков крайне неудобно, т.к. CSTACK запрашивают в байтах, а RSTACK в словах. А я не арифмометр, чтобы подбирать эти значения так, чтобы они вписались во весь объем памяти. Тем более что такую операцию мне пришлось бы выполнять каждый раз, когда бы я заводила или удаляла какую-нибудь переменную или изменяла размеры массива. А так, устанавливаешь указатель на вершину памяти и никакой тебе головной боли.
Однако перейдя со временем на МК с большим объемом ОЗУ, пришлось перейти и на модель памяти small. И тут меня ждало неприятное известие о том, что теперь стеки находятся внизу, за ними данные, а пустое пространство сверху. Теперь его уже никак нельзя использовать, кроме как вручную каждый раз изменять размеры стеков в проекте.
В таком расположении стеков я ничуть не виновата - IAR так делает сам. Вот посмотрите на контрольный тест для ATmega8. Этот МК выбран только потому, что допускает обе модели памяти: как tiny, так small. Пишу простейшую программу, содержащую массив данных Buffer, и компилирую ОДИН И ТОТ ЖЕ ПРОЕКТ на tiny и small моделях, переключая в проекте ТОЛЬКО тип модели и не трогая ничего остального.

Код
unsigned char Buffer[70];

C_task main( void )
{
  Buffer[0] = 0;
}

В модели tiny получаю:

Код
SEGMENT              SPACE    START ADDRESS   END ADDRESS     SIZE  TYPE  ALIGN
=======              =====    =============   ===========     ====  ====  =====
TINY_I               DATA               00000060                     dse    0
TINY_Z               DATA          00000060 - 000000A5          46   rel    0
CSTACK               DATA          000000A6 - 000000B9          14   dse    0
RSTACK               DATA          000000BA - 000000C9          10   dse    0

А в модели small вот это:

Код
SEGMENT              SPACE    START ADDRESS   END ADDRESS     SIZE  TYPE  ALIGN
=======              =====    =============   ===========     ====  ====  =====
CSTACK               DATA          00000060 - 00000073          14   dse    0
RSTACK               DATA          00000074 - 00000083          10   dse    0
NEAR_I               DATA               00000084                     dse    0
NEAR_Z               DATA          00000084 - 000000C9          46   rel    0

Абсолютно та же самая ситуация со small-моделью во всех остальных моделях МК (проверяла еще и на AT90USB647).

Мой вопрос: Какими соображениями обусловлено такое распределение памяти в small-модели? Можно ли как-то изменить такое распределение памяти и заставить компилятор размещать данные ниже стеков?

Сообщение отредактировал Xenia - Jun 13 2009, 18:22
Go to the top of the page
 
+Quote Post



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

 


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


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