TA的每日心情 | 开心 2019-11-19 15:19 |
---|
签到天数: 1 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
SOC开发中volatile限定词与编译器的优化!!!!
4 Y- {( m$ E; L+ U7 Q% y* b# n H( T6 {& V
( L5 r$ l' ]0 u. R( R7 w最近上手nios软核处理器,入门自然少不了流水灯,开始按照“NIOS2那些事儿”写的流水灯程序,但是然后函数是自己写的,结果所有等都是一直长亮,死活不能流水。5 a+ _' q) f1 V) ?9 _
4 S9 i/ ]: X3 M% g1 f代码如下:% W1 k& R" ?6 n# v4 u
( y; m9 i9 [$ w% a- f+ W4 C) k
0 k' \$ W3 I x+ I( L' ?. D& e: P& [5 B' Y" H. i/ P$ L& \
8 I/ {2 X" G) U/* p8 C' P; o# r- u) s1 u) u: @
6 x+ C: t6 r% C6 b. D1 Q: T
* main.c
3 }) P+ q2 x3 W, o+ P+ |; T2 C: ~/ Y0 p- Z5 S8 y. J \5 X0 f! [
*
, o. j8 P [4 U7 B# O
- |( S u4 N; S8 E* Created on: 2015-4-14
% y9 Q* ^9 d: W+ a$ N N9 G: Y
5 C' P5 p- f/ Z7 v! o# N* Author: meicai
! N. U# r( I% K! F6 T% F2 m
! V8 {1 [& p' q7 |# |*/ K L# ^4 D4 Z# j3 N+ q0 E9 ~. _- v1 S
) w) ]; R: a7 W#include "../inc/sopc.h"
! u0 t2 o3 P; ~. `. V+ A# z3 o; t( \/ J1 X. F. ^2 a7 U8 Z4 L
#include "system.h"
* C) d( f u2 u3 s2 g m: W8 I9 ~8 M2 j: Y7 }
7 H" [: `% U/ k; `. c, u8 T4 d
\ \ |1 l5 ?: X1 a3 u" X9 qvoid delay(void);
% s4 F+ y5 p. u9 S7 |. v( q4 s' g+ ~) Q' G" s
! j- Z( O9 n4 q
3 t: ^0 }5 j' D, D. i
: k: p0 e2 H7 M* |
F2 d! x* e f6 V8 M5 z! jint main(void){3 U. X& Z# Y$ B; ^) a! o1 _
9 y5 f- ~7 c2 i t* H. {5 [. [
1 L- @$ K* j# ~3 E
' u' m+ @4 A6 R: Q
# b* y/ |& R# B' c, @
/ ?( K' D* X( P8 d8 h while(1){
! y- ?7 T# @8 c$ Q/ _6 T0 \
* m+ T; d4 T* _* E/ ?2 t
6 t; g _) p. [5 O' p6 E3 W9 ^& f4 ~
LED->DATA =0x01;
( e7 t5 i+ G& {1 P# ~: `3 U X$ O8 }# a% e+ g
4 k3 L+ T4 [' r6 n- B
8 M& ~2 D8 Q* T; p delay();8 Y7 O$ Q- Z8 _7 y4 k
y& V2 R$ ]) H* |+ L
2 Q5 C3 c: t7 M, f, \. M' }+ N+ b- J2 d% p+ F! A6 R) \' W
LED->DATA =0x02;5 Q. u% z! f, C) d1 |3 d4 I7 F7 F
; n: v; N1 r$ L7 q l% ^
9 s$ g' t$ L# X) k7 D* K
1 j) Q9 H$ p" @) ]" t/ z' U( @5 d delay();6 s; D; Q7 P0 _) @0 E
" q3 D; ^9 S! K2 Z
. @6 N( H R* W& U
6 }# t5 A$ ?. w. A }& e) W9 w0 \' Z+ [
" T% L' L5 B: _, N/ e9 I- k5 D7 N- n return 0;
& r: b8 ]7 ~) v" |. \' D& I9 W
( o4 c: h6 @* \3 G3 y( `: C}* i5 F2 b6 v% @3 n) q2 H: p: N
& }* Y& t& n& F( X1 d. p, a
, K, {" ~# j w* U$ G0 k
4 ^- |$ r& m: ?' R& Dvoid delay(void)
( T3 x- k) W A5 V& `2 k
0 |& X6 p, Z8 |- q; n f! O{
1 H: x; {0 r; S0 |. E1 [' V$ L6 A, I- F7 B2 B. M
int i;
& D* X$ K+ M. n& Z$ n
! N+ L/ D( U9 K, e, j1 @* [
) h2 j; Q6 u W4 y; I) z" G* K" N/ d( q+ X
for(i = 0; i < 400000; i++ );, Y3 d! P1 T! X
& u( E7 U8 b6 U7 i5 m
5 d# s( E- S" \# {. m& \) F) T/ n8 L8 h N- [2 j" b$ V
}. Q" J$ L6 j4 @3 \0 ~( r5 q% i
% Z( k* z: l, x4 a
' G# Q/ F$ ~: R
. [2 ]! n* n# c
8 [. a8 z2 T! r# s+ C, C后来发现是delay函数中的变量 i 被编译器优化掉了,甚是郁闷,通过观察其他人的代码发现在变量声明的时候都会加上volatile,我也效仿了一下,在delay函数中声明变量 volatile int i;嘿,果然就好了。后来翻书找到了volatile的解释。如下:
# e7 d* U2 E0 k' L, c0 r% _& C+ Y5 |9 K* L0 c
voaltile用于强制某个实现屏蔽可能的优化。, Q* N9 Q- X" S; d- b/ ~
/ h9 l/ [+ D3 E
7 r; p: W2 C. E& H- E
3 L' p# D$ \0 y0 E/ h9 A4 @另外要注意的一点是,我使用的开发板上led灯灯饰阳极接电源,引脚拉低点亮,然而移位操作是用0补的,这就导致所有led灯都会一直亮。, ]8 ? l. k: Q
|
|