igorle 0 29 сентября, 2013 Опубликовано 29 сентября, 2013 · Жалоба 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 - Что находится под стеком? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A. Fig Lee 0 29 сентября, 2013 Опубликовано 29 сентября, 2013 · Жалоба Смотрите линкер файл. В IAR это .icf файл Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
igorle 0 29 сентября, 2013 Опубликовано 29 сентября, 2013 · Жалоба А если Кейл - куда смотреть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 29 сентября, 2013 Опубликовано 29 сентября, 2013 · Жалоба Стек растет вниз, в сторону уменьшения адресов. А навстречу ему движется "куча", из которой выделяется память. И все это находится выше переменных. А посмотреть можно в файле *.map. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 29 сентября, 2013 Опубликовано 29 сентября, 2013 · Жалоба А если Кейл - куда смотреть? .scat Вам нужно найти начало секции STACK. __initial_sp будет равен <начало STACK> + Stack_Size. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_NB 0 30 сентября, 2013 Опубликовано 30 сентября, 2013 · Жалоба Вопросы: - Как образуются эти числа? Я ожидал видеть там 0x20000400 В 'startup_stm32f10x_md.s' вы задаёте размер стека, а не адрес его начала. - Что находится под стеком? Для Keil-a посмотрите map-файл Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A. Fig Lee 0 30 сентября, 2013 Опубликовано 30 сентября, 2013 · Жалоба В 'startup_stm32f10x_md.s' вы задаёте размер стека, а не адрес его начала. Для Keil-a посмотрите map-файл 1. Именно что начало. 2. Мап это не тот файл, это результат. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 30 сентября, 2013 Опубликовано 30 сентября, 2013 · Жалоба Вот такие наблюдения. В проекте в стартапе задано размер стека 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
igorle 0 30 сентября, 2013 Опубликовано 30 сентября, 2013 · Жалоба MAP файл нашел. Стало понятно, что за цифры я получал и почему они разные. Стек объявляется НАД всеми данными. Мне это не нравится. Ведь это означает, что если я выйду за пределы стека - то я потру свои переменные. И ловить такую ошибку очень трудно. Я бы хотел разместить стек ПОД всеми данными. Начиная с 0х20000000. Тогда при выходе за стек я получу hard fault. Вопрос - могу ли я в Кейле сказать, где должен начинаться стек? .scat Вам нужно найти начало секции STACK. __initial_sp будет равен <начало STACK> + Stack_Size. Я не нашел такого файла. Есть <target>.sct. Но он тоже автогенерится. Там есть такая секция RW_IRAM1 0x20000000 0x00005000 { ; RW data .ANY (+RW +ZI) } Возможно, если бы я мог повлиять на этот файл, я мог бы переместить стек туда, куда мне надо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 0 30 сентября, 2013 Опубликовано 30 сентября, 2013 · Жалоба Возможно, если бы я мог повлиять на этот файл, я мог бы переместить стек туда, куда мне надо. конечно возможно) нужно снять галку - Use Memory Layout from Target Dialog - и правим скаттер руками обзываем область стека как нужно и в скаттере даем указание где расположить скорее всего, там обозначен один регион для .ANY (+RW +ZI), так вот нужно просто создать свой регион и обозначить его точку вхождения и размер LOAD REGION определяет то, как будет располагаться образ, записываемый программатором (ну или бутлоадером) А вот уже в нем расписываются все секции - где код, где данные, где оставить окно и т.д. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
igorle 0 30 сентября, 2013 Опубликовано 30 сентября, 2013 · Жалоба <Спустя полчаса> Все, спасибо всем. Дошло. Я могу отменить "Use Memory Layout..." на закладке Linker в свойствах проекта, и задать свой скаттер файл. Уже видно, что это не тривиальная задача - написать скаттер файл, но понятно куда грести. Еще раз всем спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 0 30 сентября, 2013 Опубликовано 30 сентября, 2013 · Жалоба http://infocenter.arm.com/help/topic/com.a...51a/DUI0151.pdf в помощь Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
igorle 0 1 октября, 2013 Опубликовано 1 октября, 2013 · Жалоба 2toweroff - Спасибо. Жаль что вы написали предыдущее сообщение одновременно со мною :) Теперь никто не поверит, что я сам сообразил, и написал одновремнно с вами :( И за линк спасибо. Документу уже 12 лет, а не потерял актуальности. Я сам не нашел такого хорошего руководства по линковщику. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 0 1 октября, 2013 Опубликовано 1 октября, 2013 · Жалоба Жаль что вы написали предыдущее сообщение одновременно со мною :) Теперь никто не поверит, что я сам сообразил, и написал одновремнно с вами :( а оно кому-нибудь надо? :) И за линк спасибо. Документу уже 12 лет, а не потерял актуальности. Я сам не нашел такого хорошего руководства по линковщику. да, мне этот документ тоже мозг вправил, когда бутлодырем занимался. Кстати, тоже много полезного у самого кейла есть тут Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Edit2007 3 2 октября, 2013 Опубликовано 2 октября, 2013 · Жалоба Раз уж речь пошла об инициализации, спрошу здесь (хоть и не совсем в тему, да простят меня автор топика и Модераторы). Можно ли в KEIL узнать остаток кучи (HEAP) штатными средствами? Или только через контроль указателя, который вернулся при запросе (через new) и несложную математику? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться