Вызов протопотока для __LINE__ больше 256: ошибка: значение метки регистра превышает

Я использую протопотоки на своем встроенном устройстве (STM32, GCC), так как он легкий и избавляет меня от необходимости самостоятельно обрабатывать сложные конечные автоматы.

По мере роста моей основной программы функция PT_* вызывается по номеру строки больше 256

struct pt main_pt;
int main(void)
{
    PT_BEGIN(pt);
    while(true)
    {
        /*... 256 lines further*/
        PT_WAIT_UNTIL(pt, flag);
        PT_YIELD(pt);
    }
    PT_END(pt);
}

И при компиляции он выдает эту ошибку:

main.c: In function 'main':    
main.c:256:4: error: case label value exceeds maximum value for type [-Werror]
    PT_WAIT_UNTIL(pt, flag);
main.c:257:4: error: case label value exceeds maximum value for type [-Werror]
    PT_YIELD(pt);

Если PT_YIELD или PT_WAIT_UNTIL помещены в номер строки меньше 256, он компилируется.

Вот фрагмент кода для PT_YIELD, PT_WAIT_UNTIL, LC_SET и struct pt:

typedef uint32_t lc_t;
struct pt {
  lc_t lc;
};
#define LC_RESUME(s) switch(s) { case 0:
#define LC_SET(s) s = __LINE__; case __LINE__:
#define PT_BEGIN(pt) { unsigned int PT_YIELD_FLAG = 1; LC_RESUME((pt)->lc)
#define PT_WAIT_UNTIL(pt, condition)            \
  do {                      \
    LC_SET((pt)->lc);               \
    if(!(condition)) {              \
      return PT_WAITING;            \
    }                       \
  } while(0)
#define PT_YIELD(pt)                \
  do {                      \
    PT_YIELD_FLAG = 0;              \
    LC_SET((pt)->lc);               \
    if(PT_YIELD_FLAG == 0) {            \
      return PT_YIELDED;            \
    }                       \
  } while(0)

Почему "case __LINE__:" не может превышать 256, так как он хранится в uint32_t?

0 ответов

Другие вопросы по тегам