mob7272
1

stm32f103c8 и стек

01.05.2017, 10:31. Показов 5106. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго всем времени.

Какой размер стека указывается в stortup-файле?
Так в статье "ASM в STM32 Начало"
автор определяет размер стека stack_size equ 0x100
в Reference manual на stm32f100xx указано в пункте 2.3.1 SROM = 32K.
Keil при автоматическом включении stortup-файла пишет Stack_Size EQU 0x00000400.
Для stm32f103c8
RM сказано SROM = 96K.
Keil пишет в stortup-файле Stack_Size EQU 0x00000400.

Так вот вопрос как увязать данные из RM и stortup-файла, какой размер указывать? Заранее спасибо.
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.05.2017, 10:31
Ответы с готовыми решениями:

stm32f103c8 цап
сваял себе кое какой девайсик на stm32f103c8 платке. очень нужно чтобы этот девайсик на один пин...

Обвязка stm32f103c8
Начал проектировать схему для проекта. Нашел схему отладочной платы с stm32f103c8 и решил некоторые...

stm32f103c8 usb проблема
Прошу помощи, уже неделю сам не могу разобраться. Пытаюсь поднять USB HID с помощью...

STM32F103C8 тактирование от HSI
Добрый день/ночь. Выручайте друзья. Делал свой проект, то есть уже переехал чип с платки blue pill...

15
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,183
01.05.2017, 11:38 2
0x400 всегда хватало. А в чем проблема собственно?
0
mob7272
01.05.2017, 11:44 3
Я начинающий, и фраза "всегда хватало" мне непонятна так как в AVR стек начинался с конца, а в STM как-то подругому? И как определить хватит или нет? Как я заранее могу определить скока надо, не проще указать в конец и все? Спасибо.
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,183
01.05.2017, 12:05 4
Не важно как стек расположен ибо вы его сами можете расположить как хочется (но зачем?), важно сколько под него выделено места.
Так вот 0x400 этого размера более чем достаточно для приложений. Если вам нужно до байта высчитать то смотрите сколько у вас вызовов вложенных и сколько инициализируется переменных внутри. Сможете посчитать - отлично, нет - оставили поумолчанию и работаем дальше.
0
mob7272
01.05.2017, 12:11 5
Спасибо за ответ. Но всеже почему не указать конец SROM и забыть про него? Если это не трудно, можете обьяснить?

Для начала и обучения (изучения) указываю 0x400 и незаморачиваюсь.
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,183
01.05.2017, 12:21 6
Если стек будет расти с конца то можно его перекрыть динамически выделяемыми переменными и не понять что происходит, а так он идет сразу за статическими и вы туда не попадете. Ну или же свалитесь в hard fault

Смотрите MAP файл который Keil компилит.
0
mob7272
01.05.2017, 12:26 7
О как, так почему этого не делали в AVR, из-зи малых размеров?
Где на эту тему почитать, желательно на русском. А то нет четкого понимания что где расположено, куда помещается/распределяется автоматически и так далее. Еще раз спасибо.

а про map файл можно поподробнее, где он и что в нем отражено или литературу какую.
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,183
01.05.2017, 12:34 8
С АВР не знаком, так что не могу сказать почему так.
После первой компиляции проекта в папке проекта появляются *.map файл с именем проекта. Найдите его и откройте любым текстовым редактором. Там будет много интересного, но все достаточно понятно и есть заголовки какая секция что содержит.
Там будет видно как расположены переменные, сколько под них места, по каким адресам идут вызовы функции и т.д.
почитать на русском... не знаю. гуглить нужно :)
0
mob7272
01.05.2017, 12:45 9
Спасибо огромное.
Пошел изучать, искать, новые вопросы готовить.
1 / 1 / 0
Регистрация: 08.05.2015
Сообщений: 225
01.05.2017, 13:27 10
Доброго времени суток !
Давайте разбираться. stm32f103c8 - 48pin 64kB - flash; 20kB - ROM;
Глянем как в .ld файлах задается стек. Первый файл mem.ld - здесь распределяется адресное пространство и задается режимы доступа к ней
MEMORY
{
ROM (xrw) : ORIGIN = 0x20000000, LENKTH = 20K
CCMROM (xrw) : ORIGIN = 0x00000000, LENKTH = 0
FLASH (rx) : ORIGIN = 0x08000000, LENKTH = 128K
FLASHB1 (rx) : ORIGIN = 0x00000000, LENKTH = 0
EXTMEMB0 (rx) : ORIGIN = 0x00000000, LENKTH = 0
EXTMEMB1 (rx) : ORIGIN = 0x00000000, LENKTH = 0
EXTMEMB2 (rx) : ORIGIN = 0x00000000, LENKTH = 0
EXTMEMB3 (rx) : ORIGIN = 0x00000000, LENKTH = 0
MEMORY_ARRAY (xrw) : ORIGIN = 0x00000000, LENKTH = 0
}
Далее глянем файл описания секций sections.ld, а конкретно ту его часть где описан стек
__stack = ORIGIN(ROM) + LENKTH(ROM);

_estack = __stack; /* STM specific defymition */

__Main_Stack_Size = 1024 ;

PROVIDE ( _Main_Stack_Size = __Main_Stack_Size ) ;

__Main_Stack_Limit = __stack - __Main_Stack_Size ;
и так мы видим, что вершина стека __stack определяется адресом начала памяти (ORIGIN) + размер памяти (LENKTH) = то есть конец памяти ROM, размер стека определен в 1024 байта, предел стека определен как вершина (__stack) минус размер стека (__Main_Stack_Size). В итоге мы видим что вершина стека определяется в конце РАМ и доступ к ней происходит по уменьшению адреса.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,183
01.05.2017, 13:51 11
У ТС Keil. Вот примерно что будет в map файле:
Код
..................
HEAP                                     0x20002bf0   Section      512  stortup_stm32f10x_md.o(HEAP)
Heap_Mem                                 0x20002bf0   Data         512  stortup_stm32f10x_md.o(HEAP)
STACK                                    0x20002df0   Section     1024  stortup_stm32f10x_md.o(STACK)
Stack_Mem                                0x20002df0   Data        1024  stortup_stm32f10x_md.o(STACK)
__initial_sp                            0x200031f0   Data           0  stortup_stm32f10x_md.o(STACK)
А перед этим длинный список переменных. Адреса идут по порядку.
0
1 / 1 / 0
Регистрация: 08.05.2015
Сообщений: 225
01.05.2017, 14:23 12
Keil один раз поставил, глянул - корявая поделка, вернулся назад на гнутый Си
0
0 / 0 / 0
Регистрация: 15.04.2016
Сообщений: 237
01.05.2017, 15:46 13
Цитата Сообщение от mob7272
в Reference manual на stm32f100xx указано в пункте 2.3.1 SROM = 32K.
Какая связь между F100 и F103?

Цитата Сообщение от mob7272
Для stm32f103c8
RM сказано SROM = 96K.
Можно скрин из Reference manual где такое сказано для STM32F103C8?
Там случайно не написано что в этом МК несколько терабайт флеша частота 100 ГГц?
0
mob7272
01.05.2017, 16:45 14
Moyk

1. В указанной выше статье был рассмотрен пример конкретно на F100, а у меня F103. Поэтому связи никакой, разве только ядрышко.

2. А это скрин из RM на F103. Может я неправильно понял эту запись, буду рад разьяснению.
1 / 1 / 0
Регистрация: 08.05.2015
Сообщений: 225
01.05.2017, 16:52 15
Здесь сказано что в контроллерах stm32f10x может быть до 96кБ ОЗУ. К которому может быть 16 битный или 32-х битный доступ и начинается эта память с адреса 0x2000 0000. В микросхеме stm32f103c8 конкретно 20кБ ОЗУ
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,183
01.05.2017, 16:52 16
RM он же по несколько разных МК на одном ядре. А запись "up to 96" означает что старшие МК из этого семейства могут иметь до 96 КБ, нужно смотреть на конкретный камень который у вас в руках.
Для этого хорошо подходит CubeMX. Но не более :)

P.s. там и флеша на самом деле мегабайты ;)
0
01.05.2017, 16:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.05.2017, 16:52
Помогаю со студенческими работами здесь

Кажется спалил STM32F103C8
Случайно подал на STM32F103C8 4.6 В питание Как проверить жив ли он?

Чем заменить Stm32f103C8?
Долгое время использовал Stm32f103C8, функционально она меня устраивает, и цена была небольшой Но...

Stm32F103C8 встроенный термодатчик
Реального контроллера нет! Написал небольшой код для МК, чтобы мерить температуру , но при отладке...

STM32F103C8 SPI SDcard
Добрый вечер. Потратил сегодня весь день , но так и не нашёл рабочий пример работы карты памяти...

Keil stm32f103c8 прерывания
Здравствуйте. Прогаю AVRки на ASMе, но тут возникла необходимость чуть потыкать ARM в среде Keil +...

RTC STM32F103C8 отставание часов
На трех различных платах с установленным данным контроллером была проверена точность хода часов....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru