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

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

[复制链接]
lanmanck 发布时间:2019-11-18 18:57
代码:- M; ?! O; H$ n& b1 D8 F& J: L
  1. void TIMER16_IRQHandler(void)3 u8 s& Z+ j( g. O' m! n
  2. {
    ( z' j! H1 h% f7 o4 [" x
  3.         if(SET == timer_interrupt_flag_get(TIMER16, TIMER_INT_UP)){4 ^8 k0 ?8 P# r% p, V
  4. 2 b+ J* ^* ^8 \0 a' X' l0 |) f
  5.         /* clear channel 0 interrupt bit */
    ' n' U" w) T- Y( H
  6.         timer_interrupt_flag_clear(TIMER16, TIMER_INT_UP);
    + Q- ]0 x" @* [6 [' i% p

  7. 4 }; b  u3 v5 M5 a9 Z
  8.         /* toggle selected led */
    % \0 l' y" e4 n/ {( `  j
  9.         g_bsl.tick_1ms++;, J. w+ e- k8 A% Q6 w. S! B3 C
  10.     }$ J6 Y$ K1 V7 [6 k2 D, i
  11. }. h5 Q3 z2 x3 e6 Z
  12. 6 Z5 E- e6 |; y$ N9 Y% u! G5 Q; x
  13. uint32_t get_timer_tick(void)
    9 K8 |! U7 Q9 g3 g0 ~: N
  14. {
    5 S& f" x0 o7 Q
  15.         return g_bsl.tick_1ms;7 |2 ], c9 f4 c
  16. }; _" B6 r5 \  K7 h* L% ~" A; E
  17. , R5 M: i. `3 ^" O/ M% i+ A
  18. void delay_1ms(uint32_t xms)0 o+ `! s) a# H, n' a
  19. {6 G6 Z" o/ S; x6 N/ @5 e
  20.         volatile uint32_t tick,diff=xms;$ ^# n7 O- l$ }' C) B9 [
  21. 2 [5 D" l3 p1 O; m$ N! u3 x
  22.         SET_TICK(tick);/ a5 A$ n, \  O
  23.         /*while(GET_DIFF_TICK(tick) < diff){}*/- R2 C/ f) }1 k4 r

  24. 8 \& {0 H1 ?4 f
  25.         while(xms){8 y& j6 x9 h2 x& u- r  t2 x
  26.                 diff =  (0x100000+get_timer_tick()-tick)&0xFFFFF ;: O$ K* D4 D/ G2 j
  27.                 while(diff < 1){
    0 F8 I" K6 }' _) `8 j
  28.                         diff =  (0x100000+get_timer_tick()-tick)&0xFFFFF ;
    * ~6 z. q& O1 I" k  R& Z( Q
  29.                 }" A3 i& O, c9 T4 J# B
  30.                 SET_TICK(tick);- A; B" H2 M7 v
  31.                 xms--;
    7 [4 k3 Y" h8 L0 s
  32.         }
    9 i7 M5 c: z, ^! {
  33. }
复制代码
这个函数就是延时多少毫秒,这个毫秒计数器通过一个毫秒中断一直增加。) }* o; K1 M8 j& L% H6 E
这个是5.0编译器的结果,杠杠的:
' s0 M+ z3 Y* k4 f ac5-ok.gif
$ \8 |5 [% r- y9 e' r' Q这个是6.0的结果,不加volatile直接给你优化了,等级为Oz,循环一直出不去,我没辙了,大家救救我吧:
# p( ^- o6 K3 |+ W  m) z; ?8 W  c, n, U( ?% J- _2 j$ Y+ G) K! _
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
1 T; x0 O8 l, i9 ~% i$ M因为您的不精确的自建延时函数被优化,就否了 armcompiler V6.0?无语

) G2 I% }; F+ @* w如何改进代码呢?求教!
慎微 回答时间:2019-11-19 09:01:51
直接用HAL 库延时 HAL_Delay()啊
lanmanck 回答时间:2019-11-19 11:27:41
mikecai 发表于 2019-11-19 09:01
4 u* D7 h/ X3 \3 d- X6 f9 r直接用HAL 库延时 HAL_Delay()啊
: ]3 j, d- Y" z6 @8 C
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:149 ~/ p8 y9 a+ W9 q8 M/ y! j+ J
只要是不同线程共用的变量都应该加volatile, 这你不能怪v6

$ o& F9 @' K  k  ?2 L; M你的回答是正确的!高手。

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版