Работая с 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;
}
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
======= ===== ============= =========== ==== ==== =====
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
======= ===== ============= =========== ==== ==== =====
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-модели? Можно ли как-то изменить такое распределение памяти и заставить компилятор размещать данные ниже стеков?