Счетчик меток времени Atmel AVR Assembler

Всем добрый день! Я пытаюсь рандомизировать числа на AVR Asm (atmega128). Поэтому мне нужно инициализировать значение в начале и отметить, что разработчики asm x86 используют инструкцию «rdtsc». Возможно ли инициализировать какое-то случайное значение инициализации, такое как rdtsc в архитектуре AVR? Можно ли использовать другое значение инициализации? Спасибо и привет.


person Ivan Vavilov    schedule 01.10.2013    source источник
comment
Возможно, взгляните на мой ответ здесь: title="можно ли генерировать случайные числа с помощью физических датчиков">stackoverflow.com/questions/10864668/ для некоторых способов получения случайных чисел и/или семян для PRNG. В вашем случае (однократное создание начального числа) использование неинициализированной оперативной памяти кажется жизнеспособным.   -  person JimmyB    schedule 02.10.2013


Ответы (2)


Вероятно, вы можете использовать таймер, работающий от тактовой частоты ЦП (потому что это и есть TSC). Тем не менее, этого достаточно только для заполнения генератора псевдослучайных чисел, а сгенерированные случайные числа не подходят для криптографических операций.

person Simon Richter    schedule 01.10.2013
comment
Если вы можете объяснить, как получить процессорное время, пожалуйста, сделайте это. - person Ivan Vavilov; 01.10.2013
comment
На самом деле это не время процессора - счетчики на AVR, однако, работают с часами, полученными из часов процессора. Основное отличие от TSC на x86 заключается в том, что регистр TSC длиннее и не переполняется. - person Simon Richter; 01.10.2013
comment
Также у меня есть идея сохранить случайное число в eeprom, а затем получить его оттуда. Но это может быть медленно, я боюсь. - person Ivan Vavilov; 01.10.2013
comment
Сохранение и восстановление случайных чисел хорошо, если вы хотите избежать повторений (например, это то, что вы использовали бы в игре). Ваш генератор случайных чисел должен быть адаптирован к вашему приложению. - person Simon Richter; 01.10.2013
comment
Вы правы, я могу сохранить и восстановить текущее случайное число из eeprom, чтобы предотвратить повторение, но я хочу избежать использования eeprom. Если этого не сделать, каждый сброс микроконтроллера будет выдавать один и тот же набор случайных чисел. - person Ivan Vavilov; 01.10.2013
comment
Я думаю, вам нужна смесь обоих - хранилище EEPROM, чтобы ваш PRNG был заполнен более чем 16 битами состояния, и чем-то непредсказуемым из аппаратного обеспечения (таймер или АЦП). Имейте в виду, что этого недостаточно для криптографии. - person Simon Richter; 01.10.2013

Я вижу, вы это знаете, но, чтобы еще раз подчеркнуть, вы не можете использовать какое-либо значение таймера/счетчика в качестве генератора случайных чисел. Вы можете использовать его только как источник начального числа псевдослучайного алгоритма.

Чтобы сделать это, вам нужен таймер/счетчик, который считает быстро и непрерывно, и человек, который фактически работает как генератор случайных событий.

Без участия человека невозможно получить начальное число случайных чисел с помощью таймера или счетчика.

В компьютерах человек рандомизирует момент запуска программы.

Счетчик на самом деле не так важен. Единственное требование к нему - бежать намного быстрее, чем время реакции человека. Несколько килогерц - приемлемая частота. Таким образом, вы можете использовать, например, некоторые таймеры, настроенные на максимально возможную частоту, или даже простой программный счетчик, увеличивающийся на каждый основной цикл программы (конечно, если программа достаточно быстрая).

Если ваше устройство поддерживает часы реального времени, используйте их. Таким образом, вы получите лучшую рандомизацию, потому что RTC работает, даже если все устройство выключено.

Таким образом, включенный человеком переключатель обеспечит событие случайного момента.

Во всех случаях алгоритм, который вы будете использовать для генерации псевдослучайных чисел, гораздо важнее, чем метод генерации начальных чисел.

Итак, сделайте как можно проще и глупее и сконцентрируйтесь на генераторе псевдослучайных чисел.

person johnfound    schedule 01.10.2013
comment
Спасибо за ответ. Я использую atmega128, и мне нужен только источник случайного алгоритма (линейный конгруэнтный генератор). До того момента, как я заливаю исходники, человеческого взаимодействия нет, поэтому работать с таймером бесполезно. Также у atmega128 нет часов реального времени. Если я ошибаюсь, поправьте меня. - person Ivan Vavilov; 01.10.2013
comment
@IvanVavilov Вы правы, если нет человеческого взаимодействия, использование таймеров и счетчиков бесполезно. Существует множество алгоритмов генератора случайных чисел. Даже посмотрите на википедию для таких примеров. Кстати, вы можете попробовать использовать преобразователь АЦП ATMega, подключенный к какому-нибудь генератору белого шума, чтобы получить настоящие случайные числа (хотя я полагаю, что большинство хороших генераторов псевдослучайных чисел дадут вам лучшее распределение). Все зависит от цели вашего проекта. - person johnfound; 01.10.2013