Зачем stm32 требует самостоятельно настраивать startup.s ?
Зачем stm32 требует самостоятельно настраивать startup.s ?
Зачем stm32 требует самостоятельно настраивать запуск программы (startup.s) и почему AVR этого не требовал?
Может ли компилятор включать код запуска по умолчанию на основании флагов компиляции (gcc)? Как видимо происходит при компиляции для AVR? Если да, то как это сделать?
Или GCC не содержит в себе скриптов инициализации для всего разнообразия STM32, поэтому их надо откуда-то скачать? Либо самому писать исходя и документации чипа (что было бы странно).
Может ли компилятор включать код запуска по умолчанию на основании флагов компиляции (gcc)? Как видимо происходит при компиляции для AVR? Если да, то как это сделать?
Или GCC не содержит в себе скриптов инициализации для всего разнообразия STM32, поэтому их надо откуда-то скачать? Либо самому писать исходя и документации чипа (что было бы странно).
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Зачем stm32 требует самостоятельно настраивать startup.s
Всё зависит от стандартной библиотеки, с которой вы линкуете проект. Если в ней есть стартовый код (наверное для AVR он есть), то можно и без стартапа. Для ARM такой зоопарк чипов, что все их в библиотеку не поместишь. Поэтому, проще под каждый чип стартап иметь. Вообще, это скоре плюс, когда имеешь возможность вмешаться с самой первой исполняемой команды.
Re: Зачем stm32 требует самостоятельно настраивать startup.s
Понятно, спасибо.
А где можно взять стандартные (официальные) скрипты инициализации для всего набора stm32 ?
Как я понимаю эти скрипты находились в средах разработки от STM, но сейчас их скачивать не дают.
А где можно взять стандартные (официальные) скрипты инициализации для всего набора stm32 ?
Как я понимаю эти скрипты находились в средах разработки от STM, но сейчас их скачивать не дают.
Последний раз редактировалось ddr4 Чт авг 25, 2022 12:49:03, всего редактировалось 1 раз.
Re: Зачем stm32 требует самостоятельно настраивать startup.s
Где это требуется?ddr4 писал(а):Зачем stm32 требует самостоятельно настраивать запуск программы (startup.s)
Стартап под нужный МК должен быть в проекте, но его настраивать (модифицировать) в большинстве случаев не требуется.
Из репозитория куба например.ddr4 писал(а):А где можно взять стандартные (официальные) скрипты инициализации для всего набора stm32 ?
Или в какой-то IDE. Например в EmBitz их можно найти в архиве share\EmBitz\templates\wizard\arm\st\st.zip в папке Startup.
- >TEHb<
- Друг Кота
- Сообщения: 5723
- Зарегистрирован: Ср ноя 11, 2009 17:19:30
- Откуда: Воронеж
- Контактная информация:
Re: Зачем stm32 требует самостоятельно настраивать startup.s
Так там особо ничего и не настраивается. Там, например, обнуляется оперативная память, копируются константы из флеша в память, вот такие подобные действия. Всю периферию нужно уже в основной программе настраивать.
"Привет!" - соврал он.
Re: Зачем stm32 требует самостоятельно настраивать startup.s
Наверно потому, что это на порядок более сложный МК. Кстати, настраивать там ниче не надо, всё работает искаропки, и даже если бы этот файл вовсе не был написан заранее. Нужно всего лишь поместить в определенный адрес флеша одно 4-байное число, чтобы микроконтроллер знал, откудава (с какого адреса) ему следует начать читать программный код. Всё остальное добавляется по мере нужды. Вектора прерываний, вершина стека - это необходимый минимум. Остальное - по желанию.
Re: Зачем stm32 требует самостоятельно настраивать startup.s
Наверно потому, что это на порядок более сложный МК. Кстати, настраивать там ниче не надо, всё работает искаропки, и даже если бы этот файл вовсе не был написан заранее.
И как эта коробка называется?
Нужно всего лишь поместить в определенный адрес флеша одно 4-байное число, чтобы микроконтроллер знал, откудава (с какого адреса) ему следует начать читать программный код.
Так в stm32 же встроенный загрузчик, который по умолчанию начинает читать c 0x08000000. То есть эта_ещё_одна_функция_stm32() (чтения с адреса) как и "должная" настройка старта (которую разработчики забыли встроить в компилятор - но выдают за фичу), которая мне не нужна.
Re: Зачем stm32 требует самостоятельно настраивать startup.s
Стек значит не нужен?MLX90640 писал(а):Нужно всего лишь поместить в определенный адрес флеша одно 4-байное число, чтобы микроконтроллер знал, откудава (с какого адреса) ему следует начать читать программный код.
IDE называется. Во многих имеются пакеты с библиотеками и требуемые файлы добавляются при создании проекта.ddr4 писал(а):И как эта коробка называется?
Что находится по адресам 0x08000000 и 0x08000004?ddr4 писал(а):Так в stm32 же встроенный загрузчик, который по умолчанию начинает читать c 0x08000000.
Если думаете что исполняемый код, то ошибаетесь.
В startup.s вместе с файлом линкера как раз описано что находится по этим адресам и по следующим за ними.
Re: Зачем stm32 требует самостоятельно настраивать startup.s
IDE называется. Во многих имеются пакеты с библиотеками и требуемые файлы добавляются при создании проекта.ddr4 писал(а):И как эта коробка называется?
STM закрыла скачивание своих IDE, а скачивать скрипты старта из непонятных источников как-то не хочется.
Что находится по адресам 0x08000000 и 0x08000004?ddr4 писал(а):Так в stm32 же встроенный загрузчик, который по умолчанию начинает читать c 0x08000000.
Если думаете что исполняемый код, то ошибаетесь.
В startup.s вместе с файлом линкера как раз описано что находится по этим адресам и по следующим за ними.
Re: Зачем stm32 требует самостоятельно настраивать startup.s
Стек значит не нужен?
Его можно установить вручную, воздействуя на регистр указателя стека напрямую.
Re: Зачем stm32 требует самостоятельно настраивать startup.s
То есть в компиляторе должны быть библиотеки для всех ядер ARM, всех производителей МК и процев? Хотите чтобы компилятор весил несколько десятков терабайт?ddr4 писал(а):По идее это должно быть в компиляторе, как было в avr.
ARM это не только STM32, но и много других производителей. Причем речь не только МК - Cortex-M, но и Cortex-R и Cortex-A. https://ru.wikipedia.org/wiki/ARM_(архитектура)ddr4 писал(а):Ведь компилятор и так собирается под АRM
То есть все описание таблицы векторов прерываний, все что связано с ld файлами включать в командную строку?ddr4 писал(а):А в случае старта отличного от стандартного, включать по аргументу компилятора.
Для STM32 десятки IDE.ddr4 писал(а):STM закрыла скачивание своих IDE
Думаете в них вирусы?ddr4 писал(а):скачивать скрипты старта из непонятных источников как-то не хочется.
Не хотите узнавать, не изучайте МК.ddr4 писал(а):С STM постоянно приходится узнавать то, без чего можно было бы обойтись.
Ничего не зная, ничего не сделать! 
Что предлагаете в 0x08000000 записать? Нули? Случайные числа? А главное зачем так извращаться?MLX90640 писал(а):Его можно установить вручную, воздействуя на регистр указателя стека напрямую.

- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: Зачем stm32 требует самостоятельно настраивать startup.s
Стартап от задачи и типа МК зависит, так что - не проканает общее сделать.
Кстати, советую стартап на С (или С++ если у вас второе) написать, зачем с этим асмом сношаться?
P.S. На гитхабе есть несколько репозиториев с разными вариантами стартапов, ld-скриптов и CMSIS. Но, повторю, обычно "стандартного" не хватает и нужно свое делать (особенно в отношении ld-скрипта: чтобы хранить настройки и логи во флеш-памяти, скажем).
Кстати, советую стартап на С (или С++ если у вас второе) написать, зачем с этим асмом сношаться?
P.S. На гитхабе есть несколько репозиториев с разными вариантами стартапов, ld-скриптов и CMSIS. Но, повторю, обычно "стандартного" не хватает и нужно свое делать (особенно в отношении ld-скрипта: чтобы хранить настройки и логи во флеш-памяти, скажем).
Re: Зачем stm32 требует самостоятельно настраивать startup.s
Стартап от задачи и типа МК зависит, так что - не проканает общее сделать.
Кстати, советую стартап на С (или С++ если у вас второе) написать, зачем с этим асмом сношаться?
На AVR прокатывало. Кстати, советую стартап на С (или С++ если у вас второе) написать, зачем с этим асмом сношаться?
Да видимо придётся изобретать стартап. Просто собрать и залить как в AVR не получится. Спасибо STM за прогрессивную архитектуру. )
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: Зачем stm32 требует самостоятельно настраивать startup.s
ddr4, если не нравится - не пользуйся ARMянами. Пользуйся восьмибитками: STM8, 5051 и т.д., и т.п. Там по умолчанию ни стартап, ни линкер-скрипт не нужны, т.к. все "знает компилятор". Правда, там убогий sdcc вместо gcc… Да и производительность (+периферия) намного слабей, хотя цена не сильно-то отличается.
Кстати, если не нужно чего-то эдакого, все можно автоматизировать в Makefile: чтобы и ld-скрипт нужный подхватывался, и стартап… Только проще явно указать их.
P.S. Для всех STM32 у меня один общий стартап (нужное по #define'нам выбирается), да и ld-скрипт общий (только инклюдятся дополнительно данные о конкретном чипе: размер флеша и оперативы).
Кстати, если не нужно чего-то эдакого, все можно автоматизировать в Makefile: чтобы и ld-скрипт нужный подхватывался, и стартап… Только проще явно указать их.
P.S. Для всех STM32 у меня один общий стартап (нужное по #define'нам выбирается), да и ld-скрипт общий (только инклюдятся дополнительно данные о конкретном чипе: размер флеша и оперативы).
Re: Зачем stm32 требует самостоятельно настраивать startup.s
Я говорю о минимальном минимуме для запуска микроконтроллера. А для его запуска в работу нужен один только предзаписанный вектор - указание адреса начала исполняемого кода. А указатель стека легко пишется в регистр SP, если чо.
Снова начались споры ниачом. Один безумный кекс ляпнул какую-то ересть, и начали сопли жевать.
Снова начались споры ниачом. Один безумный кекс ляпнул какую-то ересть, и начали сопли жевать.
Re: Зачем stm32 требует самостоятельно настраивать startup.s
Пишите дальше на AVR.ddr4 писал(а):На AVR прокатывало.
Не стоит сравнивать детский трехкалесный велосипед профессиональным мотоциклом! То что прокатывает на велосипеде, не факт что сработает на мотоцикле.
А вообще в чем проблема со стартапом? Его кто-то заставляет писать? В IDE создаете проект и все требуемые файлы включая стартап и скрипт линкера в него автоматически добавляются.
Хотите все писать руками? Тогда вам прямой путь в линукс! Там таких извращенцев много!
Адрес стека находится перед адресом старта программы. Предлагаете оставить его пустым и в коде вручную записать в регистр стека? В чем смысл такого извращения?MLX90640 писал(а):Я говорю о минимальном минимуме для запуска микроконтроллера. А для его запуска в работу нужен один только предзаписанный вектор - указание адреса начала исполняемого кода.
Потому что вы бред предлагаете. Нет смысла оставлять в адресе стека мусор. Назовите хоть одну причину для чего это делать и для чего нужно нужно сейчас ТС.MLX90640 писал(а):Снова начались споры ниачом.
Ну раз вы себя считаете "безумным кексом"...MLX90640 писал(а):Один безумный кекс ляпнул какую-то ересть, и начали сопли жевать.
Вы во всем правы и можете возвращатся в палату к Наполеону!

Последний раз редактировалось Мурик Чт авг 25, 2022 16:03:40, всего редактировалось 2 раза.
Re: Зачем stm32 требует самостоятельно настраивать startup.s
Как тут любят говорить слово "бред", не разобравшись в теме... Проверить самому слабо чтоль и подумать? Лучше детально ответьте, для чего нужен стек. Тогда может быть поймете, почему его можно позднее задать вручную.
Re: Зачем stm32 требует самостоятельно настраивать startup.s
ОК помогите разобраться в теме и объясните в чем смысл оставлять в 0x08000000 неопределенное значение а потом в коде записывать в регистр SP адрес стека?
То что это в принципе возможно не означает что в этом есть практический смысл.
То что это в принципе возможно не означает что в этом есть практический смысл.
Вопрос не в этом. Зачем оставлять в 0x08000000 мусор, а после в коде записывать адрес стека? Это нелогично и не имеет смысла.MLX90640 писал(а):Тогда может быть поймете, почему его можно позднее задать вручную.
Re: Зачем stm32 требует самостоятельно настраивать startup.s
Логично/не логично, но запуску МК не мешает. И вы сами это должны понимать. Я написал о минимальном минимуме. Остальные какашки развезли вы. Зачем и для чего? Поспорить захотелось чтоль? Идите вон с женой спорьте (если есть), я не в настроении спорить.
А когда перейдете на более продвинутый уровень, то поймете, что адрес загрузки может быть не только 0х0800000. Есть вообще "экзотические" адреса типа ITCM Flash
А когда перейдете на более продвинутый уровень, то поймете, что адрес загрузки может быть не только 0х0800000. Есть вообще "экзотические" адреса типа ITCM Flash
Re: Зачем stm32 требует самостоятельно настраивать startup.s
MLX90640 писал(а):Логично/не логично, но запуску МК не мешает.
- Ты говорил что едешь из Москвы в Питер?
- Да.
- А почему билет взял на Владивосток?
- Я еду в Питер через Владивосток!
- Зачем, это же большой крюк и не имеет смысла?
- Какая разница, я же через Владивосток доберусь из Москвы в Питер!
ОК вот минимальный код мигающий светодиодом. download/file.php?id=312468MLX90640 писал(а):Я написал о минимальном минимуме.
Код: Выделить всё
#include "stm32f10x.h"
#define StackTop ((uint32_t)(0x20000000 + 20*1024))
static void Reset_Handler(void);
__attribute__((used,section(".isr_vector")))
void (*const g_pfnVectors[])(void) =
{
(void*)StackTop, // Указатель на начало стека.
Reset_Handler // Функция выполняемая при сбросе МК.
};
static void Reset_Handler(void)
{
RCC->APB2ENR |= RCC_APB2ENR_IOPCEN; // Вкл. тактирование порта GPIOC.
GPIOC->CRH |= GPIO_CRH_MODE13; // Настройка вывода PC13 как выхода.
while(1)
{
GPIOC->ODR ^= (1<<13); // Инвертирование состояния вывода PC13.
for (volatile uint32_t i=0; i<1000000; i++);
}
}
Это повод оставлять мусор в 0х0800000 и в ручную записывать адрес в SP?MLX90640 писал(а):поймете, что адрес загрузки может быть не только 0х0800000.