标签:style 定义宏 plain alt ring byte info cas inf
先聊一聊:
之前使用32都是用的库函数,但是没有理解为什么那么操作,有很多的文件我也不知道要看哪一个,感觉云里雾里,没有学清楚一件东西的感觉不太好,于是就在前几天一直跟着比较详细的视频学习。开始老师讲的方式是使用寻址以及寄存器的方式,我觉得这种比使用库函数要好理解,但是在几个视频之后会发现,开始讲解库了?嗯哼~我是拒绝的呀,带着十分抗拒的心情继续学习,这一次又有了一些不一样的理解。
为什么使用库呢?因为很多的函数都已经被32制造者写好了,就相当于我们喝红豆薏米粉吧(最近在喝,所以举个例子哈),没有库函数就是我们拿到红豆、薏米这些原材料,自己进行打磨一系列的步骤,但是有了库,也就是将薏米粉罐装起来了,我们直接使用就可以了,怎么用呢,那就可以翻看产品说明了,也是就在32之中的查看函数的definition了。
库在哪里?怎么整合起来的呢?拿之前的LED灯来讲吧,在32f429xx.h的文件与GPIO.h文件之中,我们将寄存器与地址的映射以及引脚进行定义,然后接着我们写一个函数,函数在.c文件之中,.c文件就可以使用h文件之中声明好的一些量,后将该函数在h文件之中再声明一下,感觉.h文件像是一个播报器,将有什么内容写在里面,至于怎么操作那就是在c语言之中的事情了呢~
接下来,我们要创建一个真正的文件夹,开始展示真正的技术了
学习步骤:
- 创建一个文件夹,这个之中要放其他的文件夹哦(命名为ex2)
- 在里面创建四个文件
- 新建一个工程,将工程保存在ex2之中的project之中
- 在project之中添加group
C语言知识总结:
以下是宏的一些学习
2,重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。这里已经不是#define的范畴了。
typedef unsignedcharboolean;/* Boolean value type. */
typedef unsignedlongintuint32;/* Unsigned 32 bit value */typedef unsignedshortuint16;/* Unsigned 16 bit value */typedef unsignedcharuint8;/* Unsigned 8 bit value */typedef signedlongintint32;/* Signed 32 bit value */typedef signedshortint16;/* Signed 16 bit value */typedef signedcharint8;/* Signed 8 bit value */
3,得到指定地址上的一个字节或字
12#define MEM_B( x ) ( *( (byte*) (x) ) )#define MEM_W( x ) ( *( (word *) (x) ) )4,求最大值和最小值
12#define MAX( x, y ) ( ((x) > (y)) ? (x) : (y) )#define MIN( x, y ) ( ((x) < (y)) ? (x) : (y) )5,得到一个field在结构体(struct)中的偏移量
12#define FPOS( type, field ) \/*lint -e545 */( (dword) &(( type *)0)-> field )/*lint +e545 */6,得到一个结构体中field所占用的字节数
1#define FSIZ( type, field ) sizeof( ((type *)0)->field )7,按照LSB格式把两个字节转化为一个Word
1#define FLIPW( ray ) ( (((word) (ray)[0]) *256) + (ray)[1] )8,按照LSB格式把一个Word转化为两个字节
12345#define FLOPW( ray, val ) \(ray)[0] = ((val) /256); \(ray)[1] = ((val) &0xFF)9,得到一个变量的地址(word宽度)
123#define B_PTR( var ) ( (byte*) (void*) &(var) )#define W_PTR( var ) ( (word *) (void*) &(var) )10,得到一个字的高位和低位字节
123#define WORD_LO(xxx) ((byte) ((word)(xxx) &255))#define WORD_HI(xxx) ((byte) ((word)(xxx) >>8))11,返回一个比X大的最接近的8的倍数
1#define RND8( x ) ((((x) +7) /8) *8)12,将一个字母转换为大写
1#define UPCASE( c ) ( ((c) >=‘a‘&& (c) <=‘z‘) ? ((c) -0x20) : (c) )13,判断字符是不是10进值的数字
1#define DECCHK( c ) ((c) >=‘0‘&& (c) <=‘9‘)14,判断字符是不是16进值的数字
12345#define HEXCHK( c ) ( ((c) >=‘0‘&& (c) <=‘9‘) ||\((c) >=‘A‘&& (c) <=‘F‘) ||\((c) >=‘a‘&& (c) <=‘f‘) )15,防止溢出的一个方法
1#define INC_SAT( val ) (val = ((val)+1> (val)) ? (val)+1: (val))16,返回数组元素的个数
1#define ARR_SIZE( a ) ( sizeof( (a) ) / sizeof( (a[0]) ) )17,返回一个无符号数n尾的值MOD_BY_POWER_OF_TWO(X,n)=X%(2^n)
12#define MOD_BY_POWER_OF_TWO( val, mod_by ) \( (dword)(val) & (dword)((mod_by)-1) )18,对于IO空间映射在存储空间的结构,输入输出处理
1234567891011#define inp(port) (*((volatilebyte*) (port)))#define inpw(port) (*((volatileword *) (port)))#define inpdw(port) (*((volatiledword *)(port)))#define outp(port, val) (*((volatilebyte*) (port)) = ((byte) (val)))#define outpw(port, val) (*((volatileword *) (port)) = ((word) (val)))#define outpdw(port, val) (*((volatiledword *) (port)) = ((dword) (val)))19,使用一些宏跟踪调试
A N S I标准说明了五个预定义的宏名。它们是:
12345_ LINE __ FILE __ DATE __ TIME __ STDC _可以定义宏,例如:
当定义了_DEBUG,输出数据信息和所在文件所在行
123456789#ifdef _DEBUG#define DEBUGMSG(msg,date) printf(msg);printf(“%d%d%d”,date,_LINE_,_FILE_)#else#define DEBUGMSG(msg,date)#endif20,宏定义防止使用是错误
用小括号包含。
例如:
1#define ADD(a,b) (a+b)用do{}while(0)语句包含多语句防止错误
例如:
123#define DO(a,b) a+b;\a++;应用时:
12345if(….)DO(a,b);//产生错误else解决方法: 代码就只会执行一次。和直接加花括号有什么区别呢。哦对,不能随便在程序中,任意加{},组成代码块的。
123#define DO(a,b)do{a+b;\a++;}while(0)部分摘自:http://haore147.cnblogs.com/
标签:style 定义宏 plain alt ring byte info cas inf
原文地址:https://www.cnblogs.com/sherlocksweet/p/11408641.html