Atmel AVR 汇编器时间戳计数器

Posted

技术标签:

【中文标题】Atmel AVR 汇编器时间戳计数器【英文标题】:Atmel AVR Assembler time stamp counter 【发布时间】:2013-10-01 06:10:40 【问题描述】:

大家好! 我尝试在 AVR Asm (atmega128) 上随机化数字。所以我需要在开始时初始化值并注意 asm x86 开发人员使用“rdtsc”指令。是否可以在 AVR 架构中初始化一些随机初始化值,例如 rdtsc?是否可以使用不同的初始值? 谢谢和问候。

【问题讨论】:

也许可以在这里查看我的答案:***.com/questions/10864668/… 了解一些获取随机数和/或 PRNG 种子的方法。对于您的情况(一次性种子生成),使用未初始化的 RAM 似乎是可行的。 【参考方案1】:

您可能可以使用一个不占用 CPU 时钟的计时器(因为这就是 TSC)。也就是说,这仅足以播种伪随机数生成器,并且生成的随机数不适用于密码操作。

【讨论】:

如果你能解释如何获取cpu时间,请做。 这并不是真正的 CPU 时间——但是 AVR 上的计数器使用从 CPU 时钟派生的时钟运行。与 x86 上的 TSC 的主要区别在于 TSC 寄存器更长且不会溢出。 我也有想法将随机数保存到 eeprom,然后从那里获取。但它可能会很慢,我害怕。 如果你想避免重复,保存和恢复随机种子是很好的(例如,这是你在游戏中使用的东西)。您的随机数生成器应该适合您的应用程序。 我认为你想要两者的混合——EEPROM 存储,这样你的 PRNG 就拥有超过 16 位的状态,以及硬件(定时器或 ADC)不可预测的东西。请注意,这对于密码学来说仍然是不够的。【参考方案2】:

我明白了,您知道,但再次强调,您不能使用任何计时器/计数器值作为随机数生成器。您只能将其用作伪随机算法种子数的来源。

为了做到这一点,您需要一个可以快速连续计数的计时器/计数器,以及实际充当随机事件生成器的人工。

没有人工交互,不可能使用计时器或计数器获取随机数种子。

在计算机中,人类随机选择程序启动的时刻。

计数器实际上并不那么重要。对它的唯一要求是运行得比人类反应时间快得多。几千赫兹是可接受的频率。这样,您可以使用一些定时器,配置为尽可能快的频率,甚至可以在每个主程序循环上增加一个简单的软件计数器(当然,如果程序足够快的话)。

如果您的设备支持实时时钟,请使用它。这样您将获得更好的随机化,因为即使整个设备关闭,RTC 也会运行。

这样,人工提供的开关 ON 将提供随机时刻事件。

在所有情况下,用于生成伪随机数的算法都比种子生成方法重要得多。

所以,make 尽可能简单和愚蠢,专注于伪随机数生成器。

【讨论】:

感谢您的回复。我使用 atmega128,只需要一个随机算法源(线性同余生成器)。在我填充源之前,没有人机交互,所以使用计时器是没有用的。 atmega128 也没有实时时钟。如果我错了,请纠正我。 @IvanVavilov 你是对的,如果没有人工交互,使用计时器和计数器是没有用的。那里有许多随机数生成器算法。甚至在***中查看此类示例。顺便说一句,您可以尝试使用 ATMega 的 ADC 转换器,连接到一些白噪声发生器以获得真正的随机数(尽管我认为大多数好的伪随机数发生器会给您更好的分布)。这完全取决于您的项目目标。

以上是关于Atmel AVR 汇编器时间戳计数器的主要内容,如果未能解决你的问题,请参考以下文章

我正在用 atmel 编写 AVR 程序集,但“调用”指令不起作用

如何延迟 avr 微控制器的组装?

爱特梅尔 AVR 反汇编程序

Atmel studio 汇编:8 位数字的平方根

为啥 Solaris 汇编器生成的机器代码与这里的 GNU 汇编器不同?

使用AVR-GCC的switch语句的汇编代码