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

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

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

Сообщение Dimon456 »

Чип F030, функция
Спойлер

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

uint16_t rnd(uint16_t limit){

	uint32_t result = rand();

	return (uint16_t)(((uint64_t)(result) * limit) / (RAND_MAX));	// где RAND_MAX = 0x7fffffff 
}
Вопрос, как эффективнее выполнить 64-битные вычисления?, не устраивает 2кило лишнего кода.
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

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

Сообщение Eddy_Em »

Dimon456, rand() - твой? Тогда почему бы сразу его не сделать uint16_t и по модулю брать остаток?
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

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

Сообщение Dimon456 »

Eddy_Em писал(а):rand() - твой?
Нет, это библиотечная функция stdlib.h
В arm-gcc используется 32-битный rand(), а в avr-gcc 16-битный.

При включении чипа, я сканирую содержимое оперативной памяти с просчетом CRC, где-то так
Спойлер

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

 	char *ptr = (void*)RAMSTART;
 	uint32_t seed=0;
 	
	for(uint16_t i=0; i < (RAMEND-RAMSTART-1); i++){
		seed += CRC_32BitsCompute(ptr++);
	}
	srand(seed);
Последний раз редактировалось Dimon456 Пн ноя 14, 2022 22:25:13, всего редактировалось 1 раз.
Аватара пользователя
MLX90640
Опытный кот
Сообщения: 848
Зарегистрирован: Ср авг 03, 2022 05:22:56

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

Сообщение MLX90640 »

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

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

Сообщение Dimon456 »

MLX90640, если взять uint64_t и заменить на uint32_t то получается размер 5157 байт (здесь еще вывод на индикатор LCD и прочие), а при uint64_t - 7265 байт. В чем может быть проблема?
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

Компилятор? Формула не должна столько брать.

PS: На IAR разница между 32 и 64 всего 180 байт.
PPS: На GCC 572
a797945
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

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

Сообщение a797945 »

Dimon456, какая задача у функции rnd(limit)?
я разглядел только прорежевание результатов генератора (обнуление), а для этого может достаточно делить на 80000000h ? чего я не догоняю?
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

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

Сообщение Dimon456 »

Задача у функции rnd(limit) в пределах какого диапазона считать случайное число.
К примеру
x = rnd(255); и
y = rnd(10);
В основной программе используется и то и другое.
a797945 писал(а):а для этого может достаточно делить на 80000000h
Было бы хорошо, но "бы" мешает.
RAND_MAX = 0x7fffffff задано жестко в библиотеке stdlib.h и видимо связано как-то с самой функцией rand().
Я пробовал так делать
Спойлер

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

return (uint16_t)((uint32_t)((uint32_t)(result>>16) * limit) / (RAND_MAX>>16));
x = rnd(255); но иногда результат выходит за диапазон 0---255.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4320576#p4320576"]Задача у функции rnd(limit) в пределах какого диапазона считать случайное число.[/uquote] :facepalm: Тык! И еще тык!
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

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

Сообщение Eddy_Em »

Dimon456, вот тебе рандом:

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

uint32_t getRand(){
    uint32_t r = 0;
    for(int i = 0; i < 16; ++i){
        r <<= 1;
        r |= (getADCval(0) & 1);
        r <<= 1;
        r |= (getADCval(1) & 1);
    }
    r ^= r << 13;
    r ^= r >> 17;
    r ^= r << 5;
    return r;
}
(каналы - внутренний термометр и напруга). Нормальный псевдорандом получается. Всяко лучше "фирменного". Если требуется задать границы, просто берешь остаток от деления на нужное число (жаль, что в STM32F0 деление софтовое).
Вот, например, здесь я вычисляю случайную начальную скорость мячика:

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

    xspeed[Nballs] = ((int)getRand()) % SPEEDMAX;
    yspeed[Nballs] = ((int)getRand()) % SPEEDMAX;
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

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

Сообщение Dimon456 »

VladislavS, феноменально, за чем нужно было изобретать велосипед с ... не пойму.
А как мне эффективнее про сканировать оперативную память?
У меня startup вот из этого состоит
Спойлер

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

  .section .text.Reset_Handler
  .weak Reset_Handler
  .type Reset_Handler, %function
Reset_Handler:
  ldr   r0, =_eram
  mov   sp, r0          /* set stack pointer */

/* Copy the data segment initializers from flash to SRAM */
  movs r1, #0
  b LoopCopyDataInit

CopyDataInit:
  ldr r3, =_sidata
  ldr r3, [r3, r1]
  str r3, [r0, r1]
  adds r1, r1, #4

LoopCopyDataInit:
  ldr r0, =_sdata
  ldr r3, =_edata
  adds r2, r0, r1
  cmp r2, r3
  bcc CopyDataInit
  ldr r2, =_sbss
  b LoopFillZerobss
/* Zero fill the bss segment. */
FillZerobss:
  movs r3, #0
  str  r3, [r2]
  adds r2, r2, #4


LoopFillZerobss:
  ldr r3, = _ebss
  cmp r2, r3
  bcc FillZerobss

/* Call the clock system intitialization function.*/
    bl  SystemInit
    
/* Call the application's entry point.*/
  bl main
Нужно и CRC сконфигурировать, и до момента пока он ее (память) не обнулил.
Eddy_Em, getADCval, это уж когда совсем делать не чего будет.
Аватара пользователя
MLX90640
Опытный кот
Сообщения: 848
Зарегистрирован: Ср авг 03, 2022 05:22:56

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

Сообщение MLX90640 »

Сканировать SRAM? А что там предполагаете увидеть?
Тот участок асма это не сканирование, а копирование из флеша константных значений и обнуление неинициализованных глобальных и статич переменных.

Если хотите проверить целостность ячеек ОЗУ, то записывайте один из шаблонов и считывайте его. Однако, при запуске на дефолтной частоте это будет небыстро
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

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

Сообщение Dimon456 »

MLX90640 писал(а):Сканировать SRAM? А что там предполагаете увидеть?
А вы, что, не поняли что я пытаюсь сделать?

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

srand(seed);
MLX90640 писал(а):Тот участок асма это не сканирование, а копирование из флеша константных значений и обнуление неинициализованных глобальных и статич переменных.
Вот именно, пока не произошло копирование из флеша .... эти ячейки имеют рандомное значение и оно всегда разное. Можете сами убедиться.
Другой вопрос, где srand() хранит свое значение и в какой момент нужно произвести это сканирование и запись в srand() нового значения что бы дальнейшая инициализация глобальных и статич переменных не повлияла на новую запись в srand()?
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

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

Сообщение Eddy_Em »

Dimon456, единственный надежный способ получить более-менее похожие на правду псевдослучайные числа, если нет аппаратного блока, - это использовать АЦП. А дурной библиотечный rand даст всегда абсолютно одну и ту же последовательность. Советую проверить.
И да, инициализировать его условной CRC оперативки смысла особого нет, т.к. всегда есть шанс, что два и более включения дадут полностью одинаковое содержимое оной! Вот после софт-резета вполне возможно, что там какие-нибудь хвосты стека останутся. Но и смысл тогда всю оперативку проверять - проверяй только стек.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

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

Сообщение Dimon456 »

Eddy_Em, да ну, проверим? На том куске кода который у меня есть, на реальном железе.
1 включение
Спойлер

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

56
210
222
109
210
27
99
28
66
22
2 включение
Спойлер

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

49
152
183
232
225
47
178
223
243
128
3 включение
Спойлер

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

206
131
188
119
163
105
5
51
188
193
Думаю, хватит.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4320737#p4320737"]за чем нужно было изобретать велосипед с ... не пойму.[/uquote]Это называется "X Y проблема". Вместо того чтобы спросить как сформировать случайные числа из диапазона (проблема X) вы пытаетесь научить Cortex-M0 64-битному делению.

[uquote="Dimon456",url="/forum/viewtopic.php?p=4320737#p4320737"]А как мне эффективнее про сканировать оперативную память?[/uquote]Возьмите старатп на Си и делайте там что угодно.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4320794#p4320794"]На том куске кода который у меня есть, на реальном железе.[/uquote]
А если сброс по ресету или собаке?
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25121
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

Сообщение КРАМ »

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

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

Сообщение MLX90640 »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4320784#p4320784"]]Вот именно, пока не произошло копирование из флеша .... эти ячейки имеют рандомное значение и оно всегда разное. Можете сами убедиться.[/uquote]
Я знаю это, чего ж убеждаться. Однако, есть у стмок некоторые модели, в который аппаратно может обнутьсяться SRAM. Обычно это дополнительный блок SRAM. И еще есть даже аппаратный контроль целостности (ЕСС) SRAM.
Спрашиваете, где алгоритм проверки хранит свои переменные? Ну как где - в регистрах ядра Кортекс, у него там десяток штук свободных найдется, этого хватит для реализации алгоритма проверки.
Независимо от того, на каком языке написан стартап, на асме, Си или С++, программная проверка ячеек - это полумера, да и еще медленная. ECC же контролирует целостность постоянно во время работы.

А так же в F4xx и других есть генератор случайных чисел как раз на диоде, на принципе теплового шума и измерении напряжения шума. Для проверки целостности памяти он вообще нафик не нужен. В ячейку памяти (сразу по 4 байта) пишется шаблон 0xAAAAAAAA, считывается и сравнивается с исходным, затем инвертируется чтобы получилось 0x55555555 и снова пишется и считывается с проверкой.
Последний раз редактировалось MLX90640 Вт ноя 15, 2022 17:20:15, всего редактировалось 1 раз.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25121
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

Сообщение КРАМ »

[uquote="MLX90640",url="/forum/viewtopic.php?p=4320818#p4320818"]как раз на диоде, на принципе теплового шума[/uquote]
На диоде (обычно это стабилитрон) генерируется ДРОБОВОЙ, а не тепловой, шум. Тепловой - на активном сопротивлении (резисторе, например).
Ответить

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