1. 写一个“标准”宏 MIN,这个宏输入两个参数并返回较小的一个。(5 分)
答:
#define MIN(a,b) (((a) >= (b)) ? (b) : (a))
2. 对于 32 位无符号变量 A=0x12345678, 8 位无符号指针 p=&A,请分别指出
在小端(little endian) 和大端(big endian) 处理器下, p[0], p[1], p[2],
p[3]的值。(5 分)
答:
小端: p[0] = 0x78, p[1] = 0x56, p[2] = 0x34, p[3] = 0x12;
大端: p[0] = 0x12, p[1] = 0x34, p[2] = 0x56, p[3] = 0x78;
3. 关键字 static 的作用是什么? (10 分)
答:
1. 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2. 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能 被模块外其它函数访问。它是一个本地的全局变量。
3. 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。
4. 下面的代码使用了__interrupt 关键字去定义了一个中断服务子程序(ISR),
请评论一下这段代码。 (10 分)
__interrupt double compute_area (double radius)
{
double area = PI * radius * radius;
printf(" Area = %f", area);
return area;
}
答:
1.ISR不能有返回值,必须用void;
2.ISR不能传递参数,必须用void;
3.ISR中不应该有重入和性能上的问题,因此使用printf(" Area = %f", area);是不好的.
5. 32 位处理器,有如下定义:
typedef union {
long i;
int k[5];
char c;
} DATE;
struct data {
int cat;
DATE cow;
double dog;
} test;
请指出 long、 int、 char、 double 分别占几个字节, sizeof(struct date)
等于几? (10 分)
答:
long:4
int:20
char:1
double:8
sizeof(struct date):32
6. 请写出执行下列代码后,最后 a, b, c, d 的值各位多少? (10 分)
int a,b,c,d;
a=8;
b=a++;
c=++a;
d=10*a++;
答:
a=11 b=8 c=10 d=100
7. 通过什么方法来检查或判断嵌入式程序的堆栈是否溢出?( 10 分)
答:
1.软件预设检测法
2.堆栈限制寄存器
3.MPU替代法
8. 请解释一下在嵌入式系统中 TEXT 段, DATA 段, BSS 段分别代表什么?
常量,局部变量,全局变量经过编译器编译后分别会放到哪个段或者其它地
方?(10 分)
答:
TEXT:TEXT段是程序代码段
DATA:DATA包含静态初始化的数据,所以有初值的全局变量和static变量在data区。
BSS:通常是指用来存放程序中未初始化的全局变量的一块内存区域,在程序载入时由内核清0。BSS段属于静态内存分配。
常量:DATA
局部变量:DATA
全局变量:有初始化的放DATA,没初始化的放BSS
9. 请解释一下 CACHE 和 DMA 在嵌入式 CPU 中如何加速系统的运行性能?
(10 分)
答:
CACHE:
读机制:CPU需要读取时,先访问Cache,如果Cache中有,称为Hit命中,读走即可;
若CPU需要读取的内容在Cache中没有,CPU还是要去读取RAM,读走后,Cache也将该片的内容缓存起来;
写机制当CPU需要写内存时,先写在Cache里,并且修改一个叫DietyBit的标志位,但暂时不更新在RAM中
只有当Cache需要缓存新内容时,而Cache空间又满了,需要覆盖这一块区域,才会去检查DietyBit标志位,如果查到有写记录,则把这些修改更新到RAM中再去写入新缓存
DMA:纯硬件操作,不占CPU资源。
10. 写一个函数来返回 unsigned int 类型的参数中 bit 1 出现的次数(10 分)
答:
#include "stdio.h"
int CalBitNum(unsigned int a)
{
int count = 0;
while(a)
{
count++;
a = a & (a - 1);
}
return count;
}