Galois 伪随机数生成器不适用于 Code Composer Studio 中的 16 位最大周期
Galois pseudo random number generator doen't work for 16-bit maximal-period in code composer studio
我正在使用 MSP430FR5969 微控制器和 code composer studio IDE 制作伪随机数生成器。为此,我提到了这个 wikipedia page。它适用于 8 位,但在 16 位的情况下,控件不会在 do-while 循环之后转到行,而是返回到初始化块(例如:如果我在 [=20 行放置断点=] period = 0,它命中它)。
有人可以解释这种行为吗?
这是我的代码:
#include <stdint.h>
#include <msp430fr5969.h>
int main(void)
{
uint16_t lfsr = 0xACE1; //any non-zero value is fine
uint16_t period = 0;
do
{
unsigned lsb = lfsr & 1;
lfsr >>= 1; /* Shift register */
if (lsb)
lfsr ^= 0xB400; /* taps: 16 14 13 11; characteristic polynomial: x^16 + x^14 + x^13 + x^11 + 1 */
++period;
} while(lfsr != 0xACE1); //loop until random number becomes equal to starting value
return 0;
}
谢谢!
不确定问题到底出在哪里,但我通常强制代码避免隐式提升、在一个操作中混合 int 和 unsigned、混合不同大小的操作数等
下面的代码适用于 3 个编译器,但我无法在 MSP430 上尝试它 dev.tools。输出周期为65535
想试试吗?
#include <stdint.h>
#include <stdio.h>
int main() {
const uint16_t USONE = 1U;
const uint16_t B400 = 0xB400U;
const uint16_t SEED = 0xACE1U;
uint16_t lfsr = SEED; //any non-zero value is fine
uint32_t period = 0U;
do
{
uint16_t lsb = lfsr & USONE;
lfsr >>= USONE; /* Shift register */
if (lsb)
lfsr ^= B400; /* taps: 16 14 13 11; characteristic polynomial: x^16 + x^14 + x^13 + x^11 + 1 */
++period;
printf("LFSR: %d %x\n", period, lfsr);
} while (lfsr != SEED); //loop until random number becomes equal to starting value
printf("Period: %d\n", period);
return 0;
}
输出,前 10 个值
LFSR: 57968
LFSR: 28984
LFSR: 14492
LFSR: 7246
LFSR: 3623
LFSR: 45843
LFSR: 60809
LFSR: 49860
LFSR: 24930
LFSR: 12465
最近 10 个左右的值
LFSR: 65524 c4e5
LFSR: 65525 d672
LFSR: 65526 6b39
LFSR: 65527 819c
LFSR: 65528 40ce
LFSR: 65529 2067
LFSR: 65530 a433
LFSR: 65531 e619
LFSR: 65532 c70c
LFSR: 65533 6386
LFSR: 65534 31c3
LFSR: 65535 ace1
Period: 65535
period
变量从未被读取,因此它很可能被优化掉了。
此外,微控制器没有 OS 到 return 到,因此 return 从 main()
是没有意义的。
你必须在循环之后放一些实际的代码,它应该用 period
做一些事情。 printf
的默认目标是 CCS 调试控制台,因此您可以调用它,但如果您只想在调试器中观察变量,请将最终值写入某个硬件寄存器或某个易失性变量,以便编译器被迫保留其值:
MPY = period;
快速提示,如果您在真实硬件上尝试,是否禁用了开机时自动启动的硬件看门狗?
我正在使用 MSP430FR5969 微控制器和 code composer studio IDE 制作伪随机数生成器。为此,我提到了这个 wikipedia page。它适用于 8 位,但在 16 位的情况下,控件不会在 do-while 循环之后转到行,而是返回到初始化块(例如:如果我在 [=20 行放置断点=] period = 0,它命中它)。
有人可以解释这种行为吗?
这是我的代码:
#include <stdint.h>
#include <msp430fr5969.h>
int main(void)
{
uint16_t lfsr = 0xACE1; //any non-zero value is fine
uint16_t period = 0;
do
{
unsigned lsb = lfsr & 1;
lfsr >>= 1; /* Shift register */
if (lsb)
lfsr ^= 0xB400; /* taps: 16 14 13 11; characteristic polynomial: x^16 + x^14 + x^13 + x^11 + 1 */
++period;
} while(lfsr != 0xACE1); //loop until random number becomes equal to starting value
return 0;
}
谢谢!
不确定问题到底出在哪里,但我通常强制代码避免隐式提升、在一个操作中混合 int 和 unsigned、混合不同大小的操作数等
下面的代码适用于 3 个编译器,但我无法在 MSP430 上尝试它 dev.tools。输出周期为65535
想试试吗?
#include <stdint.h>
#include <stdio.h>
int main() {
const uint16_t USONE = 1U;
const uint16_t B400 = 0xB400U;
const uint16_t SEED = 0xACE1U;
uint16_t lfsr = SEED; //any non-zero value is fine
uint32_t period = 0U;
do
{
uint16_t lsb = lfsr & USONE;
lfsr >>= USONE; /* Shift register */
if (lsb)
lfsr ^= B400; /* taps: 16 14 13 11; characteristic polynomial: x^16 + x^14 + x^13 + x^11 + 1 */
++period;
printf("LFSR: %d %x\n", period, lfsr);
} while (lfsr != SEED); //loop until random number becomes equal to starting value
printf("Period: %d\n", period);
return 0;
}
输出,前 10 个值
LFSR: 57968
LFSR: 28984
LFSR: 14492
LFSR: 7246
LFSR: 3623
LFSR: 45843
LFSR: 60809
LFSR: 49860
LFSR: 24930
LFSR: 12465
最近 10 个左右的值
LFSR: 65524 c4e5
LFSR: 65525 d672
LFSR: 65526 6b39
LFSR: 65527 819c
LFSR: 65528 40ce
LFSR: 65529 2067
LFSR: 65530 a433
LFSR: 65531 e619
LFSR: 65532 c70c
LFSR: 65533 6386
LFSR: 65534 31c3
LFSR: 65535 ace1
Period: 65535
period
变量从未被读取,因此它很可能被优化掉了。
此外,微控制器没有 OS 到 return 到,因此 return 从 main()
是没有意义的。
你必须在循环之后放一些实际的代码,它应该用 period
做一些事情。 printf
的默认目标是 CCS 调试控制台,因此您可以调用它,但如果您只想在调试器中观察变量,请将最终值写入某个硬件寄存器或某个易失性变量,以便编译器被迫保留其值:
MPY = period;
快速提示,如果您在真实硬件上尝试,是否禁用了开机时自动启动的硬件看门狗?