|
Инициализация стека STM32 |
|
|
|
Sep 29 2013, 19:08
|
Местный
  
Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753

|
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 - Что находится под стеком?
|
|
|
|
|
Sep 30 2013, 10:41
|
Частый гость
 
Группа: Свой
Сообщений: 92
Регистрация: 22-06-05
Из: Украина, г.Боярка
Пользователь №: 6 238

|
Цитата(igorle @ Sep 29 2013, 22:08)  Вопросы: - Как образуются эти числа? Я ожидал видеть там 0x20000400 В 'startup_stm32f10x_md.s' вы задаёте размер стека, а не адрес его начала. Цитата - Что находится под стеком? Для Keil-a посмотрите map-файл
|
|
|
|
|
Sep 30 2013, 11:27
|

Знающий
   
Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467

|
Цитата(_NB @ Sep 30 2013, 06:41)  В 'startup_stm32f10x_md.s' вы задаёте размер стека, а не адрес его начала.
Для Keil-a посмотрите map-файл 1. Именно что начало. 2. Мап это не тот файл, это результат.
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
Sep 30 2013, 18:33
|
Местный
  
Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753

|
MAP файл нашел. Стало понятно, что за цифры я получал и почему они разные. Стек объявляется НАД всеми данными. Мне это не нравится. Ведь это означает, что если я выйду за пределы стека - то я потру свои переменные. И ловить такую ошибку очень трудно. Я бы хотел разместить стек ПОД всеми данными. Начиная с 0х20000000. Тогда при выходе за стек я получу hard fault. Вопрос - могу ли я в Кейле сказать, где должен начинаться стек? Цитата(aaarrr @ Sep 30 2013, 00:13)  .scat
Вам нужно найти начало секции STACK. __initial_sp будет равен <начало STACK> + Stack_Size. Я не нашел такого файла. Есть <target>.sct. Но он тоже автогенерится. Там есть такая секция Код RW_IRAM1 0x20000000 0x00005000 { ; RW data .ANY (+RW +ZI) } Возможно, если бы я мог повлиять на этот файл, я мог бы переместить стек туда, куда мне надо.
|
|
|
|
|
Sep 30 2013, 18:57
|

Гуру
     
Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514

|
Цитата(igorle @ Sep 30 2013, 22:33)  Возможно, если бы я мог повлиять на этот файл, я мог бы переместить стек туда, куда мне надо. конечно возможно) нужно снять галку - Use Memory Layout from Target Dialog - и правим скаттер руками обзываем область стека как нужно и в скаттере даем указание где расположить скорее всего, там обозначен один регион для .ANY (+RW +ZI), так вот нужно просто создать свой регион и обозначить его точку вхождения и размер LOAD REGION определяет то, как будет располагаться образ, записываемый программатором (ну или бутлоадером) А вот уже в нем расписываются все секции - где код, где данные, где оставить окно и т.д.
|
|
|
|
|
Oct 1 2013, 08:06
|
Местный
  
Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753

|
2 toweroff - Спасибо. Жаль что вы написали предыдущее сообщение одновременно со мною  Теперь никто не поверит, что я сам сообразил, и написал одновремнно с вами  И за линк спасибо. Документу уже 12 лет, а не потерял актуальности. Я сам не нашел такого хорошего руководства по линковщику.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|