Я на гитхабе, в ЖЖ
STM32 новичку в ARM что к чему
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Реклама
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
[uquote="Dimon456",url="/forum/viewtopic.php?p=4322064#p4322064"]Вот линкерскрипт[/uquote]Строчка KEEP(*(.isr_vector)) ни о чём не говорит?
- Сообщения: 1849
- Зарегистрирован: Вс дек 25, 2016 08:34:54
Завершается с ошибкойVladislavS писал(а):Строчка KEEP(*(.isr_vector)) ни о чём не говорит?
..\obj\startup_gcc_stm32f030xc.o:(.isr_vector+0x0): undefined reference to `_estack'
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
[uquote="Dimon456",url="/forum/viewtopic.php?p=4322075#p4322075"]Завершается с ошибкойСделай одинаково. Либо в стартапе _eram, либо в линкерскрипте _estack.
Добавлено after 3 minutes 53 seconds:
Ведь я не зря вот тут к стартапу и линкерскрипт приложил. Они всегда парой ходят.
[/uquote]У тебя в линкерскрипте..\obj\startup_gcc_stm32f030xc.o:(.isr_vector+0x0): undefined reference to `_estack`;
Код: Выделить всё
_eram = 0x20000000 + 0x00001000;Добавлено after 3 minutes 53 seconds:
Ведь я не зря вот тут к стартапу и линкерскрипт приложил. Они всегда парой ходят.
Последний раз редактировалось VladislavS Чт ноя 17, 2022 18:07:56, всего редактировалось 1 раз.
- Сообщения: 1849
- Зарегистрирован: Вс дек 25, 2016 08:34:54
Оооо..., собралосьVladislavS писал(а):Сделай одинаково.
Спойлер
Код: Выделить всё
Program Size:
text data bss dec hex filename
5291 136 184 5611 15eb rnd_f030.elf- Реклама
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
[uquote="Dimon456",url="/forum/viewtopic.php?p=4322080#p4322080"]Оооо..., собралось[/uquote] .vectors и .isr_vectors тоже не забудь одинаково сделать.
Можешь сравнить размер прошивки со стартапом на асм? Чисто ради любопытства и немного статистики.
Можешь сравнить размер прошивки со стартапом на асм? Чисто ради любопытства и немного статистики.
- Сообщения: 1849
- Зарегистрирован: Вс дек 25, 2016 08:34:54
VladislavS, прошивки отличаются, на asmну и бинарники соответственно, на asm=5440 байт, на с=5432 байта, а если сравнивать по содержимому - то там полностью все отличается, кроме последней строки, она одинакова.
И опять же, в вашем варианте самая первая точка останова на SystemInit();, это когда отключен в debug run to main, то есть я не вижу где инициализируется оперативная память, сейчас это на каком нибудь массиве проверю.
Добавлено after 4 minutes 36 seconds:
Все увидел, вопрос отпадает, где это происходит.
Спойлер
Код: Выделить всё
Program Size:
text data bss dec hex filename
5299 136 184 5619 15f3 rnd_f030.elfИ опять же, в вашем варианте самая первая точка останова на SystemInit();, это когда отключен в debug run to main, то есть я не вижу где инициализируется оперативная память, сейчас это на каком нибудь массиве проверю.
Добавлено after 4 minutes 36 seconds:
Все увидел, вопрос отпадает, где это происходит.
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4322071#p4322071"]VladislavS, без понятия.[/uquote]Печалька.
- Сообщения: 1849
- Зарегистрирован: Вс дек 25, 2016 08:34:54
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
[uquote="Dimon456",url="/forum/viewtopic.php?p=4322091#p4322091"]VladislavS, а вот эта строчка, синим выделено, программа туда должна заходить.[/uquote]В твоём случае должна. Это инициализация глобальных (ненулевых) данных.
А вот при отладке из SRAM не должна. Так как инициализирующие данные и так уже в SRAM, зачем их копировать туда-сюда.
А вот при отладке из SRAM не должна. Так как инициализирующие данные и так уже в SRAM, зачем их копировать туда-сюда.
Последний раз редактировалось VladislavS Чт ноя 17, 2022 18:38:06, всего редактировалось 1 раз.
- Сообщения: 1849
- Зарегистрирован: Вс дек 25, 2016 08:34:54
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
[uquote="VladislavS",url="/forum/viewtopic.php?p=4322061#p4322061"]COKPOWEHEU, это действительно найдено в первом попавшемся проекте для ARМ (приведённом тут чуть выше как пример). И степень "невникания" удивала.[/uquote]
Пожалуй, сочту это комплиментом. Вроде как вы не ожидали от меня такой халтуры.
Но вообще-то, не вижу смысла уделять стартапу слишком много внимания: он выполняется единственный раз при старте камня, и даже если там накручено говнокода, по большому счету это ни на чем не скажется. Лично я к ARM'у пришел "сверху", от готового шаблона, и лезть глубоко "вниз" надобности не было: работает и ладно.
А вот с RISC-V так не повезло: не нашел шаблона, который бы просто собрался и заработал, пришлось изучать ассемблер, линкер-скрипты и прочую ядерную магию. В процессе, разумеется, тоже изрядно накосячил. Первый проект на Си у меня собрался чуть больше двух лет назад, и только на прошлой неделе я выловил грубую ошибку в линкер-скрипте.
{звуки беспалевной агитации побыть бесплатным бета-тестером}
Пожалуй, сочту это комплиментом. Вроде как вы не ожидали от меня такой халтуры.
Но вообще-то, не вижу смысла уделять стартапу слишком много внимания: он выполняется единственный раз при старте камня, и даже если там накручено говнокода, по большому счету это ни на чем не скажется. Лично я к ARM'у пришел "сверху", от готового шаблона, и лезть глубоко "вниз" надобности не было: работает и ладно.
А вот с RISC-V так не повезло: не нашел шаблона, который бы просто собрался и заработал, пришлось изучать ассемблер, линкер-скрипты и прочую ядерную магию. В процессе, разумеется, тоже изрядно накосячил. Первый проект на Си у меня собрался чуть больше двух лет назад, и только на прошлой неделе я выловил грубую ошибку в линкер-скрипте.
"Будет" это уже немного поздно: 80% уже выложено на всеобщее обозрение, можете сами проверить какие там косяки.VladislavS писал(а):Не будет подобного в курсах - замечательно.
{звуки беспалевной агитации побыть бесплатным бета-тестером}
- Сообщения: 1849
- Зарегистрирован: Вс дек 25, 2016 08:34:54
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
Чтобы сделать этот код независимым от тулчейна следеут поместить всё что до инициализации данных в SystemInit (она, вообще говоря, для этого и придумана), где-то спрятать seed на время инициализации данных (в какой-нибудь периферии) и использовать по назначению уже в main.
- Сообщения: 1849
- Зарегистрирован: Вс дек 25, 2016 08:34:54
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
[uquote="Dimon456",url="/forum/viewtopic.php?p=4322221#p4322221"]а где его спрятать?[/uquote]В каждом чипе можно найти либо специально предназначенные для хранения данных регистры, либо неиспользуемые регистры периферии, способные это делать. Проявите изобретательность, почитайте RM 
- Сообщения: 848
- Зарегистрирован: Ср авг 03, 2022 05:22:56
- Сообщения: 1849
- Зарегистрирован: Вс дек 25, 2016 08:34:54
VladislavS, я не знал что SystemInit можно было перенести в первый вызов, то есть сделать така потом в SystemInit, как вы пишите, поместить мой код, в seed сохранить, к примеру, в 32-битном регистре таймера ТИМ2 (вроде он 32-битный).
Спойлер
Код: Выделить всё
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
.
.
.- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
[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]Ну можете же, если захотите
[uquote="Dimon456",url="/forum/viewtopic.php?p=4322945#p4322945"]seed сохранить, к примеру, в 32-битном регистре таймера ТИМ2 (вроде он 32-битный).[/uquote]Ну можете же, если захотите
- Сообщения: 848
- Зарегистрирован: Ср авг 03, 2022 05:22:56
Второй раз повторяю - регистры Backup, память Buckap SRAM.
Ну и пусть топикстартер расскажет (чисто для интереса), зачем же ему понадобилась генерация случайного числа? Нужно ли одно число получить или несколько, нужно ли их получить один раз при старте или получать их периодически во время работы?
Ну и пусть топикстартер расскажет (чисто для интереса), зачем же ему понадобилась генерация случайного числа? Нужно ли одно число получить или несколько, нужно ли их получить один раз при старте или получать их периодически во время работы?


