1.关键字 volatile 有什么含义?给出三个不 同的例子
关键字 volatile 是防止变量被编译器优化。 被 volatile 修饰的变量,编译器不会去假设 该变量的值,当优化器每次用到该变量的值时, 都会去变量的原始地址去读取这个变量的值, 而不是使用保存在寄存器中的备份值。
例子:(1)并行设备的硬件寄存器。 (2)一个中断服务子程序中的非自动 变量。 (3)多线程应用中被几个线程任务共 享的变量。
2.一个参数既可以是const还可以是volatile 吗?解释为什么?
可以。一个例子是只读的状态寄存器。它 是 volatile 因为它可能被意想不到地改变。 它是 const 因为程序不应该试图去修改它。
3.一个指针可以是 volatile 吗?解释为什 么?
可以。尽管这并不常见。一个例子是当一 个中断服务子程序修改一个指向 buffer 的指针时。
4.static 全局变量与普通的全局变量有什么 区别?static 局部变量和普通局部变量有什 么区别?static 函数与普通函数有什么区 别?
static 全局变量与普通的全局变量有什么 区别:
static 修饰的全局变量只初使化一次, 且不能在其他文件单元中被引用;
static 局部变量和普通局部变量有什么区 别:
static 修饰的局部变量生命周期从程序开 始到程序结束,且只被初始化一次,下一次依 据上一次结果值;
static 函数与普通函数有什么区别:
static 函数在内存中只有一份,普通函数在每 个被调用中维持一份拷贝。
5.找出下面一段 ISR 的问题。
_interrupt double cpmpute_area(double radius)
{
Double area = PI * radius * radius;
Printf(“\nArea = %f”,area);
Return area;
}
答:(1)ISR 不能有参数。
(2)ISR 不能有返回值。
(3)ISR 应该短且有效率,在 ISR 中做浮点 运算不明智。
6.typedef 与#define 的区别。
#define 在预编译的时候做简单的字符替换处 理。
typedef 是在编译的时候进行的处理,并不是 做简单的字符替换,而是同定义一个变量一样 声明一个数据类型,然后用它去定义这种数据 类型的变量。
7.Union 与 struct 的区别。(故而常用 struct)
1.在存储多个成员信息时,编译器会自动给 struct 每个成员分配存储空间,struct 可以 存储多个成员信息,而 Union 每个成员会用同 一个存储空间,只能存储最后一个成员的信息。
2.都是由多个不同的数据类型成员组成,但在 任何同一时刻,Union 只存放了一个被先选中 的成员,而结构体的所有成员都存在。
3.对于 Union 的不同成员赋值,将会对其他成 员重写,原来成员的值就不存在了,而对于 struct 的不同成员赋值 是互不影响的。
8.引用和指针有什么区别?
1、引用必须初始化,指针不必;
2、引用初始化后不能改变,指针可以被改变;
3、不存在指向空值的引用,但存在指向空值 的指针;
9.请说出 const 与#define 相比,有何优点? (故而常用 const)
1、const 定义的是只读变量,#define 为 宏替换
2、const 不会改变变量的存储位置, #define 定义的宏存储在代码段
3、const 常量有数据类型,而宏常量没 有数据类型。
4、编译器可以对前者进行类型安全检查。 而对后者只进行字符替换,没有类型安全检查, 并且在字符替换可能会产生意料不到的错误。
10.TCP 与 UDP 的区别?
(1)TCP 是面向连接的协议,UDP 是面向无 连接的协议。
(2)TCP 对系统资源要求较多,UDP 对系统 资源要求较少。
(3)TCP 是数据流模式,UDP 是数据报模式。
(4)TCP 保证数据顺序及数据的正确性,UDP 可能会丢包。