有关嵌入式的C语言知识
一. __I,__O,__IO
首先需要了解,改变变量的两种方式:一种是通过人为修改;另一种是通过读出寄存器中的值。
这是ST库里面的宏定义,定义如下:
#define __I volatile const /*!< defines 'read only' permissions*/
#define __O volatile /* !< defines 'write only' permissions */
#define __IO volatile /* !< defines 'read / write' permissions */
__I: 表示输入(即只读),即人为不能修改这个变量的值,但是可以通过读出寄存器中的值而改变
__O: 表示输出(即只写),它可以通过人为修改这个变量值,也可通过寄存器里面的值变化而变化
__IO: 表示输入输出(即可读写),功能与__O 功能一样
注意: volatile表示该变量值能够任意的变化!!!!!
int square(volatile int *ptr)
{
inta,b;
a =*ptr;
b =*ptr;
return a *b;
}
即表示最后返回的值表示的不是a的平方,因为a和b的值是不一样的
二. 关键字
extern
extern可以置于变量或者函数之前,以表示变量或者函数再别的文件中进行的定义,提示编译器遇到此变量和函数时需要在其他文件中去寻找定义。
extern int a;
或者
extern int show();
注意:
extern是一种声明关键字,而不是定义关键字。即extern能够声明多次,但是只能定义一次。声明不会在内存中给函数或者变量分配空间;而定义会在内存中分配空间
即 extern int a=2;
枚举类型enum
enum{
a=1,
b,
c,
}number;
大家通常可能看到的是每一个变量都赋值了。这种枚举类型含义是,b会在a的基础上+1,而c会在b的基础上+1。
注意:
一个整形变量不能直接赋值枚举类型,需要进行类型转换
int d;
b=(enum number)d;
register
功能:声明寄存器变量
volatile
功能:声明变量在程序执行中可被隐含地改变
三. 宏定义
使用宏定义可以提高源代码的可读性,为编程提供方便。
关键字是 define
#define 宏名 字符串
#:表示这是一条预处理命令,所有以#开头的都是预处理命令
宏名:是标识符的一种,命名规则与变量相同
字符串:可以是常数数字,格式串,表达式,if语句,函数等
例如:
#define INT_LEAST8_MAX 127
#define __stdint_h
#define __PASTE(x, y) __PASTE2(x, y)
#define LED_ONOFF(GPIOX,Pin,n) GPIO_WriteBit(GPIOX,Pin,(BitAction)n)
注意:
宏名可以带参数,此时就是带参数的宏定义,宏名中不能有空格,宏名与形参表之间也不能有空格,而形参表之间可以有空格。
四. 条件编译
#ifdef 标识符
程序段1
#else
程序段2
#endif
功能:当标识符被定义了之后,执行程序段1,否则执行程序段2.
在头文件中常见的格式:
#ifndef __LED_H
#define __LED_H
#endif