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

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

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

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

调试截图

调试截图

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

举报

3个回答
流水源 回答时间:2020-3-11 12:02:10
看看汇编,或者在变量定义前面加上volatile
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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版