Почему этот светодиодный цикл не зацикливается? - PullRequest
0 голосов
/ 24 сентября 2019

Я начал изучать встроенную систему, и меня попросили написать простую программу для подсветки 8 светодиодов в порту, сначала все должны быть равны одному, а затем загораться один за другим в последовательности от 7 до0.

Я написал следующий код, но не могу точно определить, почему цикл запускается только один раз?

#define BYTE_TO_BINARY_PATTERN "%c%c%c%c%c%c%c%c"
#define BYTE_TO_BINARY(byte)  \
  (byte & 0x80 ? '1' : '0'), \
  (byte & 0x40 ? '1' : '0'), \
  (byte & 0x20 ? '1' : '0'), \
  (byte & 0x10 ? '1' : '0'), \
  (byte & 0x08 ? '1' : '0'), \
  (byte & 0x04 ? '1' : '0'), \
  (byte & 0x02 ? '1' : '0'), \
  (byte & 0x01 ? '1' : '0')
#include <stdio.h>

int main()
{
    int i = 0;
    int x = 0xFF;
    while(x != 0x00)
     {
      x= x>>1;
      printf("%x\n%d",x,i);
      printf("\nBinVal "BYTE_TO_BINARY_PATTERN, BYTE_TO_BINARY(~x));
      x= x<<1;
      i++;
    return 0;
    }
 }

Я ожидал, что x будет непрерывно смещаться вправо, печатая смещенное значение.Но он просто сдвигается, как только x переходит от 0xFF к 0x7F и все.Интернет-ресурсы мне не помогают. Буду благодарен, если кто-нибудь сможет мне помочь.

Ответы [ 3 ]

4 голосов
/ 24 сентября 2019

Алекс Ф дал вам правильное решение, но не объяснил почему.Поскольку вы бы поймали ошибку, если бы вы знали, я хотел бы немного ее объяснить.

С return 0 внутри вашей основной функции, вы говорите своей программе нормально завершиться.Поскольку return находится внутри цикла, вы заканчиваете работу до того, как он снова сможет циклически повторяться.

Если вы учитесь работать со встроенными системами, я настоятельно рекомендую прочитать в стек вызовов и узнать, как returns работает (а также почему main должен возвращать 0, если все работало нормально).В противном случае вы столкнетесь с проблемами позже.

4 голосов
/ 24 сентября 2019
int main()
{
   int i = 0;
   int x = 0xFF;
   while(x != 0x00)
   {
     x= x>>1;
     printf("%x\n%d",x,i);
     printf("\nBinVal "BYTE_TO_BINARY_PATTERN, BYTE_TO_BINARY(~x));
     x= x<<1;
     i++;
     //return 0;   // <- move this out of the loop
   }

   return 0;
 }
3 голосов
/ 24 сентября 2019
  • x= x>>1; дает 0xEF.x= x<<1; дает 0xFE.Он не равен нулю.
  • return 0; не должно быть внутри цикла while.Или в вашей программе вообще.Встраиваемые системы с «голым металлом» не возвращаются из main () и по этой причине используют форму impl.defined, например, void main (void).
...