Перейти к содержанию
    

Инициализация стека STM32

STM32F103 Keil StdPeriph.

 

Есть два аналогичных проекта. Сравнивая потабово свойства проектов, различий не вижу.

 

Насколько я понимаю, размер стека задается в файле startup_stm32f10x_md.s таким образом:

Stack_Size      EQU     0x00000400

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp

...

__Vectors       DCD     __initial_sp              ; Top of Stack
                DCD     Reset_Handler             ; Reset Handler
                DCD     NMI_Handler               ; NMI Handler
                DCD     HardFault_Handler         ; Hard Fault Handler
                DCD     MemManage_Handler         ; MPU Fault Handler

При этом в одном проекте SP инициализируется значением 0x200004D0, в другом 0x200008F0

 

Вопросы:

- Как образуются эти числа? Я ожидал видеть там 0x20000400

- Что находится под стеком?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Стек растет вниз, в сторону уменьшения адресов. А навстречу ему движется "куча", из которой выделяется память. И все это находится выше переменных.

А посмотреть можно в файле *.map.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А если Кейл - куда смотреть?

.scat

 

Вам нужно найти начало секции STACK. __initial_sp будет равен <начало STACK> + Stack_Size.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вопросы:

- Как образуются эти числа? Я ожидал видеть там 0x20000400

В 'startup_stm32f10x_md.s' вы задаёте размер стека, а не адрес его начала.

 

- Что находится под стеком?

Для Keil-a посмотрите map-файл

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 'startup_stm32f10x_md.s' вы задаёте размер стека, а не адрес его начала.

 

 

Для Keil-a посмотрите map-файл

1. Именно что начало.

2. Мап это не тот файл, это результат.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот такие наблюдения. В проекте в стартапе задано размер стека 0x400, размер кучи 0x200. В map файле вижу:

    Base Addr    Size         Type   Attr      Idx    E Section Name        Object

    0x20000000   0x00000008   Data   RW            4    .data               telt_test.o
    0x20000008   0x00000060   Zero   RW          139    .bss                c_w.l(libspace.o)
    0x20000068   0x00000200   Zero   RW           55    HEAP                startup_stm32f10x_hd.o
    0x20000268   0x00000400   Zero   RW           54    STACK               startup_stm32f10x_hd.o

В отладчике вижу, что стек инициализируется значением 0x20000668.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

MAP файл нашел. Стало понятно, что за цифры я получал и почему они разные. Стек объявляется НАД всеми данными.

 

Мне это не нравится. Ведь это означает, что если я выйду за пределы стека - то я потру свои переменные. И ловить такую ошибку очень трудно. Я бы хотел разместить стек ПОД всеми данными. Начиная с 0х20000000. Тогда при выходе за стек я получу hard fault.

 

Вопрос - могу ли я в Кейле сказать, где должен начинаться стек?

 

.scat

 

Вам нужно найти начало секции STACK. __initial_sp будет равен <начало STACK> + Stack_Size.

Я не нашел такого файла. Есть <target>.sct. Но он тоже автогенерится. Там есть такая секция

  RW_IRAM1 0x20000000 0x00005000  { ; RW data
   .ANY (+RW +ZI)
  }

Возможно, если бы я мог повлиять на этот файл, я мог бы переместить стек туда, куда мне надо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возможно, если бы я мог повлиять на этот файл, я мог бы переместить стек туда, куда мне надо.

конечно возможно)

нужно снять галку - Use Memory Layout from Target Dialog - и правим скаттер руками

обзываем область стека как нужно и в скаттере даем указание где расположить

скорее всего, там обозначен один регион для .ANY (+RW +ZI), так вот нужно просто создать свой регион и обозначить его точку вхождения и размер

LOAD REGION определяет то, как будет располагаться образ, записываемый программатором (ну или бутлоадером)

А вот уже в нем расписываются все секции - где код, где данные, где оставить окно и т.д.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

<Спустя полчаса>

Все, спасибо всем. Дошло. Я могу отменить "Use Memory Layout..." на закладке Linker в свойствах проекта, и задать свой скаттер файл. Уже видно, что это не тривиальная задача - написать скаттер файл, но понятно куда грести.

Еще раз всем спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2toweroff - Спасибо. Жаль что вы написали предыдущее сообщение одновременно со мною :) Теперь никто не поверит, что я сам сообразил, и написал одновремнно с вами :(

 

И за линк спасибо. Документу уже 12 лет, а не потерял актуальности. Я сам не нашел такого хорошего руководства по линковщику.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Жаль что вы написали предыдущее сообщение одновременно со мною :) Теперь никто не поверит, что я сам сообразил, и написал одновремнно с вами :(

а оно кому-нибудь надо? :)

И за линк спасибо. Документу уже 12 лет, а не потерял актуальности. Я сам не нашел такого хорошего руководства по линковщику.

 

 

да, мне этот документ тоже мозг вправил, когда бутлодырем занимался. Кстати, тоже много полезного у самого кейла есть тут

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Раз уж речь пошла об инициализации, спрошу здесь (хоть и не совсем в тему, да простят меня автор топика и Модераторы).

Можно ли в KEIL узнать остаток кучи (HEAP) штатными средствами?

Или только через контроль указателя, который вернулся при запросе (через new) и несложную математику?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...