elsearch 发表于 2020-3-11 11:54:22

STM32CubeIDE开发,if条件明明为假还是执行了,执行了?!!!


话不多说,说多了都是泪:'(,有图有真相(可能我看到的都是假象)……
希望坛友能指条明路,给点思路,反正什么都行啦,if 能跳过这个if


流水源 发表于 2020-3-11 12:02:10

看看汇编,或者在变量定义前面加上volatile

elsearch 发表于 2020-3-11 14:08:37

流水源 发表于 2020-3-11 12:02
看看汇编,或者在变量定义前面加上volatile

汇编代码确实有问题,一条if语句前后汇编出了两段代码,第一段不正常,第二段正常,就是不知道为什么这样:dizzy:,我一会儿再加上volatile试试


static void vTaskLDS5461(void *pvParameters)
{
uint32_t i=0;
LDS5461_Config();
if(HAL_UART_Receive_DMA(&huart4,(uint8_t *)&(uart4_data.buf),256) != HAL_OK) //USART4接收
{
Error_Handler();
}

while(1)
{
if(uart4_data.flag == 1)
{
uart_data.ndtr = 256 - uart4_data.cndtr;
uart_data.flag=1;
for(i=0; i<uart_data.ndtr; i++)
{
uart_data.buf = uart4_data.buf;
}
uart_data.buf = 0;

uart4_data.flag = 0;
if(HAL_UART_Receive_DMA(&huart4,(uint8_t *)&(uart4_data.buf),256) != HAL_OK) //USART4接收
{
Error_Handler();
}

Uart4_SendStr((char *)&uart_data.buf);
uart_data.flag = 0;

LDS5461_DisplayStr((const char *)&uart_data.buf);
}

vTaskSuspend(xHandleTaskLDS5461); //挂起此任务
}
}

vTaskLDS5461:
0800647c: push {r3, r4, r5, r6, r7, lr}
0800647e: bl 0x80003e0 <LDS5461_Config>
08006482: mov.w r2, #256 ; 0x100
08006486: ldr r1, ; (0x8006504 <vTaskLDS5461+136>)
08006488: ldr r0, ; (0x8006508 <vTaskLDS5461+140>)
0800648a: bl 0x80027a4 <HAL_UART_Receive_DMA>
0800648e: cbnz r0, 0x8006498 <vTaskLDS5461+28>
<font color="#ff0000">134 if( uart4_data.flag == 1)</font>
08006490: ldr r4, ; (0x8006504 <vTaskLDS5461+136>)
136 uart_data.ndtr = 256 - uart4_data.cndtr;
08006492: ldr r5, ; (0x800650c <vTaskLDS5461+144>)
145 if(HAL_UART_Receive_DMA(&huart4,(uint8_t *)&(uart4_data.buf),256) != HAL_OK) //USART4接收
08006494: ldr r6, ; (0x8006508 <vTaskLDS5461+140>)
08006496: b.n 0x80064b8 <vTaskLDS5461+60>
129 Error_Handler();
08006498: bl 0x800680c <Error_Handler>
0800649c: b.n 0x8006490 <vTaskLDS5461+20>
150 Uart4_SendStr((char *)&uart_data.buf);
0800649e: mov r0, r5
080064a0: bl 0x8006198 <Uart4_SendStr>
151 uart_data.flag = 0;
080064a4: movs r3, #0
080064a6: str.w r3, ; 0x110
153 LDS5461_DisplayStr((const char *)&uart_data.buf);
080064aa: mov r0, r5
080064ac: bl 0x8000254 <LDS5461_DisplayStr>
156 vTaskSuspend(xHandleTaskLDS5461); //挂起此任务
080064b0: ldr r3, ; (0x8006510 <vTaskLDS5461+148>)
080064b2: ldr r0,
080064b4: bl 0x8003dc4 <vTaskSuspend>
<font color="#ff0000">134 if( uart4_data.flag == 1)</font>
080064b8: ldr.w r3, ; 0x110
080064bc: cmp r3, #1
080064be: bne.n 0x80064b0 <vTaskLDS5461+52>
136 uart_data.ndtr = 256 - uart4_data.cndtr;
080064c0: ldr.w r0, ; 0x104
080064c4: rsb r0, r0, #256 ; 0x100
080064c8: str.w r0, ; 0x108
137 uart_data.flag=1;
080064cc: str.w r3, ; 0x110
138 for(i=0; i<uart_data.ndtr; i++)
080064d0: cbz r0, 0x80064e4 <vTaskLDS5461+104>
080064d2: ldr r3, ; (0x8006504 <vTaskLDS5461+136>)
080064d4: ldr r2, ; (0x800650c <vTaskLDS5461+144>)
080064d6: adds r7, r0, r3
140 uart_data.buf = uart4_data.buf;
080064d8: ldrb.w r1, , #1
080064dc: strb.w r1, , #1
138 for(i=0; i<uart_data.ndtr; i++)
080064e0: cmp r3, r7
080064e2: bne.n 0x80064d8 <vTaskLDS5461+92>
142 uart_data.buf = 0;
080064e4: uxtb r0, r0
080064e6: movs r3, #0
080064e8: strb r3,
144 uart4_data.flag = 0;
080064ea: str.w r3, ; 0x110
145 if(HAL_UART_Receive_DMA(&huart4,(uint8_t *)&(uart4_data.buf),256) != HAL_OK) //USART4接收
080064ee: mov.w r2, #256 ; 0x100
080064f2: mov r1, r4
080064f4: mov r0, r6
080064f6: bl 0x80027a4 <HAL_UART_Receive_DMA>
080064fa: cmp r0, #0
080064fc: beq.n 0x800649e <vTaskLDS5461+34>
147 Error_Handler();
080064fe: bl 0x800680c <Error_Handler>
08006502: b.n 0x800649e <vTaskLDS5461+34>
08006504: adds r5, #200 ; 0xc8
08006506: movs r0, #0
08006508: adds r6, #224 ; 0xe0
0800650a: movs r0, #0
0800650c: adds r3, #96 ; 0x60
0800650e: movs r0, #0
08006510: movs r7, #108 ; 0x6c
08006512: movs r0, #0






butterflyspring 发表于 2020-3-18 17:29:04

注意一下优化等级吧,设为最低试试看
页: [1]
查看完整版本: STM32CubeIDE开发,if条件明明为假还是执行了,执行了?!!!