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

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

[复制链接]
lanmanck 发布时间:2019-11-18 18:57
代码:4 f) P! ]' m/ k, F+ C- b% S% Q
  1. void TIMER16_IRQHandler(void)
    # s; U# ]' O3 t& @' B+ n' @
  2. {1 u# r1 L9 U: `$ `- o+ ?6 [5 j  o+ {
  3.         if(SET == timer_interrupt_flag_get(TIMER16, TIMER_INT_UP)){1 U5 R( x1 |# {# L/ u% Q) J7 R' u
  4. " @, p# j$ q6 O# s9 c
  5.         /* clear channel 0 interrupt bit */0 D3 j' A( H. B5 t; b# ^; D8 }3 L
  6.         timer_interrupt_flag_clear(TIMER16, TIMER_INT_UP);( A: [; y7 P" X, M
  7. $ D" `- ~# s: o
  8.         /* toggle selected led */7 ^8 b/ c3 u* R- j; G3 }
  9.         g_bsl.tick_1ms++;
    # j; W' p) a8 E. ~! e; _
  10.     }& f5 e$ C% c+ ~7 e' C; m, {1 L
  11. }( R/ }2 M1 @- x: ~

  12. 0 o' q6 ^0 Q* D: y& P, ^7 R% v
  13. uint32_t get_timer_tick(void)- O$ S" l- s8 @9 a, s& E
  14. {0 L/ v# O- J5 \- Y
  15.         return g_bsl.tick_1ms;
    ) F, f; T0 Q% G
  16. }
    7 `- N, I- a4 V4 @+ [5 \

  17. ( w6 }+ M' k& f2 v1 p, q
  18. void delay_1ms(uint32_t xms)
    7 B8 F6 x! s% r: V% }8 y1 m. ]% S
  19. {. h0 U& e3 O  Q' W* L
  20.         volatile uint32_t tick,diff=xms;
    % y' w% F! ]- \. ?
  21. ) Y: n" L$ ~6 }% D% q# [0 M/ j3 ]
  22.         SET_TICK(tick);) R* H) \- o2 B9 S, J
  23.         /*while(GET_DIFF_TICK(tick) < diff){}*/( `+ m( V( a: @' {8 ?; q5 K4 V
  24. 5 I6 Y8 |3 T4 h5 o7 H1 {4 ^1 h
  25.         while(xms){  `3 _5 v" N2 k$ @6 P. i' i; P& t* P
  26.                 diff =  (0x100000+get_timer_tick()-tick)&0xFFFFF ;
    7 B3 m! I2 T8 F. `
  27.                 while(diff < 1){
    * f: Z) g+ y. U3 ]3 [
  28.                         diff =  (0x100000+get_timer_tick()-tick)&0xFFFFF ;1 m& M3 e. ^  C- _5 f( P& v
  29.                 }
    3 W* u2 \+ E/ m# g: _4 O
  30.                 SET_TICK(tick);
    2 r! l! r( r: c) Y6 w
  31.                 xms--;
    9 d8 b6 {+ L6 b7 s- y# t8 T6 u2 D4 R# G
  32.         }/ @0 J1 {3 O) H6 S5 D% \
  33. }
复制代码
这个函数就是延时多少毫秒,这个毫秒计数器通过一个毫秒中断一直增加。. g: m8 `* G# b0 k1 F7 K2 C3 Q9 E2 o
这个是5.0编译器的结果,杠杠的:* V! _# @9 a, Y- G+ k2 O; R. O
ac5-ok.gif
0 c" M1 _& W9 c这个是6.0的结果,不加volatile直接给你优化了,等级为Oz,循环一直出不去,我没辙了,大家救救我吧:. j  b8 `. Z) V) \% S/ e9 X
% E4 Z! E1 S/ r$ h
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:559 v" k6 @' `2 @8 D$ U
因为您的不精确的自建延时函数被优化,就否了 armcompiler V6.0?无语

' @* N% v9 T' P6 j* w" }. X3 P如何改进代码呢?求教!
慎微 回答时间:2019-11-19 09:01:51
直接用HAL 库延时 HAL_Delay()啊
lanmanck 回答时间:2019-11-19 11:27:41
mikecai 发表于 2019-11-19 09:01
! D4 n/ `( c' @- q直接用HAL 库延时 HAL_Delay()啊
4 z/ g0 G( t' o$ l
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
: V9 S+ z- s* K+ K% y只要是不同线程共用的变量都应该加volatile, 这你不能怪v6
8 C  V1 p9 n4 \6 e& m) X2 h
你的回答是正确的!高手。

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版