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

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Собутыльник Кота
Аватара пользователя
Сообщения: 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 тоже не забудь одинаково сделать.

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

Сообщение Dimon456 »

VladislavS, прошивки отличаются, на asm
Спойлер

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

Program Size:					
		text	   data	    bss	    dec	    hex		filename
		5299		136		184		5619	15f3	rnd_f030.elf
ну и бинарники соответственно, на asm=5440 байт, на с=5432 байта, а если сравнивать по содержимому - то там полностью все отличается, кроме последней строки, она одинакова.

И опять же, в вашем варианте самая первая точка останова на SystemInit();, это когда отключен в debug run to main, то есть я не вижу где инициализируется оперативная память, сейчас это на каком нибудь массиве проверю.

Добавлено after 4 minutes 36 seconds:
Все увидел, вопрос отпадает, где это происходит.
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4322071#p4322071"]VladislavS, без понятия.[/uquote]Печалька.
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

VladislavS, а вот эта строчка, синим выделено, программа туда должна заходить.
СпойлерИзображение
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4322091#p4322091"]VladislavS, а вот эта строчка, синим выделено, программа туда должна заходить.[/uquote]В твоём случае должна. Это инициализация глобальных (ненулевых) данных.
А вот при отладке из SRAM не должна. Так как инициализирующие данные и так уже в SRAM, зачем их копировать туда-сюда.
Последний раз редактировалось VladislavS Чт ноя 17, 2022 18:38:06, всего редактировалось 1 раз.
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

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

Сообщение COKPOWEHEU »

[uquote="VladislavS",url="/forum/viewtopic.php?p=4322061#p4322061"]COKPOWEHEU, это действительно найдено в первом попавшемся проекте для ARМ (приведённом тут чуть выше как пример). И степень "невникания" удивала.[/uquote]
Пожалуй, сочту это комплиментом. Вроде как вы не ожидали от меня такой халтуры.
Но вообще-то, не вижу смысла уделять стартапу слишком много внимания: он выполняется единственный раз при старте камня, и даже если там накручено говнокода, по большому счету это ни на чем не скажется. Лично я к ARM'у пришел "сверху", от готового шаблона, и лезть глубоко "вниз" надобности не было: работает и ладно.
А вот с RISC-V так не повезло: не нашел шаблона, который бы просто собрался и заработал, пришлось изучать ассемблер, линкер-скрипты и прочую ядерную магию. В процессе, разумеется, тоже изрядно накосячил. Первый проект на Си у меня собрался чуть больше двух лет назад, и только на прошлой неделе я выловил грубую ошибку в линкер-скрипте.
VladislavS писал(а):Не будет подобного в курсах - замечательно.
"Будет" это уже немного поздно: 80% уже выложено на всеобщее обозрение, можете сами проверить какие там косяки.
{звуки беспалевной агитации побыть бесплатным бета-тестером}
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

VladislavS, встроить код несложно было
Спойлер

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

void __attribute__((naked, noreturn)) Reset_Handler()
{
#ifdef __DEBUG_SRAM__
  __set_MSP((uint32_t)&_estack);
#endif

  SystemInit();

  CRC_Config();

	char *ptr = (void*)RAMSTART;
	uint32_t seed=0;
	for(uint16_t i=0; i < (RAMEND-RAMSTART-1); i++){
		seed += CRC_32BitsCompute(ptr++);
	}

#ifndef __DEBUG_SRAM__
  extern uint32_t _sidata[], _sdata[], _edata[];
  for (volatile uint32_t *pSrc = _sidata, *pDst = _sdata; pDst != _edata; *pDst ++= *pSrc++) ;
#endif

  extern uint32_t _sbss[], _ebss[];
  for (volatile uint32_t *pDst = _sbss; pDst != _ebss; *pDst ++= 0) ; // Zero -> BSS

  srand(seed);

  main();
}
Одним словом, СПАСИБО.
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Чтобы сделать этот код независимым от тулчейна следеут поместить всё что до инициализации данных в SystemInit (она, вообще говоря, для этого и придумана), где-то спрятать seed на время инициализации данных (в какой-нибудь периферии) и использовать по назначению уже в main.
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

SystemInit вот сюда перекидывается
Спойлер

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

void SystemInit1 (void)
{    
  /* Set HSION bit */
  RCC->CR |= (uint32_t)0x00000001;

#if defined (STM32F0XX_MD) || defined (STM32F030X8)
  /* Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE and MCOSEL[2:0] bits */
  RCC->CFGR &= (uint32_t)0xF8FFB80C;
#else
  /* Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE, MCOSEL[2:0], MCOPRE[2:0] and PLLNODIV bits */
  RCC->CFGR &= (uint32_t)0x08FFB80C;
#endif /* STM32F0XX_MD or STM32F030X8 */
  
  /* Reset HSEON, CSSON and PLLON bits */
  RCC->CR &= (uint32_t)0xFEF6FFFF;

  /* Reset HSEBYP bit */
  RCC->CR &= (uint32_t)0xFFFBFFFF;

  /* Reset PLLSRC, PLLXTPRE and PLLMUL[3:0] bits */
  RCC->CFGR &= (uint32_t)0xFFC0FFFF;

  /* Reset PREDIV1[3:0] bits */
  RCC->CFGR2 &= (uint32_t)0xFFFFFFF0;

  /* Reset USARTSW[1:0], I2CSW, CECSW and ADCSW bits */
  RCC->CFGR3 &= (uint32_t)0xFFFFFEAC;

  /* Reset HSI14 bit */
  RCC->CR2 &= (uint32_t)0xFFFFFFFE;

  /* Disable all interrupts */
  RCC->CIR = 0x00000000;

  /* Configure the System clock frequency, AHB/APBx prescalers and Flash settings */
  SetSysClock();
}
VladislavS писал(а):где-то спрятать seed на время инициализации данных
а где его спрятать?
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4322221#p4322221"]а где его спрятать?[/uquote]В каждом чипе можно найти либо специально предназначенные для хранения данных регистры, либо неиспользуемые регистры периферии, способные это делать. Проявите изобретательность, почитайте RM :)
Опытный кот
Аватара пользователя
Сообщения: 848
Зарегистрирован: Ср авг 03, 2022 05:22:56

Сообщение MLX90640 »

Backup, backup SRAM
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

VladislavS, я не знал что SystemInit можно было перенести в первый вызов, то есть сделать так
Спойлер

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

Reset_Handler:
  ldr   r0, =_eram
  mov   sp, r0          /* set stack pointer */

/* Call the clock system intitialization function.*/
    bl  SystemInit
	
/* Copy the data segment initializers from flash to SRAM */
  movs r1, #0
  b LoopCopyDataInit
  .
  .
  .
а потом в SystemInit, как вы пишите, поместить мой код, в seed сохранить, к примеру, в 32-битном регистре таймера ТИМ2 (вроде он 32-битный).
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4322945#p4322945"]я не знал что SystemInit можно было перенести в первый вызов[/uquote]Не только можно, но и нужно. Именно там его место.

[uquote="Dimon456",url="/forum/viewtopic.php?p=4322945#p4322945"]seed сохранить, к примеру, в 32-битном регистре таймера ТИМ2 (вроде он 32-битный).[/uquote]Ну можете же, если захотите :)
Опытный кот
Аватара пользователя
Сообщения: 848
Зарегистрирован: Ср авг 03, 2022 05:22:56

Сообщение MLX90640 »

Второй раз повторяю - регистры Backup, память Buckap SRAM.
Ну и пусть топикстартер расскажет (чисто для интереса), зачем же ему понадобилась генерация случайного числа? Нужно ли одно число получить или несколько, нужно ли их получить один раз при старте или получать их периодически во время работы?
Ответить

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