你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
elsearch 提问时间:2020-3-11 11:54 /

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

调试截图

调试截图

收藏 评论3 发布时间:2020-3-11 11:54

举报

3个回答
STMWoodData 回答时间:2020-3-11 12:02:10
提示: 作者被禁止或删除 内容自动屏蔽
elsearch 回答时间:2020-3-11 14:08:37
流水源 发表于 2020-3-11 12:02
看看汇编,或者在变量定义前面加上volatile

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


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

  9. while(1)
  10. {
  11. if(uart4_data.flag == 1)
  12. {
  13. uart_data.ndtr = 256 - uart4_data.cndtr;
  14. uart_data.flag=1;
  15. for(i=0; i<uart_data.ndtr; i++)
  16. {
  17. uart_data.buf[i] = uart4_data.buf[i];
  18. }
  19. uart_data.buf[i&0x000000ff] = 0;

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

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

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

  29. vTaskSuspend(xHandleTaskLDS5461); //挂起此任务
  30. }
  31. }

  32. vTaskLDS5461:
  33. 0800647c: push {r3, r4, r5, r6, r7, lr}
  34. 0800647e: bl 0x80003e0 <LDS5461_Config>
  35. 08006482: mov.w r2, #256 ; 0x100
  36. 08006486: ldr r1, [pc, #124] ; (0x8006504 <vTaskLDS5461+136>)
  37. 08006488: ldr r0, [pc, #124] ; (0x8006508 <vTaskLDS5461+140>)
  38. 0800648a: bl 0x80027a4 <HAL_UART_Receive_DMA>
  39. 0800648e: cbnz r0, 0x8006498 <vTaskLDS5461+28>
  40. <font color="#ff0000">134 if( uart4_data.flag == 1)</font>
  41. 08006490: ldr r4, [pc, #112] ; (0x8006504 <vTaskLDS5461+136>)
  42. 136 uart_data.ndtr = 256 - uart4_data.cndtr;
  43. 08006492: ldr r5, [pc, #120] ; (0x800650c <vTaskLDS5461+144>)
  44. 145 if(HAL_UART_Receive_DMA(&huart4,(uint8_t *)&(uart4_data.buf),256) != HAL_OK) //USART4接收
  45. 08006494: ldr r6, [pc, #112] ; (0x8006508 <vTaskLDS5461+140>)
  46. 08006496: b.n 0x80064b8 <vTaskLDS5461+60>
  47. 129 Error_Handler();
  48. 08006498: bl 0x800680c <Error_Handler>
  49. 0800649c: b.n 0x8006490 <vTaskLDS5461+20>
  50. 150 Uart4_SendStr((char *)&uart_data.buf);
  51. 0800649e: mov r0, r5
  52. 080064a0: bl 0x8006198 <Uart4_SendStr>
  53. 151 uart_data.flag = 0;
  54. 080064a4: movs r3, #0
  55. 080064a6: str.w r3, [r5, #272] ; 0x110
  56. 153 LDS5461_DisplayStr((const char *)&uart_data.buf);
  57. 080064aa: mov r0, r5
  58. 080064ac: bl 0x8000254 <LDS5461_DisplayStr>
  59. 156 vTaskSuspend(xHandleTaskLDS5461); //挂起此任务
  60. 080064b0: ldr r3, [pc, #92] ; (0x8006510 <vTaskLDS5461+148>)
  61. 080064b2: ldr r0, [r3, #0]
  62. 080064b4: bl 0x8003dc4 <vTaskSuspend>
  63. <font color="#ff0000">134 if( uart4_data.flag == 1)</font>
  64. 080064b8: ldr.w r3, [r4, #272] ; 0x110
  65. 080064bc: cmp r3, #1
  66. 080064be: bne.n 0x80064b0 <vTaskLDS5461+52>
  67. 136 uart_data.ndtr = 256 - uart4_data.cndtr;
  68. 080064c0: ldr.w r0, [r4, #260] ; 0x104
  69. 080064c4: rsb r0, r0, #256 ; 0x100
  70. 080064c8: str.w r0, [r5, #264] ; 0x108
  71. 137 uart_data.flag=1;
  72. 080064cc: str.w r3, [r5, #272] ; 0x110
  73. 138 for(i=0; i<uart_data.ndtr; i++)
  74. 080064d0: cbz r0, 0x80064e4 <vTaskLDS5461+104>
  75. 080064d2: ldr r3, [pc, #48] ; (0x8006504 <vTaskLDS5461+136>)
  76. 080064d4: ldr r2, [pc, #52] ; (0x800650c <vTaskLDS5461+144>)
  77. 080064d6: adds r7, r0, r3
  78. 140 uart_data.buf[i] = uart4_data.buf[i];
  79. 080064d8: ldrb.w r1, [r3], #1
  80. 080064dc: strb.w r1, [r2], #1
  81. 138 for(i=0; i<uart_data.ndtr; i++)
  82. 080064e0: cmp r3, r7
  83. 080064e2: bne.n 0x80064d8 <vTaskLDS5461+92>
  84. 142 uart_data.buf[i&0x000000ff] = 0;
  85. 080064e4: uxtb r0, r0
  86. 080064e6: movs r3, #0
  87. 080064e8: strb r3, [r5, r0]
  88. 144 uart4_data.flag = 0;
  89. 080064ea: str.w r3, [r4, #272] ; 0x110
  90. 145 if(HAL_UART_Receive_DMA(&huart4,(uint8_t *)&(uart4_data.buf),256) != HAL_OK) //USART4接收
  91. 080064ee: mov.w r2, #256 ; 0x100
  92. 080064f2: mov r1, r4
  93. 080064f4: mov r0, r6
  94. 080064f6: bl 0x80027a4 <HAL_UART_Receive_DMA>
  95. 080064fa: cmp r0, #0
  96. 080064fc: beq.n 0x800649e <vTaskLDS5461+34>
  97. 147 Error_Handler();
  98. 080064fe: bl 0x800680c <Error_Handler>
  99. 08006502: b.n 0x800649e <vTaskLDS5461+34>
  100. 08006504: adds r5, #200 ; 0xc8
  101. 08006506: movs r0, #0
  102. 08006508: adds r6, #224 ; 0xe0
  103. 0800650a: movs r0, #0
  104. 0800650c: adds r3, #96 ; 0x60
  105. 0800650e: movs r0, #0
  106. 08006510: movs r7, #108 ; 0x6c
  107. 08006512: movs r0, #0
复制代码






butterflyspring 回答时间:2020-3-18 17:29:04
注意一下优化等级吧,设为最低试试看
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版