Как определить область действия переменной * stati c? - PullRequest
0 голосов
/ 04 марта 2020

Я пытаюсь понять базовый c загрузчик. Вот функция, которая вызывается через некоторое время. L oop:

static void uart_task(void)
{
  static int ptr = 0;
  static int command = 0;
  static int size = 0;
  uint8_t *byte_buf = (uint8_t *)uart_buffer;
  int data;

  if (uart_command)
    return;

  if (0 == UART_SERCOM->USART.INTFLAG.bit.RXC)
    return;

  data = UART_SERCOM->USART.DATA.reg;

  if (timer_expired())
    command = 0;

  if (0 == command)
  {
    ptr = 0;
    command = data;
    uart_buffer[0] = 0;

    if (BL_CMD_UNLOCK == command)
      size = CMD_UNLOCK_SIZE;
    else if (BL_CMD_DATA == command)
      size = CMD_DATA_SIZE;
    else if (BL_CMD_VERIFY == command)
      size = CMD_VERIFY_SIZE;
    else if (BL_CMD_RESET == command)
      size = CMD_RESET_SIZE;
    else
      size = 0;
  }
  else if (ptr < size)
  {
    byte_buf[ptr++] = data;
  }

  if (ptr == size)
  {
    uart_command = command;
    command = 0;
  }

  timer_reset();
}

static int command = 0 инициализируется в верхней части функции.

16 строк вниз * Проверено значение command; if (0 == command).

Не будет ли это if утверждение всегда возвращать true? Как можно изменить значение command между его объявлением и проверяемым значением?

1 Ответ

3 голосов
/ 04 марта 2020

static переменные сохраняют свои значения между вызовами функций. Кроме того, они не инициализируются в начале функции; они имеют свое значение с начала программы.

Например, с переменной stati c,

int foo(int bar)
{
    static int baz = 0;

    if(bar)
        baz = 1;

    return baz;
}

не совпадает с

int foo(int bar)
{
    static int baz;

    baz = 0;

    if(bar)
        baz = 1;

    return baz;
}

В первом примере, когда foo вызывается с ненулевым аргументом, он вернет 1 из этого вызова и любых последующих вызовов. Во втором случае foo возвращает 1 только когда ему передан ненулевой аргумент и всегда возвращает 0 в противном случае.

В вашем случае command изменяется прямо здесь:

  if (0 == command)
  {
    ptr = 0;
    command = data; // here
    uart_buffer[0] = 0;

и, если ptr == size или таймер не истек, это значение будет сохранено для следующего вызова.

...