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

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

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

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

Раз си не мог освоить, может asm освою.
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4321824#p4321824"]Так что случайное число надо брать до инициализации ОЗУ в startup[/uquote]
Не страдайте ерундой, полноценного генератора случайных чисел так не получится. И "случайное" значение в оперативке хоть и случайно, но в общем предсказуемо. Представьте, что контроллер у вас пролежал без питания 5 лет, вы его включили. В одних ячейках памяти оказался 0, в других 1. Просто потому что при производстве вот так распределились параметры транзисторов. Если вы выключите питание еще на 5 лет, думаете этот технологический разброс куда-то денется?
Нет, разумеется, есть и влияние случайности, когда вам повезло и транзисторы получились практически одинаковыми, и выбор стабильного состояния будет зависеть от температуры, электромагнитных наводок и прочего.
Но готовы ли вы гарантировать, что в Самом Ответственном Приборе, отправленном Самому Главному Заказчику случится именно так?
Dimon456 писал(а):А где про этот asm можно прочитать? Гугл ни чего конкретного не выдает.
Интересует назначение регистров r0 r1 r2 и сколько их там, какие я могу использовать какие нет, в каких регистрах возврат по команде return сохраняется, они вообще 32-битные или как?
Ядро Cortex M3 компании ARM. Полное руководство / Джозеф Ю; пер. санrл. А. В. Евстифеева.
Мартин М. Инсайдерское руководство по STM32
Я, правда, их от начала до конца не читал (для моих задач хватило имеющихся знаний и гуглежа конкретных вопросов. Да и в ассемблере для ARM я не разбираюсь), но вроде нормальные книги.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4321824#p4321824"]Раз си не мог освоить[/uquote]Можете объяснить, какие трудности вызывает простое действие - удалить из проекта один файл и добавить другой?
Опытный кот
Аватара пользователя
Сообщения: 848
Зарегистрирован: Ср авг 03, 2022 05:22:56

Сообщение MLX90640 »

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

Неизвестно, зачем автору вопроса сия вещь. Для одной выборки или для серии. Я в этом примере просто показал степень случайности чисел в SRAM после включения питания. Если беспокоить, что стартовый код секции bss затрет SRAM, то берите выборку в конце SRAM, отступив немного назад. Конец её используется под стек и в начале работы SystemInit не перезаписывается
Реклама
Эиком - электронные компоненты и радиодетали
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

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

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

Сообщение MLX90640 »

Dimon456, найдите поиском функцию SystemInit и в её начале напишите чтение одного байта из адреса на пару десятков байт назад от конца SRAM. Там ничего не затирается и не перезапичывается в на еле раьоты
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4321957#p4321957"]COKPOWEHEU, а мне и не нужен полноценного генератора случайных чисел, библиотечный rnd имеет какую-то периодичность[/uquote]
Вам Эдди уже подсказал хорошее решение: в качестве зерна берете 8, 16, 32 (или сколько хотите) раз измеренный младший бит АЦП. Хоть с датчика температуры, хоть с ИОНа, хоть внешний. Потом обычным алгоритмическим рандомом.
Разумеется, любой детерминированный алгоритм, в том числе библиотечный rand(), будет повторяться - для этого к нему подмешивают действительно случайную энтропию - с того же АЦП.
Как минимум, это лучше потому, что из АЦП энтропию вы можете собирать хоть до посинения, тогда как начальное значение памяти фиксируется при подаче питания и потом самопроизвольно не меняется.
Dimon456 писал(а):Может где-то этот startup.S прописывается
Я забыл, что у вас за камень. Если f103 или l151, можете взять мои шаблоны:
f103
l151
Dimon456 писал(а):К сожалению в моей ИДЕ это не доступно
IDE не нужна. Запускаете make, оно все собирает.
Если интересно, у меня планируется (а по большей части уже реализован) целый курс по ассемблеру с переходом на Си, правда на RISC-V. И да, там все делается в консоли и текстовом редакторе.
Программированию по роликам учиться, конечно, нельзя, но даже общая информация об устройстве контроллера это тоже неплохо.
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4321957#p4321957"]VladislavS, я так и сделал, одно удалил, другое добавил и получил идеальную прошивку.[/uquote]Ну вы же не мой старатап взяли, а Eddy_Em. Это я вам про __VECTOR_TABLE_ATTRIBUTE, рассказывал, линкерскрипты приложил. А он вам просто свинью подложил

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

vector_table_t vector_table __attribute__ ((section(".vector_table")))
[uquote="Dimon456",url="/forum/viewtopic.php?p=4321957#p4321957"]Может где-то этот startup.S прописывается и просто так startup.С не добавить.[/uquote]Не придумывайте фигни.

[uquote="Dimon456",url="/forum/viewtopic.php?p=4321957#p4321957"]К сожалению в моей ИДЕ это не доступно, а переходить на другой как-то не хочется.[/uquote]Я такого даже представить не могу. Название IDE ?

[uquote="Dimon456",url="/forum/viewtopic.php?p=4321957#p4321957"]Единственный вариант, пока не начал изучать книжку по asm, в startup.S удалить набор asm инструкций и сделать тупо вызов на функции в startup.С, но это как вариант, еще не пробовал.[/uquote]Может просто разобраться раз и навсегда как работают компилятор и линкер? Тогда название IDE не будет вообще принципиально.

Добавлено after 8 minutes 32 seconds:
[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4321975#p4321975"]целый курс по ассемблеру с переходом на Си, правда на RISC-V.[/uquote]Дело, конечно, хорошее, но вот с такими перлами лучше не обучать.

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

void SystemInit(void){} //зачем-то используется в gcc. Ну и пусть, мне оно не мешает
Добавлено after 4 minutes 7 seconds:
[uquote="MLX90640",url="/forum/viewtopic.php?p=4321971#p4321971"]Dimon456, найдите поиском функцию SystemInit и в её начале напишите чтение одного байта из адреса на пару десятков байт назад от конца SRAM. Там ничего не затирается и не перезапичывается в на еле раьоты[/uquote]У него в стартапе SystemInit вызывается после инициализации сегментов данных. Закладываться, что она ничего не упорядочила уже, я бы не стал.
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

VladislavS, никому я свинью не подкладывал! У меня все работает.
А если кто-то вместо gcc всякую дичь пользует, то это исключительно его половые трудности.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4322008#p4322008"]VladislavS, никому я свинью не подкладывал! У меня все работает.[/uquote]Ключевое тут "у тебя". Ты же несовместимое решение другим подсовываешь. Ну и получается "идеальная прошивка" или свинья подкладная.

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4322008#p4322008"]А если кто-то вместо gcc всякую дичь пользует, то это исключительно его половые трудности.[/uquote]Так мы про GCC и ведём речь. Я же вижу по стартапу что за коспилятор у Dimon456.

Dimon456, упростил стартап, чтобы не было зависимости от CMSIS. Тебе останется только проверить чтобы секция ".vectors" называлась одинаков в линкерскрипте и в стартапе.
startup_gcc_stm32f030xc.c
(4.55 КБ) 66 скачиваний
PS: Хотя нет, для __set_MSP подключить CMSIS таки надо будет, но до отладки из SRAM такими темпами ещё лалеко... :(
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

[uquote="VladislavS",url="/forum/viewtopic.php?p=4322004#p4322004"]Дело, конечно, хорошее, но вот с такими перлами лучше не обучать.
void SystemInit(void){} //зачем-то используется в gcc. Ну и пусть, мне оно не мешает[/uquote]
Подскажите, в каком файле из курса по RISC-V вы это нашли?
Потому что я подобное помню разве что в проектах на ARM, где я нашел непонятно чей проект, и допиливал уже его, не особо вникая в стартап и прочее. Ну так ARM'у я и не пытаюсь обучать - всегда говорю, что я тамошний ассемблер не знаю.
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

VladislavS, ну и почему у меня секция с векторами никуда не девается, а у него "потерялась"?
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

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

Добавлено after 43 seconds:
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4322060#p4322060"]VladislavS, ну и почему у меня секция с векторами никуда не девается, а у него "потерялась"?[/uquote]Хотелось бы услышать твою версию. Я то ответ знаю.
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

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")
}
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

VladislavS, без понятия.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4322064#p4322064"]Вот линкерскрипт[/uquote]Строчка KEEP(*(.isr_vector)) ни о чём не говорит?
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

VladislavS писал(а):Строчка KEEP(*(.isr_vector)) ни о чём не говорит?
Завершается с ошибкой
..\obj\startup_gcc_stm32f030xc.o:(.isr_vector+0x0): undefined reference to `_estack'
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4322075#p4322075"]Завершается с ошибкой
..\obj\startup_gcc_stm32f030xc.o:(.isr_vector+0x0): undefined reference to `_estack`;
[/uquote]У тебя в линкерскрипте

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

_eram = 0x20000000 + 0x00001000;
Сделай одинаково. Либо в стартапе _eram, либо в линкерскрипте _estack.

Добавлено after 3 minutes 53 seconds:
Ведь я не зря вот тут к стартапу и линкерскрипт приложил. Они всегда парой ходят.
Последний раз редактировалось VladislavS Чт ноя 17, 2022 18:07:56, всего редактировалось 1 раз.
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

VladislavS писал(а):Сделай одинаково.
Оооо..., собралось
Спойлер

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

Program Size:
      text	   data	    bss	    dec	    hex	filename
      5291	    136	    184	   5611	   15eb	rnd_f030.elf
Сейчас в железе проверю, будет работать иль нет.
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4322080#p4322080"]Оооо..., собралось[/uquote] .vectors и .isr_vectors тоже не забудь одинаково сделать.

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

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