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

C语言经典用法累积

[复制链接]
dear祝子 发布时间:2015-12-16 09:03
本帖最后由 dzzwoaizi 于 2015-12-29 15:14 编辑
5 D! |" R% S8 P% `3 L+ {
, J6 e5 z/ [9 V- D! k9 w今天看到有人转了我的帖子到某论坛里,不是我小气,希望这位仁兄在转的时候标明出处,谢谢(毕竟手打不容易). p, d- T3 K# P2 Y* _3 p
(1)typedef, union 和 struct来处理位变量数据然后在同一处理数据例如:
typedef union2 [% m9 A# C# V" M7 f$ c$ a
{
$ C4 N7 P0 ]! J! \$ `1 D* w: w" T
struct
5 ?& a: J) Q* K. Q0 E
{
6 n) \: N/ H; ]7 i- `
  u8 fBreak:1;
3 L! }9 S4 C' e! Q( F6 ?+ y
  u8 fBrock:1;5 s( W( p) \3 Z' U& u
  u8 fBarerr:1;7 O  C1 `$ _) p# t) O2 z  O
  u8 fBatLow:1;
  u8 fBatHig:1;2 ?; m/ `  l: _& b4 i, W5 V
  u8 fTrap:1;
* a  H2 w* s& ^1 Y4 t
  u8 fAmpErr:1;# L7 c9 |6 Y6 `* h6 V
  u8 fPwmDown:1;" ^) U: A, [5 }. E6 f& B
}bit;
4 y5 m" i6 t- Y$ `; l
u8 allbits;2 o: C3 ^9 N6 N5 _) s" i! D! K
}Fgs_StopState;. s+ A; Z* s3 U5 d
在电机控制中或者其他控制中有很多标志位,例如刹车标志,低压,过压,过流标志等需要将在运动中的电机停止下来,我们在检测的时候只需要将为标量置一或置零,例如在定义一个联合体:Fgs_StopState Fstop;将某一位置一或清零就可以这么写:Fstop.bit.fAmpErr = 1;在处理数据的时候,我们便于将数据统一处理,所以再此调用 (xx) =allbits;就可以读出所有变量数据了。例如只要以上的变量只要有一个为一就将电机停止,那么在C语言中我们就可以这样:3 y' o9 C( X9 _
                                   if(Fstop.allbits){ //电机停止运行}
                                   else           {//电机继续运行}- H2 P) i- y4 {; L
(2)如果遇到一个只能写不能读的寄存器,你该怎么做呢?还是利用typedef, union 和 struct
下面我们看一个程序
typedef union {
    struct {
3 l  o" `& u" Q0 U/ T        unsigned RA0                    :1;* m& C9 [$ v; K- J) {
        unsigned RA1                    :1;8 m% D6 v/ u  C" ~# E
        unsigned RA2                    :1;" P5 i  K; Y4 u- R* l
        unsigned RA3                    :1;
4 i' \% Z, |8 k$ e        unsigned RA4                    :1;+ ~: |# f; l7 d
        unsigned RA5                    :1;/ k6 ^; F) Y' h5 x+ ~4 N* w
    };
# M( L& W  E% n; H} PORTAbits_t;
1 R& F; H- ~; g8 Y  Y4 cextern volatile PORTAbits_t PORTAbits @ 0x00C;; B7 c! g& e" C) U" |: r3 ]0 V
玩过PIC的人可能很熟悉这段代码,他是头文件里的一段IO的操作代码,我在利用国产单片机的时候遇到一个问题:这个寄存器只能写,不能读的,我想位操作,可能很多人认为简单例如:temp=temp|0x01;(temp为只写寄存器),不好意思在temp|0x01;这里已经读了temp了,即使编译通过通过了,你的数值也是不对的!!所以我大胆的利用以上的代码,嘿!既然可以了!的确很有意思!
: ~2 @/ `# ^5 K, T. W0 ]" d有人会问 @ 0x00c是什么意思,我的理解是这个寄存器的地址啦,下面有官方的说明:& |4 j/ r7 Z9 ?) [- K# q" T1 A' H
全局变量地址修改器(@ Address): o8 B" s9 i" m5 N
您可以将全局变量分配给特定的地址与全局变量地址修改器。这些变量被称为“绝对变量”。他们是有用的用于访问内存映射I / O端口,如下语法:3 s! J( d3 Z' F
Declaration = < TypeSpec > <Declarator>[@ <Address> | @“<Section >] [= <Initializer>];4 R! _) q" h' h* J" ?
      < TypeSpec >是类型说明符。        例如、int、char     
3 U1 ^; C& r! x6 l        <Declarator>是全局对象的标识符,    例如 ,i, glob
: f5 h3 S) u3 K0 r0 M        <Address> 是物体的绝对地址,       例如,0 xff04,0 x00 + 8     
) D& s/ R7 `5 Q3 \' X0 p        <Initializer>是初始化全局变量的值。
; |8 N- F5 t0 n: r所以我们在操作的时候,就可以PORTAbits .RA0=1;就把第一位置高了,此代码和上面(1)的代码本质差多的,只是在特殊用法上还是突出很大的优势的!
& y" L/ f6 T2 D: V. X. n

* c/ B$ c' a  x9 F/ c* d
  y' C) [, p( z6 v) a: m9 k6 ~. L

( \" n' j) y: ], ~
$ [& K% R! }6 q( E1 p& s# z4 s+ c+ U2 F4 g; L7 z

" ^1 r: a( v1 D" h- O未完。。。。。待更新!!!1 x  K/ o% W" S  i0 p
+ G' |. S) K+ k8 F, n6 P% v: T
赞 收藏 4 评论16 发布时间:2015-12-16 09:03

举报

16个回答
liurujia 回答时间:2015-12-17 10:06:58
本帖最后由 liurujia 于 2015-12-17 10:15 编辑
  {* y; P3 c5 V+ X3 s# j6 c' P) s* W; k6 |7 A$ u! N; g
typedef struct
3 x1 L$ q/ S5 @- H# v{. W% w' B8 X  K: e: F2 ?
        union
% V- p7 Q4 x- l1 ^5 q        {
6 R# N) ~6 ]6 K( o  Q7 a9 b0 Z3 N% _                u8 byte;
3 H& h" }2 d' i9 \$ D                struct
7 b6 X" F6 \8 x( J+ M                {
* R7 w4 b8 _# T0 i                        u8 bit0:1;
/ ]6 O% h/ R; u) E2 N8 t                        u8 bit1:1;( b% B; b- z9 K; |
                        u8 bit2:1;
% n$ y' F, s6 S                        u8 bit3:1;
8 r. t/ x" i6 O1 E2 j- ^                        u8 bit4:1;
% u7 H+ ]% ^- S- u% m) f                        u8 bit5:1;1 [- K0 b. }+ h$ U& c4 X/ ]) }
                        u8 bit6:1;
, r9 k% o6 f' w7 x! v. J( }3 O                        u8 bit7:1;6 h4 ^! m# d; X4 y3 t$ ^
                }FuntionFlag;//bits;
. I1 @* v% V+ \- O2 m: O        };        
0 k/ E, W: A" E8 [) l, e. I( ~}Byte_def;! H* {$ Q' }3 J3 z; |3 w; I; g
我也分享一个,很好用的说。解析一下,bitx:1后的表示占一位,union是一个共用体。Byte_def EBK,那就可以直接用EBK.FuntionFlag.bit0。1 E2 N3 W3 _! v7 Q
在加上宏定义define就清晰很多了,#defined EBKbrake EBK.FuntionFlag.bit0( x( J" u& g1 [$ o; M
钊钊 回答时间:2015-12-16 15:05:06
kusukusu 发表于 2015-12-16 09:42! B- ]9 F, y: J- Z; ]/ R
结构体很好用,就是一点不会,假如一个结构体定义在a.c,想要在b.c使用,如何在.h声明? ...
* \. v+ q) K( s, d) o& `2 ?3 E1 Z6 @
记得包含就可以了,& d  |% J  O; B- W$ t, S; P
可以用) g1 Z/ b0 e5 U5 e) y: v1 w6 s
#ifndef
  m# D; L! Z- g8 V. `+ _3 A6 W#define
: _- T( Q  X  {. ^7 a  l8 {4 [; Q( P- ]. N* H

, }# P* ^: [, @2 ]4 d#endif! B2 c' W- S) F
来避免重复包含,然后中间你随便搞,用一个大的 H 文件把所有的模块h 文件包含进去,然后你会发现所有的变量都可以用了,不过变量的声明要加 extern 这个关键词就好了
Mandelbrot_Set 回答时间:2015-12-16 15:08:30
kusukusu 发表于 2015-12-16 09:42% d  E: N) n: c. y3 {/ s
结构体很好用,就是一点不会,假如一个结构体定义在a.c,想要在b.c使用,如何在.h声明? ...

( ~8 q' P* ~% N/ Y" k随便打开一个诸如stm32f10x_gpio.h的文件" U' c, C2 j0 w) P- C' j! }
这里便有正确的用法.
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
% j1 ~9 y' M9 U# D/ I* S6 d9 A, \这个常用到。

+ y" S  N* b) r. S& c是的,常用到所以经典啊
kusukusu 回答时间:2015-12-17 08:54:39
Mandelbrot_Set 发表于 2015-12-16 15:08
1 V4 q. v8 E: w3 I8 B8 V随便打开一个诸如stm32f10x_gpio.h的文件
1 F3 a1 I* L. m9 j" L- M这里便有正确的用法.
" M) ~4 I! k' k% G7 O9 t
说的是,我忽略这个了
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:433 s2 v$ ~% o, H9 T5 p: ]  W
就一个啊
4 O& n8 h0 P1 f" D' y' F
在累积,以后会慢慢写
呦、小魔 回答时间:2015-12-18 09:33:08
多谢分享
dear祝子 回答时间:2015-12-29 15:14:49
liurujia 发表于 2015-12-17 10:06
8 J/ I; l% ?. B* W4 Otypedef struct $ g& @' _) V9 o2 z
{/ x1 |3 @# x# v9 w1 |! Q
        union
) S# t, f6 X2 e; S" E
谢谢大哥的分享!!非常感谢
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版