【发布时间】: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) 并再次检查此行为。