typedef用法
typedef工具是一个高级数据特性,利用typedef可以为某一类型自定义名称。 这方面与#define类似,但是两者有三处不同:
与#define不同, typedef创建的符号只受限于类型,不能用于值;
tyedef由编译器解释,不是预处理器;
在其受限范围内, typedef比#define更灵活;
假设要用BYTE表示1字节的数组,只需要像定义个char类型变量一样定义BYTE,然后再定义前面加上关键字typedef即可:
typedef unsigned char BYTE;
随后便可使用 BYTE 来定义变量:
BYTE x, y[10];
为现有类型创建一个名称,看起来是多此一举,但是它有时的确很有用。在前面的示例中,用BYTE代替unsigned char表明你打算用BYTE类型的变量表示数字而不是字符。使用typedef还能提高程序的可移植性。 用typedef来命名一个结构体类型的时候,可以省略该结构的标签( struct):
typedef struct {
char name[50];
unsigned int age;
float score;
} student_info;
student_info student={“Bob”, 15, 90.5};
使用typedef的第二个原因是: tyedef常用于给复杂的类型命名,例如: 把pFunction声明为一个函数,该函数返回一个指针,该指针指向一个void型。
typedef void (*pFunction)(void);
读信号
当处理器需要从外设芯片读取信号时,除了需要产生片选信号外,还需要告诉外设芯片这是一个读操作,而不是一个写操作,这是通过读信号来实现的。
预处理指令
#define、 #include、 #ifdef、 #else、 #endif、 #ifndef、 #if、 #elif
#line、 #error、 #pragma
根据程序中的预处理指令,预处理器把符号缩写替换成其表示的内容( #define)。预处理器可以包含程序所需的其它文件( #include),可以选择让编译器查看哪些代码(条件编译)。预处理器并不知道C语法,基本上它的工作是把一些文本转换成另外一些文本。
写信号
前面讲了读信号,我想对于写信号也就不难理解了,这个信号用于告诉外设芯片,这是一个向外设芯片写数据的操作。
#define 与#undef 用法
每行#define(逻辑行)都由3部分组成。
第1部分是#define指令本身;第2部分是选定是缩写,也称为宏,有些宏代表值;第3部分称为替换列表或替换体。
一旦预处理器在程序中找到宏的示例后,就会用替换体代替该宏。从宏变成最终替换文本的过程称为宏展开。需要注意是:预处理器会严格按照替换体直接替换,不做计算不做优先级处理,例如下面求取平方值的宏定义:
#define sqr(x) x*x
printf(“2 的平反: %d”, sqr(2));
输出的结果为4
printf(“2+2 的平方: %d”, sqr(2+2));
编译器就会这样展开:
printf(“2+2 的平方: %d”, 2+2 * 2+2);
输出的结果为8
但是实际按照逻辑2+2的平方是16,得到8的结果是因为前面所说的预处理器不会做计算只会严格按照替换体的文本进行直接替换,因而为了避免类似的问题出现,我们应该这样改写平凡宏定义:
#define sqr(x) ((x)*(x))
printf(“2+2 的平反: %d”, ((2+2)*(2+2)));
前面提到了外设(芯片),现在是对外设进行分类的时候了。大体上外设分为两类,一类是存储器外设,而另一类是非存储器外设,后者常被称之为I/O设备,这里的I/O是Input/Output的简写,即输入、输出。可见,I/O外设是一个非常宽泛的概念。对于存储器外设,其特点是,它所占用的空间是连续的一片。比如,SDRAM内存就是属于存储器外设,如果其容量是8M字节,那么其占用的地址空间也会是8M的。
与存储器外设所不同的是,I/O外设所点用的地址一般都很少。比如一个I/O外设可能存在多个控制寄存器,这些控制寄存器从处理器来看就是多个I/O端口(地址),向这个地址写数据就是向外设所对应的寄存器写数据,反之,也可以是读。比如,一个串口芯片可能存在多个寄存器,一个用来查询芯片的状态,一个用来设置芯片的功能,另一个用来读取芯片从串口线所收到的数据,最后,还有一个用来向芯片写数据以向串口线上发送数据。对于这一串口芯片的寄存器,从处理器的角度来看,都是独立的I/O端口。
I/O端口存在读、写性问题,有的端口是只读的,有的端口是只写的,还有的端口是即可读也可写,其读写性是由外设芯片的寄存器所决定的,在芯片的数据手册中能找到。需要指出的是,有些存储器外设也存在I/O端口,以对其进行一定的控制。从I/O端口这一名字来看,对于处理器来说,就是对从外面读入数据或是向外面输出数据的一个接口总称。