Зачем stm32 требует самостоятельно настраивать startup.s ?

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
MLX90640
Опытный кот
Сообщения: 848
Зарегистрирован: Ср авг 03, 2022 05:22:56

Re: Зачем stm32 требует самостоятельно настраивать startup.s

Сообщение MLX90640 »

Это повод лично для вас углубить свои знания и потратить время более продуктивно, чем спорить тут о том, о чем вас вообще не спрашивали.
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Зачем stm32 требует самостоятельно настраивать startup.s

Сообщение Мурик »

Все ясно - слив засчитан. Можете возвращаться в палату с Наполеоном.
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Зачем stm32 требует самостоятельно настраивать startup.s

Сообщение Reflector »

в чем практический смысл записать 0 или любое другое значение в нулевой элемент массива g_pfnVectors, а после в коде присвоить регистру SP адрес стека?

В записи 0 смысла никакого, в коде SP присваивается адрес стека при выполнении кода из RAM, т.к. в этом случае флеш может быть чистым.
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Зачем stm32 требует самостоятельно настраивать startup.s

Сообщение Мурик »

Reflector писал(а):В записи 0 смысла никакого
Я про тоже.
Тем более что ТС на данном этапе менять адрес стека нет необходимости.

Reflector писал(а):при выполнении кода из RAM, т.к. в этом случае флеш может быть чистым.
Но ведь при этом таблицу векторов прерываний тоже нужно перенести в ОЗУ записью в регистр VTOR.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Зачем stm32 требует самостоятельно настраивать startup.s

Сообщение VladislavS »

Спасибо STM за прогрессивную архитектуру. )
STM то тут причём? Архитектуру ядер разработала (или скупила, не знаю) ARM. А вообще, странное желание иметь в поекте код, который непонятно что там делает. А стартап никто не заставляет писать самому, в 99% случаев он уже есть либо в IDE, либо на сайте производителя чипа.

Сейчас плотненько сижу на Microblaze. Компилятор GCC, в стандартной библиотеке стартовый код есть и конфигурируется в среде разработки в зависимости от того какие модули процессора имплементированы. А хотелось бы как для ARM в исходниках. Чисто теоретически, можно самому написать, но времени желко.

Добавлено after 1 minute 8 seconds:
нужно перенести в ОЗУ записью в регистр VTOR.
Не у всех ядер есть VTOR.

Добавлено after 2 minutes 1 second:
в коде SP присваивается адрес стека при выполнении кода из RAM
Это самое простое решение, если отладчик сам этого не делает. Многие сами это деелают, а остальные можно научить.
Аватара пользователя
ddr4
Потрогал лапой паяльник
Сообщения: 352
Зарегистрирован: Ср дек 30, 2020 23:05:29

Re: Зачем stm32 требует самостоятельно настраивать startup.s

Сообщение ddr4 »

Стартап от задачи и типа МК зависит, так что - не проканает общее сделать. Кстати, советую стартап на С (или С++ если у вас второе) написать, зачем с этим асмом сношаться?

Да Си мне нравится больше, чем ассемблер :) .
Да в Эклипсе в блинк-проекте есть "startup.c", лежит в папке newlib, пишут что "Следующие файлы расширяют или заменяют некоторые функции библиотеки newlib". Сама newlib как я понимаю, присутствует как стандартная библиотека компилятора arm-none-eabi-gcc.
Допустим startup.c создаёт некую стандартную структуру исполняемого файла, но непонятно, зачем в startup.c присутствуют функции инициализации hardware, неужели инициализировать устройства нельзя в коде программы, а также инициализация статических констукторов и деструкторов, зачем мне дестукторы если я пишу на Си?

Как я понял в sections.ld
ENTRY(_start) - это запуск функции _start из startup.c. Почему линкер сразу не может указать вход как ENTRY(main) ? Также _exit в микроконтроллера не вызывается, так как МК постоянно работает в цикле, то зачем он вообще? Не ставят же return 0; в AVR main().

То есть startup только очищает память в стандартных секциях, копирует код программы из Flash в RAM и передаёт управление на main() ?

Наверное всё это попытка дать программисту больше контроля, но это пугает после AVR )
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Зачем stm32 требует самостоятельно настраивать startup.s

Сообщение VladislavS »

Да Си мне нравится больше, чем ассемблер :) .
Ну так пользуйтесь, кто запрещает.

Да в Эклипсе в блинк-проекте есть "startup.c"
Посмотрите VisualGDB. Там под весь STM32 есть неплохие стартапы на С. Если назовёте камень, с которым работаете, могу собственного изготовления подкинуть прикольный.


но непонятно, зачем в startup.c присутствуют функции инициализации hardware, неужели инициализировать устройства нельзя в коде программы,
А теперь представьте, что у вас сегмегты данных, стек или куча находятся в области RAM, которая при включении питания выключена? Или код выполняется из QSPI, которую ещё надо инициализировать для этого.

а также инициализация статических констукторов и деструкторов, зачем мне дестукторы если я пишу на Си?
В том то и прелесть иметь стартап в исходном коде, что вы можете убрать то что вам не надо. Уверены, что нет конструкторов - del. Хотя, ходят слухи, что они и на православном С бывают :)

Почему линкер сразу не может указать вход как ENTRY(main) ?
Потому что перед переходом на main надо сделать много разного колдунства, чтобы всё правильно работало.

Так как _exit в микроконтроллера не вызывается, так как МК постоянно работает в цикле, то зачем он вообще?
А в чём проблема? Кто-то запрещает убрать её вызов? А пустышку линкер и сам выкинет.

То есть startup только очищает память в стандартных секциях, копирует код программы в RAM и передаёт управление на main() и больше ничего?
Ну почему же. Для кортексов в стартапе определяется таблица векторов прерываний, адрес стека, вызов функции инициализации железа. А уже в зависимости от стандартной библиотеки может быть ручная инициализация сегментов данных (занулением и копированием), вызов конструкторов, как это сделано в GCC.

В IAR и Keil, например, инициализацию данных, вызов конструкторов и переход на main делает стандартная библиотека. Такой себе почти AVR-вариант, но таблица векторов прерываний в стартапе.

но это пугает после AVR )
Возьмите готовый и не парьтесь. Какая разница, скомпилирован он заранее в стандартной библиотеке или при сборке проекта.
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Зачем stm32 требует самостоятельно настраивать startup.s

Сообщение Мурик »

VladislavS писал(а):Не у всех ядер есть VTOR.
Тогда не получится запустить программу из ОЗУ использующую прерывания.
Насколько помню VTOR нет в M0 (в них много чего нет), а в остальных должен быть.

VladislavS писал(а):Возьмите готовый и не парьтесь.
Да я уже дал ссылку на бесплатную IDE где все настроено и необходимые файлы добавляются при создании проекта. Но ТС непонятно что ждет...
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Зачем stm32 требует самостоятельно настраивать startup.s

Сообщение VladislavS »

VladislavS писал(а):Не у всех ядер есть VTOR.
Тогда не получится запустить программу из ОЗУ использующую прерывания.
А мужики то не знают. Ремапят память и отлаживают.
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Зачем stm32 требует самостоятельно настраивать startup.s

Сообщение Мурик »

Адрес начала таблицы векторов прерываний находится в VTOR.
Если регистра нет, то как сообщить МК где таблица прерываний?
Или предлагаете в ОЗУ размещать только код, а таблицу держать вначале флеша?
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Зачем stm32 требует самостоятельно настраивать startup.s

Сообщение VladislavS »

Таблица векторов при включении находится и работает по адресу 0. Можете посмотреть содержимое VTOR при старте из флэш. Никаких 0х08000000 там, внезапно, не будет. При старте из флэш адреса 0х08000000 отражаются на 0. Именно поэтому прерывания работают из флэш. А теперь делаем финт ушами - ремапим SRAM 0х20000000 на 0 и получаем работающую из SRAM таблицу векторов. Без всяких VTOR. Без VTOR нельзя сдвинуть таблицу прерываний с нуля, но можно поставить в ноль другую память. Не думал, что это объяснять надо.
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Зачем stm32 требует самостоятельно настраивать startup.s

Сообщение Мурик »

Не знаю на счет всех моделей STM32F0, но с теми что имел дело, имеют только один вывод BOOT и для того чтобы отзеркалить ОЗУ в начало адресного пространства, нужно изменить бит конфигурации который заместо BOOT1. То есть все чуть сложнее чем переставить перемычку и так или иначе нужно изменять данные во флеше.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Зачем stm32 требует самостоятельно настраивать startup.s

Сообщение VladislavS »

Не знаю на счет всех моделей STM32F0, но с теми что имел дело
Ну это же просто. Открываем RM и смотрим биты MEM_MODE в SYSCFG_CFGR1. Без всяких перемычек и конфигурационных бит. Даже проще чем в VTOR записать.

Код: Выделить всё

#ifdef __DEBUG_SRAM__
 // REMAP SRAM -> 0x00000000 для отладки в SRAM
  SYSCFG->CFGR1 = _VAL2FLD(SYSCFG_CFGR1_MEM_MODE,3);
#endif
Аватара пользователя
ddr4
Потрогал лапой паяльник
Сообщения: 352
Зарегистрирован: Ср дек 30, 2020 23:05:29

Re: Зачем stm32 требует самостоятельно настраивать startup.s

Сообщение ddr4 »

ddr4, если не нравится - не пользуйся ARMянами. Пользуйся восьмибитками: STM8, 5051 и т.д., и т.п. Там по умолчанию ни стартап, ни линкер-скрипт не нужны, т.к. все "знает компилятор". Правда, там убогий sdcc вместо gcc… Да и производительность (+периферия) намного слабей, хотя цена не сильно-то отличается.

ddr4 писал(а):На AVR прокатывало.
Пишите дальше на AVR.
Не стоит сравнивать детский трехкалесный велосипед профессиональным мотоциклом! То что прокатывает на велосипеде, не факт что сработает на мотоцикле.

Я с радостью продолжал бы пользоваться AVR (ардуино) и меня там устраивает абсолютно всё, но не хватает RAM. Дип-чипы старших моделей Атмега644/1284 стоят в 3 раза дороже плат stm32. Приобрести платы на stm8 тоже нет возможности, а smd-чипы без разводки без надобности. Поэтому решил попробовать плату с stm32.
То что цена Атмега644/1284 в 3 раза выше stm32, видимо свидетельствует о их популярности, которая продиктована в том числе и простотой программирования. Которая включает в себя и отсутствие необходимости наблюдать низкоуровневые коды компилятора (в случае makefile-проекта) :)).
Я согласен что эти коды стандартны и ничем не мешают, однако наблюдать их приходится, а раз наблюдаешь, то появляется желание понять что это и как работает - а с этим проблема, которая вызывает отрицательные эмоции :) . Возможно в том числе, чтобы не видеть эти низкоуровневые скрипты люди используют Атмеги :) .
Понятно что можно использовать всякие Арудины-IDE в том числе и для stm32, но мне хотелось бы как и раньше, иметь небольшой makefile-проект на Си.
У меня прошивка Ардуины использует 2 кБ RAM на Атмега328, но приходится усложнять код, чтобы он влазил. И с целью упрощения кода и приобреталась stm32, однако быстрого упрощения не получилось. И когда наблюдаешь кучу стандартных обёрток (hal, cmsis, newlib) и startup.s + скрипты компоновщика, а hex - блинка весит 27кБ (больше чем hex большой прошивки на Ардуино) - это неприятно удивляет. Это ведь только начало, даже код не начал переводить, а уже столько (пусть и мнимых) проблем. :)
Аватара пользователя
>TEHb<
Друг Кота
Сообщения: 5723
Зарегистрирован: Ср ноя 11, 2009 17:19:30
Откуда: Воронеж
Контактная информация:

Re: Зачем stm32 требует самостоятельно настраивать startup.s

Сообщение >TEHb< »

В ардуине (та, которая IDE) от АВРов не видно почти ничего.
"Привет!" - соврал он.
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

Re: Зачем stm32 требует самостоятельно настраивать startup.s

Сообщение Eddy_Em »

появляется желание понять что это и как работает - а с этим проблема, которая вызывает отрицательные эмоции

Тогда лучше в это дело не лезть, если от него лишь отрицательные эмоции!
Если хочешь разобраться - разбирайся досконально, не хочешь — пользуйся абдуриной или всякими калокубами. Кстати, тебе, наверное, калокуб понравится: там вообще думать не нужно и тупо мышей щелкать...
hex - блинка весит 27кБ

Мегарукожопие. ЕМНИП, самый короткий блинк на STM32 — около 40 байт. Если добавить USB и минимальный функционал (период там изменять) - будет 4кБ. Чтобы родилось 27кБ, нужно сильно постараться.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Аватара пользователя
ddr4
Потрогал лапой паяльник
Сообщения: 352
Зарегистрирован: Ср дек 30, 2020 23:05:29

Re: Зачем stm32 требует самостоятельно настраивать startup.s

Сообщение ddr4 »

[uquote="ddr4",url="/forum/viewtopic.php?p=4278263#p4278263"]Да в Эклипсе в блинк-проекте есть "startup.c"
Посмотрите VisualGDB. Там под весь STM32 есть неплохие стартапы на С. Если назовёте камень, с которым работаете, могу собственного изготовления подкинуть прикольный.[/uquote]
Камень stm32f401. Я уже попривык к стартапу из Эклипса. В принципе понятно, если не считать описания секций в "sections.ld".
Спасибо, да было бы интересно посмотреть на прикольные стартапы.
Ниже тоже старт, но не понятно как он работает. Как мне кажется он ничего не инициализирует (RAM), применяется в примере блинк stm32f4.

startup_stm32f4.asm

Код: Выделить всё

global burn2_main
global burn2_systick

dd 0x20000678  
; ; Установить указатель стека
dd 0x08000009  
; Вектор сброса, и прыжок на адрес 8
B burn2_main          
; Ветка в main (это фактически в векторе прерываний ??)
align 4
dd 0x0  
; undefined 0xc
dd 0x0  
; undefined 0x10
dd 0x0  
; undefined 0x14
dd 0x0  
; undefined 0x18
dd 0x0  
; undefined 0x1c
dd 0x0  
; undefined 0x20
dd 0x0  
; undefined 0x24
dd 0x0  
; undefined 0x28
dd 0x0  
; undefined 0x2c
dd 0x0  
; undefined 0x30
dd 0x0  
; undefined 0x34
dd 0x0  
; undefined 0x38
dd 0x08000041  
; undefined 0x3c --> systick, метод на данный момент, чтобы перейти к следующему адресу
B burn2_systick  
; неопределённая 0x40 инструкция прыжка к systick обработчику
align 4

; сброс обработчиков:
dd 0x0  ; undefined
dd 0x0  
; undefined
dd 0x0  
; undefined
dd 0x0  
; undefined
dd 0x0  
; undefined
dd 0x0  
; undefined
dd 0x0  
; undefined
dd 0x0  
; undefined
dd 0x0  
; undefined
dd 0x0  
; undefined
dd 0x0  
; undefined
dd 0x0  
; undefined


stm32f4.mmap

Код: Выделить всё

MEMORY flash LOCATION=0x08000000 SIZE=0x10000 {
 SECTION(code)
}

MEMORY ram LOCATION=0x20000000 SIZE=0x10000 {
 SECTION(data)
}


Для кортексов в стартапе определяется таблица векторов прерываний, адрес стека, вызов функции инициализации железа.

Про векторы прерываний в стартапе сказано только следующее:
Чем это может быть полезно сказать сложно. :)

Код: Выделить всё

 /* Определение секций */

SECTIONS
{
    /*
     * Для устройств Cortex-M начало кода запуска хранится в
     * разделе .isr_vector, который идет во FLASH.
     */
    .isr_vector : ALIGN(4)
    {
        FILL(0xFF)
       
        __vectors_start = ABSOLUTE(.) ;
        __vectors_start__ = ABSOLUTE(.) ; /* STM спец.определение */
        KEEP(*(.isr_vector))        /* Векторы прерываний */
       
      KEEP(*(.cfmconfig))         /* слова конфигурации Freescale */   
           
        /*
          * Этот раздел создан для удобства, чтобы хранить
          * код запуска в начале области флэш-памяти, надеясь, что
          * это повысит читабельность листинга.
        */

        *(.after_vectors .after_vectors.*)   /* Стартап код и ISR */

    } >FLASH
Аватара пользователя
MLX90640
Опытный кот
Сообщения: 848
Зарегистрирован: Ср авг 03, 2022 05:22:56

Re: Зачем stm32 требует самостоятельно настраивать startup.s

Сообщение MLX90640 »

Про векторы прерываний очень хорошо сказано в Programming Manual на серию Кортексов. Для M3, стоящем в F401 - это будет документ PM0214, стр.40. Табличка с определенной структурой, в которую помещаются значения адресов, по которым располагается тот или иной исполняемый код, вызываемый при наступлении события прерыавния/исключения. Вторая строчка таблички от начала называется reset Vector и она хранит адрес, по которому расположена первая инструкция исполняемого кода, вызываемая сразу после события сброса МК и которая будет выполнена первой инструкцией. Помещаться эта инструкция может в любом месте из диапазона разрешенных адресов для исполнения инструкций.
Скрипи загрузчика .ld размещает секции в бинарном файле по определенным адресам. Табличка векторов тоже может быть помещена не в самом начале флеша, а где-нить в другом месте, о чем нужно дополнительно сообщить микроконтроллеру в коде программы, изменив VTOR (там, где он есть).
Именно скрипт .ld будет ответственнен за то, что куда кладется на этапе компиляции
В зависимости от конкретной IDE и кмопилятора, состав и синтаксис файлов запуска может отличаться.
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Зачем stm32 требует самостоятельно настраивать startup.s

Сообщение Мурик »

VladislavS писал(а):Открываем RM и смотрим биты MEM_MODE в SYSCFG_CFGR1. Без всяких перемычек и конфигурационных бит.
Спасибо. Видимо я невнимательно читал RM на F0...

ddr4 писал(а):Понятно что можно использовать всякие Арудины-IDE в том числе и для stm32, но мне хотелось бы как и раньше, иметь небольшой makefile-проект на Си.
Вы в ArduinoIDE писали makefile?

ddr4 писал(а):И когда наблюдаешь кучу стандартных обёрток (hal, cmsis, newlib) и startup.s + скрипты компоновщика, а hex - блинка весит 27кБ
Что-то неправильно делаете.
Блинк 48 байт download/file.php?id=312468
Примерно килобайт на SPL download/file.php?id=318144

ddr4 писал(а):Ниже тоже старт, но не понятно как он работает. Как мне кажется он ничего не инициализирует (RAM), применяется в примере блинк stm32f4.
Посмотрите стартап из архива и сравните с тем что у вас.
Вложения
startup_stm32f401xe.zip
(3.94 КБ) 65 скачиваний
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Зачем stm32 требует самостоятельно настраивать startup.s

Сообщение VladislavS »

Про векторы прерываний в стартапе сказано только следующее:

Код: Выделить всё

 /* Определение секций */

SECTIONS
{
    /*
     * Для устройств Cortex-M начало кода запуска хранится в
     * разделе .isr_vector, который идет во FLASH.
     */
    .isr_vector : ALIGN(4)
    {
        FILL(0xFF)
       
        __vectors_start = ABSOLUTE(.) ;
        __vectors_start__ = ABSOLUTE(.) ; /* STM спец.определение */
        KEEP(*(.isr_vector))        /* Векторы прерываний */
       
      KEEP(*(.cfmconfig))         /* слова конфигурации Freescale */   
           
        /*
          * Этот раздел создан для удобства, чтобы хранить
          * код запуска в начале области флэш-памяти, надеясь, что
          * это повысит читабельность листинга.
        */

        *(.after_vectors .after_vectors.*)   /* Стартап код и ISR */

    } >FLASH
Вы путаете конфигурационный файл (скрипт) линкера и стартап. Первое это правила размещения кода и данных в памяти. Приведённый вами фрагмент рассказывает линкеру куда разместить таблицу. Стартап же это код и данные (та же таблица векторов), которые компилируются компилятором.
Ответить

Вернуться в «ARM»