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

ARM Compiler 6 VS 5,6就是个垃圾

[复制链接]
lanmanck 发布时间:2019-11-18 18:57
代码:
9 \- N$ L2 d5 o0 D" m% U
  1. void TIMER16_IRQHandler(void)) J) r1 P7 R! E) O& O5 q8 W
  2. {
    4 i5 Y+ Y' v# ~5 L& o! i
  3.         if(SET == timer_interrupt_flag_get(TIMER16, TIMER_INT_UP)){
    - }9 k9 @) r" ^+ L4 k

  4. 5 S/ ?: g* |! i7 f
  5.         /* clear channel 0 interrupt bit */
    % n% h% @0 p1 R) n; h, E
  6.         timer_interrupt_flag_clear(TIMER16, TIMER_INT_UP);$ {3 T# N8 t9 K7 N* m# Y0 ]4 F# T

  7. / `' G" M' ~5 B  P/ |  p4 P, E
  8.         /* toggle selected led */
    5 r5 R6 N, K0 e/ t' _
  9.         g_bsl.tick_1ms++;8 s2 h- D' h' c1 @- z
  10.     }( w# u; O; w' v  a2 |
  11. }
    + p0 |7 I' }2 ]8 A
  12. 8 z- J/ D/ v# _7 x" t, k
  13. uint32_t get_timer_tick(void)+ ]3 K$ F- x, i7 V: e( j
  14. {7 z8 C$ S' b$ m. Z* I/ P% K; x
  15.         return g_bsl.tick_1ms;4 C$ D& o) _0 q! w& J
  16. }
    ( b, }' l% z0 B  p
  17. 2 H5 V1 {% d* R4 `9 L7 v
  18. void delay_1ms(uint32_t xms)4 ^4 \  X6 H# R& ^7 ^5 w
  19. {4 o$ ~1 Z) e* Q3 R2 c" Z- |  @
  20.         volatile uint32_t tick,diff=xms;
    3 t1 r/ b- _6 Q  M$ w$ d- G

  21. / w; Z+ c' `' T) ~+ U* e+ d* q
  22.         SET_TICK(tick);( A: ^$ N1 H0 d
  23.         /*while(GET_DIFF_TICK(tick) < diff){}*/
    # v* v  H' G! {) U" F; X. q

  24. ' q1 }9 J! v2 g" |; Y+ w
  25.         while(xms){
    ! @/ C6 P7 }4 Q( g/ F+ O
  26.                 diff =  (0x100000+get_timer_tick()-tick)&0xFFFFF ;- P9 }  x' r5 R, }
  27.                 while(diff < 1){
    " {, s/ ^8 B- q6 W3 w# ?
  28.                         diff =  (0x100000+get_timer_tick()-tick)&0xFFFFF ;
    / U* N5 H: I& C6 @9 o- R
  29.                 }, R( n: Y2 b6 _5 U2 g3 ]
  30.                 SET_TICK(tick);
    9 J# _  O7 l' Y9 L6 h# c
  31.                 xms--;$ m2 _" z0 _& A4 n" J! N2 W
  32.         }
    * f; h9 m$ ^8 U" u) P/ Y
  33. }
复制代码
这个函数就是延时多少毫秒,这个毫秒计数器通过一个毫秒中断一直增加。- p# ?& u6 v# `
这个是5.0编译器的结果,杠杠的:
2 L4 v$ H* U1 j+ B, E ac5-ok.gif 0 K4 l+ @2 n  b+ z* @7 s; J/ c
这个是6.0的结果,不加volatile直接给你优化了,等级为Oz,循环一直出不去,我没辙了,大家救救我吧:
0 v6 V: i9 r. o2 {  R4 o/ x) Z" j9 [7 |. k. F8 e! A3 j
ac6-notok.gif
赞 收藏 评论7 发布时间:2019-11-18 18:57

举报

7个回答
慎微 回答时间:2019-11-19 08:55:54
因为您的不精确的自建延时函数被优化,就否了 armcompiler V6.0?无语
lanmanck 回答时间:2019-11-19 08:58:01
mikecai 发表于 2019-11-19 08:55
, p* ?1 F, z- B& R因为您的不精确的自建延时函数被优化,就否了 armcompiler V6.0?无语

  A( n# R8 I8 O7 J2 U; m如何改进代码呢?求教!
慎微 回答时间:2019-11-19 09:01:51
直接用HAL 库延时 HAL_Delay()啊
lanmanck 回答时间:2019-11-19 11:27:41
mikecai 发表于 2019-11-19 09:01' B6 K! d" k2 k: I$ Y) ?
直接用HAL 库延时 HAL_Delay()啊

& p& _8 C# l5 o9 z9 a- ?hal_delay原理跟这个一样,我这个还有溢出处理。
edmundlee 回答时间:2019-11-21 12:14:01
只要是不同线程共用的变量都应该加volatile, 这你不能怪v6
maxtch 回答时间:2019-11-29 00:11:02
那你是不熟悉 LLVM/clang 导致的。ARM Compiler v6 本质是 LLVM/clang,其最大的强项是兼容 GCC 的语言支持和相当激进的优化支持。
lanmanck 回答时间:2020-2-14 21:55:44
edmundlee 发表于 2019-11-21 12:14
: T8 q1 n8 \0 o/ I( s9 Y$ i只要是不同线程共用的变量都应该加volatile, 这你不能怪v6
- B5 r& o2 O' e% Y% u# L, T3 ?9 i
你的回答是正确的!高手。
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版