【问题标题】:Unable to enter into a particular switch case无法进入特定的开关盒
【发布时间】:2021-08-07 11:46:20
【问题描述】:

switch 的第一种情况是初始化值,当我进入函数时,switch 不会进入 case INI_QUEUE,而是进入 CHECK_QUEUE 或 ENABLE_QUEUE。 下面是我的代码和调试sn-p。

谁能告诉我,是什么问题导致无法进入 INI_QUEUE

main.c file
    int main(void)
    {
      /* USER CODE BEGIN 1 */
        char buffer[2] = { 0 };
      /* USER CODE END 1 */
    
      /* MCU Configuration--------------------------------------------------------*/
    
      /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
      HAL_Init();
    
      /* USER CODE BEGIN Init */
    
      /* USER CODE END Init */
    
      /* Configure the system clock */
      SystemClock_Config();
    
      /* USER CODE BEGIN SysInit */
    
      /* USER CODE END SysInit */
    
      /* Initialize all configured peripherals */
      MX_GPIO_Init();
      MX_USART2_UART_Init();
      MX_TIM14_Init();
      /* USER CODE BEGIN 2 */
     // HAL_TIM_Base_Start_IT(&htim14);
      __HAL_UART_ENABLE_IT(&huart2,UART_IT_RXNE);
      // HAL_UART_Receive_IT(&huart2, (uint8_t*) buffer, 1);
      /* USER CODE END 2 */
    
      /* Infinite loop */
      /* USER CODE BEGIN WHILE */
    
      while (1)
      {
        //  HAL_UART_Receive_IT(&huart2, (uint8_t*) buffer, 1);
          fn_cirQ();
        /* USER CODE END WHILE */
    
        /* USER CODE BEGIN 3 */
    
      }
      /* USER CODE END 3 */
    }

    typedef enum{
        INI_QUEUE, CHECK_COM, EN_QUEUE, DE_QUEUE, UART_SEND
    }Qstate;
    void init_queue(queues *q, int max_size){
          q->size =max_size;
          q->values = malloc(sizeof(int)*q->size);
          q->num = 0;
          q->front = 0;
          q->rare = 0;
      }
    void fn_cirQ()
    {
        queues q1;
        static Qstate queuestates = INI_QUEUE;
        switch (queuestates)
        {
        case INI_QUEUE:
            init_queue(&q1, SIZE);
            queuestates = CHECK_COM;
        break;
        case CHECK_COM:
            if(Q_state == 0xFF)
            {
                queuestates = EN_QUEUE;
            }
            else if(Q_state == 0x00)
            {
                queuestates = DE_QUEUE;
            }
            else if(Q_state != 0x55)
            {
                HAL_UART_Transmit_IT(&huart2, (uint8_t*) errormsg, 20);
            }
        break;
        case EN_QUEUE:
            en_queue(&q1, temp[1]);
            Q_state = 0x55;
            j = 0;
            queuestates = UART_SEND;
        break;
        case DE_QUEUE:
            dequeue(&q1);
            Q_state = 0x55;
            j=0;
            queuestates = UART_SEND;
        break;
        case UART_SEND:
            HAL_UART_Transmit_IT(&huart2, (uint8_t*)&q1, sizeof(q1));
            queuestates = CHECK_COM;
        break;
    }
    }

[调试窗口,queuestates 分配有 CHECK_COM 状态而不是 INI_QUEUE]

【问题讨论】:

  • 代码似乎没问题。如果可能,将conditional break point 保持在queuestates 上,检查函数调用之前是否发生任何写入。无意中覆盖queuestates 可能有多种原因。例如数组越界访问、错误的指针算法。
  • 尝试将优化级别设置为无 (-O0) 并再次检查此行为。

标签: c stm32


【解决方案1】:

静态变量的初始化只在程序启动时进行一次。所以第一次调用该函数时,会转到INI_QUEUE这种情况。

从那时起,下次调用该函数时,它将进入上一次调用设置的队列状态。

但第一次转到INI_QUEUE

【讨论】:

  • 我在中断模式下从 uart 获取输入,然后我调用函数,在第一次迭代中,只有它被声明为 CHECK_SUM,正如我在上面的 sn-p 中显示的那样。
  • 唯一的另一种可能性是在调用fn_cirQ 之前,一个错误覆盖了queuestates。虽然在函数中声明了变量,但它仍然与其他全局/静态变量一起存储在全局数据段中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-19
  • 1970-01-01
  • 1970-01-01
  • 2019-07-05
  • 1970-01-01
相关资源
最近更新 更多