Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Re: STM32 новичку в ARM что к чему

Чт ноя 17, 2022 10:13:09

MLX90640, учитывайте что, сколько там в вашем примере используется ОЗУ?, 20 байт?, то есть остальное ОЗУ не инициализировано в startup.
Сколько у вас там всего ОЗУ?, 8 килобайт?, а если в основной программе вы используете какой нибудь массив как раз на эти 8 килобайт, то startup у вас эти 8 килобайт нулями затерет или что там у вас будет.
Так что случайное число надо брать до инициализации ОЗУ в startup, но это в лучшем случае, в худшем попробовать сразу в mainе, все равно startup же не полностью инициализирует ОЗУ, может стек там не трогает или еще что.

Добавлено after 31 minute 49 seconds:
А где про этот asm можно прочитать? Гугл ни чего конкретного не выдает.
Интересует назначение регистров r0 r1 r2 и сколько их там, какие я могу использовать какие нет, в каких регистрах возврат по команде return сохраняется, они вообще 32-битные или как?

Раз си не мог освоить, может asm освою.

Re: STM32 новичку в ARM что к чему

Чт ноя 17, 2022 10:21:42

Так что случайное число надо брать до инициализации ОЗУ в startup

Не страдайте ерундой, полноценного генератора случайных чисел так не получится. И "случайное" значение в оперативке хоть и случайно, но в общем предсказуемо. Представьте, что контроллер у вас пролежал без питания 5 лет, вы его включили. В одних ячейках памяти оказался 0, в других 1. Просто потому что при производстве вот так распределились параметры транзисторов. Если вы выключите питание еще на 5 лет, думаете этот технологический разброс куда-то денется?
Нет, разумеется, есть и влияние случайности, когда вам повезло и транзисторы получились практически одинаковыми, и выбор стабильного состояния будет зависеть от температуры, электромагнитных наводок и прочего.
Но готовы ли вы гарантировать, что в Самом Ответственном Приборе, отправленном Самому Главному Заказчику случится именно так?
Dimon456 писал(а):А где про этот asm можно прочитать? Гугл ни чего конкретного не выдает.
Интересует назначение регистров r0 r1 r2 и сколько их там, какие я могу использовать какие нет, в каких регистрах возврат по команде return сохраняется, они вообще 32-битные или как?

Ядро Cortex M3 компании ARM. Полное руководство / Джозеф Ю; пер. санrл. А. В. Евстифеева.
Мартин М. Инсайдерское руководство по STM32
Я, правда, их от начала до конца не читал (для моих задач хватило имеющихся знаний и гуглежа конкретных вопросов. Да и в ассемблере для ARM я не разбираюсь), но вроде нормальные книги.

Re: STM32 новичку в ARM что к чему

Чт ноя 17, 2022 10:33:47

Раз си не мог освоить
Можете объяснить, какие трудности вызывает простое действие - удалить из проекта один файл и добавить другой?

Re: STM32 новичку в ARM что к чему

Чт ноя 17, 2022 12:28:56

Dimon456,
Если смотрели код, то видели, что выборка из области размером 8 кило велась из середины 20-килобайтной ОЗУ.
Но как я показал, случайность чисел после подачи питания имеет хреновую случайность на длинных очередях.

Неизвестно, зачем автору вопроса сия вещь. Для одной выборки или для серии. Я в этом примере просто показал степень случайности чисел в SRAM после включения питания. Если беспокоить, что стартовый код секции bss затрет SRAM, то берите выборку в конце SRAM, отступив немного назад. Конец её используется под стек и в начале работы SystemInit не перезаписывается

Re: STM32 новичку в ARM что к чему

Чт ноя 17, 2022 14:15:59

COKPOWEHEU, а мне и не нужен полноценного генератора случайных чисел, библиотечный rnd имеет какую-то периодичность, ведь не случайно взяты эти "магические" числа (где-то код rnd приводили).
И совершенно не важно, что там будет через 5 лет и как там эти транзисторы "лягут".

VladislavS, я так и сделал, одно удалил, другое добавил и получил идеальную прошивку.
Может где-то этот startup.S прописывается и просто так startup.С не добавить.
К сожалению в моей ИДЕ это не доступно, а переходить на другой как-то не хочется.
Единственный вариант, пока не начал изучать книжку по asm, в startup.S удалить набор asm инструкций и сделать тупо вызов на функции в startup.С, но это как вариант, еще не пробовал.

Re: STM32 новичку в ARM что к чему

Чт ноя 17, 2022 14:35:03

Dimon456, найдите поиском функцию SystemInit и в её начале напишите чтение одного байта из адреса на пару десятков байт назад от конца SRAM. Там ничего не затирается и не перезапичывается в на еле раьоты

Re: STM32 новичку в ARM что к чему

Чт ноя 17, 2022 14:44:25

COKPOWEHEU, а мне и не нужен полноценного генератора случайных чисел, библиотечный rnd имеет какую-то периодичность

Вам Эдди уже подсказал хорошее решение: в качестве зерна берете 8, 16, 32 (или сколько хотите) раз измеренный младший бит АЦП. Хоть с датчика температуры, хоть с ИОНа, хоть внешний. Потом обычным алгоритмическим рандомом.
Разумеется, любой детерминированный алгоритм, в том числе библиотечный rand(), будет повторяться - для этого к нему подмешивают действительно случайную энтропию - с того же АЦП.
Как минимум, это лучше потому, что из АЦП энтропию вы можете собирать хоть до посинения, тогда как начальное значение памяти фиксируется при подаче питания и потом самопроизвольно не меняется.
Dimon456 писал(а):Может где-то этот startup.S прописывается
Я забыл, что у вас за камень. Если f103 или l151, можете взять мои шаблоны:
f103
l151
Dimon456 писал(а):К сожалению в моей ИДЕ это не доступно

IDE не нужна. Запускаете make, оно все собирает.
Если интересно, у меня планируется (а по большей части уже реализован) целый курс по ассемблеру с переходом на Си, правда на RISC-V. И да, там все делается в консоли и текстовом редакторе.
Программированию по роликам учиться, конечно, нельзя, но даже общая информация об устройстве контроллера это тоже неплохо.

Re: STM32 новичку в ARM что к чему

Чт ноя 17, 2022 16:00:50

VladislavS, я так и сделал, одно удалил, другое добавил и получил идеальную прошивку.
Ну вы же не мой старатап взяли, а Eddy_Em. Это я вам про __VECTOR_TABLE_ATTRIBUTE, рассказывал, линкерскрипты приложил. А он вам просто свинью подложил
Код:
vector_table_t vector_table __attribute__ ((section(".vector_table")))


Может где-то этот startup.S прописывается и просто так startup.С не добавить.
Не придумывайте фигни.

К сожалению в моей ИДЕ это не доступно, а переходить на другой как-то не хочется.
Я такого даже представить не могу. Название IDE ?

Единственный вариант, пока не начал изучать книжку по asm, в startup.S удалить набор asm инструкций и сделать тупо вызов на функции в startup.С, но это как вариант, еще не пробовал.
Может просто разобраться раз и навсегда как работают компилятор и линкер? Тогда название IDE не будет вообще принципиально.

Добавлено after 8 minutes 32 seconds:
целый курс по ассемблеру с переходом на Си, правда на RISC-V.
Дело, конечно, хорошее, но вот с такими перлами лучше не обучать.
Код:
void SystemInit(void){} //зачем-то используется в gcc. Ну и пусть, мне оно не мешает


Добавлено after 4 minutes 7 seconds:
Dimon456, найдите поиском функцию SystemInit и в её начале напишите чтение одного байта из адреса на пару десятков байт назад от конца SRAM. Там ничего не затирается и не перезапичывается в на еле раьоты
У него в стартапе SystemInit вызывается после инициализации сегментов данных. Закладываться, что она ничего не упорядочила уже, я бы не стал.

Re: STM32 новичку в ARM что к чему

Чт ноя 17, 2022 16:08:18

VladislavS, никому я свинью не подкладывал! У меня все работает.
А если кто-то вместо gcc всякую дичь пользует, то это исключительно его половые трудности.

Re: STM32 новичку в ARM что к чему

Чт ноя 17, 2022 16:19:45

VladislavS, никому я свинью не подкладывал! У меня все работает.
Ключевое тут "у тебя". Ты же несовместимое решение другим подсовываешь. Ну и получается "идеальная прошивка" или свинья подкладная.

А если кто-то вместо gcc всякую дичь пользует, то это исключительно его половые трудности.
Так мы про GCC и ведём речь. Я же вижу по стартапу что за коспилятор у Dimon456.

Dimon456, упростил стартап, чтобы не было зависимости от CMSIS. Тебе останется только проверить чтобы секция ".vectors" называлась одинаков в линкерскрипте и в стартапе.
startup_gcc_stm32f030xc.c
(4.55 KiB) Скачиваний: 38


PS: Хотя нет, для __set_MSP подключить CMSIS таки надо будет, но до отладки из SRAM такими темпами ещё лалеко... :(

Re: STM32 новичку в ARM что к чему

Чт ноя 17, 2022 17:30:11

Дело, конечно, хорошее, но вот с такими перлами лучше не обучать.
void SystemInit(void){} //зачем-то используется в gcc. Ну и пусть, мне оно не мешает

Подскажите, в каком файле из курса по RISC-V вы это нашли?
Потому что я подобное помню разве что в проектах на ARM, где я нашел непонятно чей проект, и допиливал уже его, не особо вникая в стартап и прочее. Ну так ARM'у я и не пытаюсь обучать - всегда говорю, что я тамошний ассемблер не знаю.

Re: STM32 новичку в ARM что к чему

Чт ноя 17, 2022 17:37:03

VladislavS, ну и почему у меня секция с векторами никуда не девается, а у него "потерялась"?

Re: STM32 новичку в ARM что к чему

Чт ноя 17, 2022 17:38:31

COKPOWEHEU, это действительно найдено в первом попавшемся проекте для ARМ (приведённом тут чуть выше как пример). И степень "невникания" удивала. Не будет подобного в курсах - замечательно.

Добавлено after 43 seconds:
VladislavS, ну и почему у меня секция с векторами никуда не девается, а у него "потерялась"?
Хотелось бы услышать твою версию. Я то ответ знаю.

Re: STM32 новичку в ARM что к чему

Чт ноя 17, 2022 17:39:35

VladislavS писал(а):упростил стартап,
Пока так же собирается с 0.
VladislavS писал(а):секция ".vectors" называлась одинаков в линкерскрипте и в стартапе.
Вот линкерскрипт
Спойлер
Код:
OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
/* Internal Memory Map*/
MEMORY
{
   rom (rx)  : ORIGIN = 0x08000000, LENGTH = 0x00008000
   ram (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00001000
}

_eram = 0x20000000 + 0x00001000;
SECTIONS
{
   .text :
   {
      KEEP(*(.isr_vector))
      *(.text*)
      
      KEEP(*(.init))
      KEEP(*(.fini))
      
      /* .ctors */
      *crtbegin.o(.ctors)
      *crtbegin?.o(.ctors)
      *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
      *(SORT(.ctors.*))
      *(.ctors)
      
      /* .dtors */
      *crtbegin.o(.dtors)
      *crtbegin?.o(.dtors)
      *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
      *(SORT(.dtors.*))
      *(.dtors)
      
      *(.rodata*)
      
      KEEP(*(.eh_fram e*))
   } > rom
   
   .ARM.extab :
   {
      *(.ARM.extab* .gnu.linkonce.armextab.*)
   } > rom
   
   . = ALIGN(8);   
   __exidx_start = .;
   .ARM.exidx :
   {
      *(.ARM.exidx* .gnu.linkonce.armexidx.*)
   } > rom
   . = ALIGN(8);   
   __exidx_end = .;
   __etext = .;
   
   /* _sidata is used in coide startup code */
   _sidata = __etext;
   
   .data : AT (__etext)
   {
      __data_start__ = .;
      
      /* _sdata is used in coide startup code */
      _sdata = __data_start__;
      
      *(vtable)
      *(.data*)
      
      . = ALIGN(4);
      /* preinit data */
      PROVIDE_HIDDEN (__preinit_array_start = .);
      KEEP(*(.preinit_array))
      PROVIDE_HIDDEN (__preinit_array_end = .);
      
      . = ALIGN(4);
      /* init data */
      PROVIDE_HIDDEN (__init_array_start = .);
      KEEP(*(SORT(.init_array.*)))
      KEEP(*(.init_array))
      PROVIDE_HIDDEN (__init_array_end = .);
      
      . = ALIGN(4);
      /* finit data */
      PROVIDE_HIDDEN (__fini_array_start = .);
      KEEP(*(SORT(.fini_array.*)))
      KEEP(*(.fini_array))
      PROVIDE_HIDDEN (__fini_array_end = .);
      
      KEEP(*(.jcr*))
      . = ALIGN(4);
      /* All data end */
      __data_end__ = .;
      
      /* _edata is used in coide startup code */
      _edata = __data_end__;
   } > ram
   
   .bss :
   {
      . = ALIGN(4);
      __bss_start__ = .;
      _sbss = __bss_start__;
      *(.bss*)
      *(COMMON)
      . = ALIGN(4);
      __bss_end__ = .;
      _ebss = __bss_end__;
   } > ram
      
   .heap (COPY):
   {
      . = ALIGN(4);
      __end__ = .;
      _end = __end__;
      end = __end__;
      *(.heap*)
      __HeapLimit = .;
   } > ram
   
   /* .stack_dummy section doesn't contains any symbols. It is only
   * used for linker to calculate size of stack sections, and assign
   * values to stack symbols later */
   .co_stack (NOLOAD):
   {
      . = ALIGN(8);
      *(.co_stack .co_stack.*)
   } > ram
   
   /* Set stack top to end of ram , and stack limit move down by
   * size of stack_dummy section */
   __StackTop = ORIGIN(ram ) + LENGTH(ram );
   __StackLimit = __StackTop - SIZEOF(.co_stack);
   PROVIDE(__stack = __StackTop);
   
   /* Check if data + heap + stack exceeds ram  limit */
   ASSERT(__StackLimit >= __HeapLimit, "region ram  overflowed with stack")
}

Re: STM32 новичку в ARM что к чему

Чт ноя 17, 2022 17:50:32

VladislavS, без понятия.

Re: STM32 новичку в ARM что к чему

Чт ноя 17, 2022 17:55:53

Вот линкерскрипт
Строчка KEEP(*(.isr_vector)) ни о чём не говорит?

Re: STM32 новичку в ARM что к чему

Чт ноя 17, 2022 17:58:10

VladislavS писал(а):Строчка KEEP(*(.isr_vector)) ни о чём не говорит?
Завершается с ошибкой
..\obj\startup_gcc_stm32f030xc.o:(.isr_vector+0x0): undefined reference to `_estack'

Re: STM32 новичку в ARM что к чему

Чт ноя 17, 2022 18:06:26

Завершается с ошибкой
..\obj\startup_gcc_stm32f030xc.o:(.isr_vector+0x0): undefined reference to `_estack`;
У тебя в линкерскрипте
Код:
_eram = 0x20000000 + 0x00001000;
Сделай одинаково. Либо в стартапе _eram, либо в линкерскрипте _estack.

Добавлено after 3 minutes 53 seconds:
Ведь я не зря вот тут к стартапу и линкерскрипт приложил. Они всегда парой ходят.
Последний раз редактировалось VladislavS Чт ноя 17, 2022 18:07:56, всего редактировалось 1 раз.

Re: STM32 новичку в ARM что к чему

Чт ноя 17, 2022 18:07:39

VladislavS писал(а):Сделай одинаково.
Оооо..., собралось
Спойлер
Код:
Program Size:
      text      data       bss       dec       hex   filename
      5291       136       184      5611      15eb   rnd_f030.elf
Сейчас в железе проверю, будет работать иль нет.

Re: STM32 новичку в ARM что к чему

Чт ноя 17, 2022 18:11:16

Оооо..., собралось
.vectors и .isr_vectors тоже не забудь одинаково сделать.

Можешь сравнить размер прошивки со стартапом на асм? Чисто ради любопытства и немного статистики.
Ответить