Генератор псевдослучайных чисел Галуа не работает в течение 16-битного максимального периода в студии композитора кода

Я использую микроконтроллер MSP430FR5969 с IDE Studio Composer Code для создания генератора псевдослучайных чисел. Я ссылался на эту страницу википедии для этого. Он отлично работает с 8-битным, но в случае 16-битного, элемент управления не переходит на строки после цикла do-while, а вместо этого возвращается к блоку инициализации (например: если я помещаю точку останова в строку uint16_t 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;
}

Спасибо!

3 ответа

Решение

Подсказка: если вы пробуете это на реальном оборудовании, вы отключили аппаратный сторожевой таймер, который автоматически запускается при включении питания?

period переменная никогда не читается, поэтому она может быть оптимизирована. Кроме того, микроконтроллер не имеет ОС для возврата, поэтому возвращаясь из main() бессмысленно.

Вы должны поместить некоторый фактический код после цикла, и он должен что-то делать с period, Назначение по умолчанию printf является консолью отладки CCS, так что вы можете вызвать ее, но если вы просто хотите наблюдать переменную в отладчике, запишите окончательное значение в какой-либо аппаратный регистр или в переменную volatile, чтобы компилятор был вынужден сохранить его значение:

MPY = period;

Не уверен, где именно проблема, но я обычно заставляю код избегать неявных повышений, смешивания 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
Другие вопросы по тегам