嵌入式常用指令合集

1、#if和#endif指令

问:OS_EVENT *OSMutexDel (OS_EVENT *pevent, INT8U opt, INT8U *err) 
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
.....
}

答:c语言里所有以#开头的都是预编译指令,就是在正式编译之前,让编译器做一些预处理的工作。
#if和#endif是配对的,叫做条件编译指令,如果满足#if后面的条件,就编译#if和#endif之间的程序段,否则不编译。
比如这段程序,如果常量OS_CRITICAL_METHOD的值为3就编译下面的一条语句。

2、const

问:int i;const int *p; int *const p=&i;const int *const p=&i三者有何区别?
答:1. const int *p——const用来修饰int *, *p的内容不可变,
比如你定义了const int *p=5;
那么你再对p的内容赋值就是不合法的:*p=6; // no!
2. int *const p=&i;——const用来修饰 p, 指针p的地址不可变,
int i=0;
int j;
int *const p=&i;
p=&j; // no!
i=1; // ok!
3.const int *const p=&i——限制了指针指向的内容和指向的地址。

3、extern用法

问:在main中声明了一个int a;而在另一个函数(假设为f)也要用到这个a,我在f中这样写extern a;显示错误,为什么?extern怎样用?还有一个问题是不是有一个*.h就有一个*.cpp如果有在哪能找到?
答: extern 都是对 全局变量 来说的,你既然将a(int)已经定义到了 main函数 中了,也就是说:a 的作用域就是main了,不然作用域不久不起作用了吗 
如果你要将main中的那个int a用到f中,那是不可以的,但是你可以讲a(int)声明(定义)为全局变量,然后用 extern 就可以了(如果f和main不在一个.cpp中)  http://zhidao.baidu.com/question/96882132.html 
(snpsprcsac)你可以看看! 
. h和.cpp是“独立”的,但有不是完全独立的,.h中用extern就可以用.cpp中定义的变量(常量)了,但翻过了不行(我在extern中也说到了这个问题)还有就是, 一般情况下,如果有程序中有类的话,类的定义在*.h中,对应的就有类的实现在*.cpp(名字一样)中!

4、uint数据类型

问:uint8_t是什么意思?
答:按照posix标准,一般整形对应的*_t类型为:
1字节     uint8_t
2字节     uint16_t
4字节     uint32_t
8字节     uint64_t

5、static作用

问:static的作用是什么?
答:(1)函数体内static 变量的作用范围为该函数体,不同于 auto 变量,该变量的内存只被分配一次,
因此其值在下次调用时仍维持上次的值;
(2)在模块内的static 全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;
(3)在模块内的static 函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明
它的模块内;
(4)在类中的static 成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;
(5)在类中的static 成员函数属于整个类所拥有,这个函数不接收 this 指针,因而只能访问类的static 成员变量。

6、结构体定义类型

问:C语言中定义结构体类型有哪几种方法?
答:1) 先定义结构体类型,再定义结构体类型变量:
struct stu / *定义学生结构体类型* /
{
    char name[20]; / * 学生姓名* /
    char sex; / * 性别* /
    long num; / *学号* /
    float score[3]; / * 三科考试成绩* /
};
struct stu student1,student2;/ * 定义结构体类型变量* /
struct stu student3,student4;

用此结构体类型,可以定义更多的该结构体类型变量。

2 ) 定义结构体类型同时定义结构体类型变量:
struct data
{
    int day;
    int month;
    int year;
} time1,time2;
也可以再定义如下变量:
struct data time3,time4;

用此结构体类型,同样可以定义更多的该结构体类型变量。

3) 直接定义结构体类型变量:
struct
{
    char name[20]; / *学生姓名* /
    char sex; / *性别* /
    long num; / *学号* /
    float score[3]; / *三科考试成绩* /
} person1,person2; / *定义该结构体类型变量* /
该定义方法由于无法记录该结构体类型,所以除直接定义外,不能再定义该结构体类型变量。

7、宏定义

问:什么是宏定义及其特点是什么?
答:1.不带参数的宏定义
宏定义又称为宏代换、宏替换,简称“宏”。
格式:
#define 标识符 字符串
其中的标识符就是所谓的符号常量,也称为“宏名”。
预处理(预编译)工作也叫做宏展开:将宏名替换为字符串。
掌握"宏"概念的关键是“换”。一切以换为前提、做任何事情之前先要换,准确理解之前就要“换”。
即在对相关命令或语句的含义和功能作具体分析之前就要换:
例:
#define PI 3.1415926
把程序中出现的PI全部换成3.1415926
说明:
(1)宏名一般用大写
(2)使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。例如:数组大小常用宏定义
(3)预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查。
(4)宏定义末尾不加分号;
(5)宏定义写在函数的花括号外边,作用域为其后的程序,通常在文件的最开头。
(6)可以用#undef命令终止宏定义的作用域
(7)宏定义可以嵌套
(8)字符串" "中永远不包含宏
(9)宏定义不分配内存,变量定义分配内存。
2.带参数的宏:
除了一般的字符串替换,还要做参数代换
格式:
#define 宏名(参数表) 字符串
例如:#define S(a,b) a*b
area=S(3,2);第一步被换为area=a*b; ,第二步被换为area=3*2;
类似于函数调用,有一个哑实结合的过程:
(1)实参如果是表达式容易出问题
#define S(r) r*r
area=S(a+b);第一步换为area=r*r;,第二步被换为area=a+b*a+b;
正确的宏定义是#define S(r) (r)*(r)
(2)宏名和参数的括号间不能有空格
(3)宏替换只作替换,不做计算,不做表达式求解
(4)函数调用在编译后程序运行时进行,并且分配内存。宏替换在编译前进行,不分配内存
(5)宏的哑实结合不存在类型,也没有类型转换
(6)函数只有一个返回值,利用宏则可以设法得到多个值
(7)宏展开使源程序变长,函数调用不会
(8)宏展开不占运行时间,只占编译时间,函数调用占运行时间(分配内存、保留现场、值传递、返回值)

8、指针

问:什么是指针?
答:
1、指针是C语言中广泛使用的一种数据类型。 在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。

2、例程:

#include 
main()
{
char *pT;  //声明一个字符指针pT
char t='h';  //生一个字符变量t,其值等于'h'
pT=&t;  //把t的地址赋值给指针pT
putchar(*pT); //输出pT指针所指向地址的值,这里输出的是 h
}


你可能感兴趣的:(嵌入式软件设计)