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

Я использую микроконтроллер 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 ]

0 голосов
/ 21 октября 2018

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

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

MPY = period;
0 голосов
/ 29 октября 2018

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

0 голосов
/ 21 октября 2018

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