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