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

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

[复制链接]
lanmanck 发布时间:2019-11-18 18:57
代码:7 z5 D) s" `! @+ f8 C9 s" ], D3 Z
  1. void TIMER16_IRQHandler(void)$ O" a4 O1 h7 T: x
  2. {
    : Y* F; f% u& P" I6 ?6 P* t* B5 \
  3.         if(SET == timer_interrupt_flag_get(TIMER16, TIMER_INT_UP)){
    7 L2 ^6 H6 u8 O$ ?
  4. ; ^+ @+ l7 h; d: l) V. ]) g% I9 ~
  5.         /* clear channel 0 interrupt bit */5 f9 r1 Z7 |6 j6 a2 j
  6.         timer_interrupt_flag_clear(TIMER16, TIMER_INT_UP);  [$ ^$ R& K6 @, G+ Y' k
  7. 4 q0 p3 ]/ W8 l3 b2 E
  8.         /* toggle selected led */
    % r2 S! {! q0 o4 T8 f! ^
  9.         g_bsl.tick_1ms++;  z5 ?8 t7 q+ }  x. @& t: h
  10.     }
    + x5 H5 m. S( A
  11. }
    $ o3 t' t) S. \$ r1 d
  12. " J0 j6 d4 l/ |8 x7 {0 a' R$ T
  13. uint32_t get_timer_tick(void)
    5 Y  y" k1 S' f7 a9 j
  14. {! l- s9 o  ?% V5 a. [, |# j% j" W
  15.         return g_bsl.tick_1ms;
    " h% ~, Y% u- e8 Y" }% ]
  16. }
    % ]3 z4 c$ ^, ?: ?3 j: W, E. E
  17.   B: C* c  r3 m- Y; c
  18. void delay_1ms(uint32_t xms): O/ n) i' m  ^7 y5 R
  19. {
    % x7 `. H/ c/ E
  20.         volatile uint32_t tick,diff=xms;, o/ D8 [+ W/ y- P% R3 p; c2 ^
  21.   N. \1 _2 M5 s: b( x/ @3 [2 M
  22.         SET_TICK(tick);  M- @. n6 g, `# i
  23.         /*while(GET_DIFF_TICK(tick) < diff){}*/
    1 w/ r' M- l/ x9 Y/ B2 ^

  24. : l  P% {2 K6 R" n
  25.         while(xms){$ Q, J1 L; H" K4 I9 [$ P
  26.                 diff =  (0x100000+get_timer_tick()-tick)&0xFFFFF ;
    . N3 Z7 m& B5 q- U9 ~4 b2 D
  27.                 while(diff < 1){
    + Q) s2 L8 D( e
  28.                         diff =  (0x100000+get_timer_tick()-tick)&0xFFFFF ;- V* ?/ a: r8 N
  29.                 }& M8 S& s4 t; S& N- r# v9 ]
  30.                 SET_TICK(tick);
    ( X/ s% c) p" X/ b/ N$ I
  31.                 xms--;
    3 H8 j) F- s. N! f5 ?4 Z/ \
  32.         }8 O' F3 U* q/ W0 D1 k; E+ l$ s
  33. }
复制代码
这个函数就是延时多少毫秒,这个毫秒计数器通过一个毫秒中断一直增加。/ |- q* t" ?/ I9 P3 b* B# C5 w
这个是5.0编译器的结果,杠杠的:. o# T: P$ d/ t9 g, Y, q. ~
ac5-ok.gif
) w" |* `; u" B/ b- i7 {3 d6 W这个是6.0的结果,不加volatile直接给你优化了,等级为Oz,循环一直出不去,我没辙了,大家救救我吧:
. N9 k8 e5 u3 U) {1 X/ N6 X. T7 M3 Z- s  ]3 Z
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: P8 H& w( ]9 O) P0 j+ O+ M! d
因为您的不精确的自建延时函数被优化,就否了 armcompiler V6.0?无语
1 Q7 }/ z4 A* _2 f* i
如何改进代码呢?求教!
慎微 回答时间:2019-11-19 09:01:51
直接用HAL 库延时 HAL_Delay()啊
lanmanck 回答时间:2019-11-19 11:27:41
mikecai 发表于 2019-11-19 09:01
* e+ `! e0 w" w" h0 D直接用HAL 库延时 HAL_Delay()啊
6 [1 [  Y% B! s! R, u0 ^! a0 e
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) k5 |$ M! e( i) n1 K
只要是不同线程共用的变量都应该加volatile, 这你不能怪v6
, H5 ~3 l/ T; X6 v/ E$ Z* q
你的回答是正确的!高手。

所属标签

相似分享

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