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

C语言经典用法累积

[复制链接]
dear祝子 发布时间:2015-12-16 09:03
本帖最后由 dzzwoaizi 于 2015-12-29 15:14 编辑
. |; b; y4 ^+ ?& H6 f- V, t# B" Y" I4 b9 I+ P# H; b/ H. H
今天看到有人转了我的帖子到某论坛里,不是我小气,希望这位仁兄在转的时候标明出处,谢谢(毕竟手打不容易)
7 o4 B4 @  J2 s/ G% E! x4 c(1)typedef, union 和 struct来处理位变量数据然后在同一处理数据例如:
typedef union
8 k2 |, t/ e% h2 `# ]. }' x8 E{
) @5 G0 Y; u1 L" K6 t' X' C
struct
6 L9 S8 Y( W$ u5 r
{* `# V) a8 Y+ i7 F  L
  u8 fBreak:1;
2 ?0 v/ R$ @$ V1 u+ g' Q; S
  u8 fBrock:1;
, f4 `1 P! I, b) H7 A1 U! c+ ^/ C
  u8 fBarerr:1;' Y/ h1 ]. U! b7 _; g
  u8 fBatLow:1;
  u8 fBatHig:1;% _% H) g- g+ R' I
  u8 fTrap:1;) H# r4 A6 `( g" k* P5 ]* {
  u8 fAmpErr:1;
! @2 x" |' s8 a- y. F
  u8 fPwmDown:1;
$ U6 u0 W  x& P! u* P
}bit;
( D' C0 i' N3 x, b
u8 allbits;
  q. t" {5 v+ Q. \
}Fgs_StopState;
0 Y* x! \0 I3 q$ p在电机控制中或者其他控制中有很多标志位,例如刹车标志,低压,过压,过流标志等需要将在运动中的电机停止下来,我们在检测的时候只需要将为标量置一或置零,例如在定义一个联合体:Fgs_StopState Fstop;将某一位置一或清零就可以这么写:Fstop.bit.fAmpErr = 1;在处理数据的时候,我们便于将数据统一处理,所以再此调用 (xx) =allbits;就可以读出所有变量数据了。例如只要以上的变量只要有一个为一就将电机停止,那么在C语言中我们就可以这样:% E0 G2 v+ }3 Q, y2 H# M
                                   if(Fstop.allbits){ //电机停止运行}
                                   else           {//电机继续运行}
  A/ G! {% Q% t1 v9 j' l. X(2)如果遇到一个只能写不能读的寄存器,你该怎么做呢?还是利用typedef, union 和 struct
下面我们看一个程序
typedef union {
    struct {
" F: N# ]- y8 w* o5 ^$ m        unsigned RA0                    :1;) h% [6 j2 a5 V& S2 E0 d& f
        unsigned RA1                    :1;
+ t( n* o) w% C+ l( Y* P5 r        unsigned RA2                    :1;4 X& W# J& Q0 H6 W5 Y
        unsigned RA3                    :1;
% ]* G0 _. |; p2 a- A$ O        unsigned RA4                    :1;
- G+ z4 u0 F. X# g1 \4 l4 ~8 @        unsigned RA5                    :1;
$ B( X6 _0 i, l    };; P) U& v7 u) W, ^. J
} PORTAbits_t;
7 J* _3 u" W) K- ~* n. m- W3 Q3 uextern volatile PORTAbits_t PORTAbits @ 0x00C;/ O7 |) G( T$ K) k
玩过PIC的人可能很熟悉这段代码,他是头文件里的一段IO的操作代码,我在利用国产单片机的时候遇到一个问题:这个寄存器只能写,不能读的,我想位操作,可能很多人认为简单例如:temp=temp|0x01;(temp为只写寄存器),不好意思在temp|0x01;这里已经读了temp了,即使编译通过通过了,你的数值也是不对的!!所以我大胆的利用以上的代码,嘿!既然可以了!的确很有意思!
# w; n: u4 Z* u有人会问 @ 0x00c是什么意思,我的理解是这个寄存器的地址啦,下面有官方的说明:
/ X! L$ y4 a6 W% I( k. G全局变量地址修改器(@ Address)1 Z& S# Z. T6 D  c  r
您可以将全局变量分配给特定的地址与全局变量地址修改器。这些变量被称为“绝对变量”。他们是有用的用于访问内存映射I / O端口,如下语法:# ~/ ?7 c2 T/ }; [7 N" T" f
Declaration = < TypeSpec > <Declarator>[@ <Address> | @“<Section >] [= <Initializer>];/ Z- |: C" b; C% l  w5 p
      < TypeSpec >是类型说明符。        例如、int、char     & J3 P: \3 f( W# u: o
        <Declarator>是全局对象的标识符,    例如 ,i, glob # K, F0 s6 h5 c
        <Address> 是物体的绝对地址,       例如,0 xff04,0 x00 + 8     $ m$ [* E# ?" l0 ~) A8 ~* Z/ N
        <Initializer>是初始化全局变量的值。
9 G/ {; [$ I  C所以我们在操作的时候,就可以PORTAbits .RA0=1;就把第一位置高了,此代码和上面(1)的代码本质差多的,只是在特殊用法上还是突出很大的优势的!
: C/ N4 I4 D9 [  j5 z% Z

. W: K8 k: X  ^5 f3 R& K

0 F7 n; f4 z7 j4 j% F, C$ c! m  B, J8 E: J0 m8 D
+ o4 B# w0 d4 a4 y/ ]+ x- l9 W5 T

" T3 S$ v9 v4 ?* E2 W! c
" O2 I( o+ O7 [2 Q9 [% g* @未完。。。。。待更新!!!; ^$ c9 |% h4 f$ n( `4 M9 |
1 s+ D( ~8 }3 J( P. a) s5 K
赞 收藏 4 评论16 发布时间:2015-12-16 09:03

举报

16个回答
liurujia 回答时间:2015-12-17 10:06:58
本帖最后由 liurujia 于 2015-12-17 10:15 编辑 " [" @# i6 K; i

- }/ g; |8 d; ~; Ptypedef struct " X, _% e# ]4 j: L7 Y( b5 q
{
8 u! j5 y' o' p1 Q" Y        union: J' p7 B7 V9 A* E+ i0 ~4 d1 k
        {
. O0 |* M' P9 i- G                u8 byte;5 u" ^( j3 [# l5 V- ?
                struct/ v4 Y; I2 ?. k0 ]& j( A
                {% [& T& q- @; Q! W( M; {
                        u8 bit0:1;* i9 f! R  |& W5 k1 P
                        u8 bit1:1;
% I' R2 r5 o7 ~0 L6 Z                        u8 bit2:1;4 p6 ~- d+ h# E1 _$ ?  `# @. k
                        u8 bit3:1;
, I& R9 q0 p4 C4 m. W% c) O                        u8 bit4:1;
$ J1 N3 ^, W/ P  @, z' V: U                        u8 bit5:1;
, Y/ r. m3 ^+ }( o                        u8 bit6:1;3 G' i/ e: d( q/ P4 n4 d
                        u8 bit7:1;5 `$ b0 ]$ I8 ?8 {! x' i
                }FuntionFlag;//bits;4 T( t9 y1 y1 g/ I! U' D& E$ t
        };        1 x8 @& }1 i5 i! y' y
}Byte_def;
5 g: Z6 ]' P/ z* v8 x* t我也分享一个,很好用的说。解析一下,bitx:1后的表示占一位,union是一个共用体。Byte_def EBK,那就可以直接用EBK.FuntionFlag.bit0。$ }, w3 @+ e" b6 ^
在加上宏定义define就清晰很多了,#defined EBKbrake EBK.FuntionFlag.bit0
/ i8 t6 N; J% Q! M5 O3 I0 m
钊钊 回答时间:2015-12-16 15:05:06
kusukusu 发表于 2015-12-16 09:42; G5 {9 Q0 o1 t( V
结构体很好用,就是一点不会,假如一个结构体定义在a.c,想要在b.c使用,如何在.h声明? ...

+ ^6 o0 I' G/ n记得包含就可以了,, T  e8 S( ]8 {: s/ X2 y
可以用
! Q1 H6 A# r: v8 e6 q#ifndef* I# u3 h- e6 x# d5 a! v  a; M8 {  b" c
#define - x7 h7 [4 ~  E0 i+ _+ t

8 r, i/ y2 g1 T% ]
5 S3 R4 u# U* H& B: V$ ~# P#endif
3 E. s. W9 O6 h( T+ _; q来避免重复包含,然后中间你随便搞,用一个大的 H 文件把所有的模块h 文件包含进去,然后你会发现所有的变量都可以用了,不过变量的声明要加 extern 这个关键词就好了
Mandelbrot_Set 回答时间:2015-12-16 15:08:30
kusukusu 发表于 2015-12-16 09:422 i2 {* W, \% W/ X% `
结构体很好用,就是一点不会,假如一个结构体定义在a.c,想要在b.c使用,如何在.h声明? ...

6 [* N& ], n: V随便打开一个诸如stm32f10x_gpio.h的文件8 i4 h4 p3 e5 J* _8 f8 b
这里便有正确的用法.
yanhaijian 回答时间:2015-12-16 09:23:09
这个常用到。
kusukusu 回答时间:2015-12-16 09:42:23
结构体很好用,就是一点不会,假如一个结构体定义在a.c,想要在b.c使用,如何在.h声明?
kusukusu 回答时间:2015-12-16 09:43:10
我试过几个都失败了,只好a.c, b.c合并成一个文件了。
stary666 回答时间:2015-12-16 10:16:32
dear祝子 回答时间:2015-12-16 13:20:09
yanhaijian 发表于 2015-12-16 09:23& V" Z7 A. F( F  }8 z6 J# W
这个常用到。
, G$ h- b; W6 h$ ?8 t, z) V5 @3 g
是的,常用到所以经典啊
kusukusu 回答时间:2015-12-17 08:54:39
Mandelbrot_Set 发表于 2015-12-16 15:08
9 }) \) K$ {* R, a% e. ]随便打开一个诸如stm32f10x_gpio.h的文件, x) L( \' C9 L) {
这里便有正确的用法.

! B7 u* X" y+ n# j说的是,我忽略这个了
sfee2002 回答时间:2015-12-17 14:43:50
就一个啊
nongchaoer 回答时间:2015-12-17 16:44:51
用结构体封装数据确实是一个值得推荐的方式
dear祝子 回答时间:2015-12-18 08:47:18
sfee2002 发表于 2015-12-17 14:43  F* k( Q3 q1 m) @$ |
就一个啊
/ F* l* f* x: ]- {
在累积,以后会慢慢写
呦、小魔 回答时间:2015-12-18 09:33:08
多谢分享
dear祝子 回答时间:2015-12-29 15:14:49
liurujia 发表于 2015-12-17 10:06
% {+ W$ ^' W0 M: F9 ztypedef struct
( g- a4 H+ E* k5 v9 ^" B% f{4 I; W' j& ]0 V7 B5 B8 h- `, }
        union
. ~4 B+ ?8 H. Y3 x
谢谢大哥的分享!!非常感谢
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版