Организация динамического стека Cortex-M3 с использованием keil

Попытка запустить пример мигания для Atmel sam3s и проверка указателя стека... SP имеет значение 0x20000238 в начале основной функции, что равно базе Ram + RW + ZI для этого примера.

Базовый адрес ОЗУ для этого чипа: 0x20000000 Общий размер ОЗУ: 0x10000

Я ожидал, что sp будет инициализирован на 0x20010000 и выйдет из строя. Кто-нибудь может объяснить, ошибаюсь я или нет?


person Taheri    schedule 27.04.2015    source источник
comment
Вы ошибаетесь, потому что компоновщик не учитывает размер ОЗУ в своей конфигурации по умолчанию, поэтому стек начинается с наименьшего возможного адреса. Секции просто размещаются одна за другой. Если вы думаете, что это, вероятно, наихудший из возможных макетов, поскольку (маленький) стек растет прямо в ваши данные RW, что ж, вы правы.   -  person Pait    schedule 27.04.2015
comment
Да, это не лучшее место для стека.   -  person Taheri    schedule 28.04.2015


Ответы (1)


Как сказал Пейт (думаю, он/она должен был ответить на вопрос, чтобы я мог его принять), я ошибался, думая, что стек по умолчанию будет помещен в конец ОЗУ. Но я думаю, что было бы разумно разместить его там.

Я так делаю для своего SAM3S micro, меняя скаттер файл

LR_IROM1 0x00400000 0x00080000  {    ; load region size_region
  ER_IROM1 0x00400000 0x00080000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x20000000 0x00010000  {  ; RW data
   .ANY (+RW +ZI)
  }
  RW_STACK 0x2000C000 UNINIT 0x4000 { ; STACK data
   *.o (STACK)
  }
}

База оперативной памяти = 0x20000000

Всего ОЗУ = 64 кб

Предполагаемый размер стека = 16 КБ

person Taheri    schedule 28.04.2015