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;

快速提示,如果您在真实硬件上尝试,是否禁用了开机时自动启动的硬件看门狗?