|
Инициализация стека 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 - Что находится под стеком?
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 20)
|
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 лет, а не потерял актуальности. Я сам не нашел такого хорошего руководства по линковщику.
|
|
|
|
|
Oct 2 2013, 15:25
|

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

|
Цитата(редактор @ Oct 2 2013, 04:02)  Раз уж речь пошла об инициализации, спрошу здесь (хоть и не совсем в тему, да простят меня автор топика и Модераторы). Можно ли в KEIL узнать остаток кучи (HEAP) штатными средствами? Или только через контроль указателя, который вернулся при запросе (через new) и несложную математику? Keil это компилятор. Вы хотите узнать сколько осталось после компиляции? мап файл. Если в процессе работы программы, то Keil тут никаким боком. Зависит от операционки, если она есть.
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
Oct 3 2013, 08:55
|
Местный
  
Группа: Участник
Сообщений: 356
Регистрация: 9-06-07
Пользователь №: 28 315

|
Спасибо всем за ответы. Цитата А что такое "остаток"? Память ведь может быть фрагментирована. Сумма всех кусочков? Ну примерно так. Если подробнее, то до вызова main() происходит инициализация статических переменных и классов. При инициализации классов часть памяти "захватыватся" через new. Вот и хотелось бы узнать хоть приблизительный остаток кучи (к этому моменту она еще не будет дефрагментирована, надеюсь) или размер максимального блока, который может быть выделен. Использовать статическое выделение памяти можно, но это уже другая тема (мое наследство), поэтому не обсуждаю. Цитата Keil это компилятор. Вы хотите узнать сколько осталось после компиляции? мап файл. Тогда уж после линковки (но это я к словам докапываюсь, извините). Это я в курсе. Но тем неменее KEIL предоставляет несколько функций для работы с кучей, не относящихся к стандартным. Например __heapstats(); ее недостатком является то, что информацию выдает через printf в текстовом виде, да и информация по каждому блоку отдельно - не совсем то, что надо. Думал, может кто с другими функциями контроля знаком.
--------------------
Хорошую систему делают из стандартных блоков нестандартно мыслящие инженеры.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|