嵌入式编程
1.中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展--让标准C支持中断。其代表事实是,产生了一个新的关键字_interrupt.请看下面的程序(一个中断服务子程序ISR),请指出这段代码的错误
interrupt double comput_area(double radius)
{
double area=PI*radius*radius;
printf("\nArea=%f",area);
return area;
}
解答:
1)ISR不能返回一个值。2)ISR不能传递参数。3)在许多处理器中,浮点一般都是不可重入的
2.在嵌入式系统中,我们经常使用”volatile“关键字,它是什么意思?有什么含义,并给出三个例子。
解答:
当一个对象的值可能在编译器的控制或监测之外被改变时,例如一个被系统时钟更新的变量,那么该对象应该声明成volatile. 因此编译器执行的某些例行优化行为不能应用在已指定为volatile的对象上。通俗地讲是:一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。
volatile限定修饰符的用法与const非常相似 都是作为类型的附加修饰符。vplatile修饰符的主要目的是提示编译器该对象的值可能在编译器未检测到的情况下被改变,因此编译器不能武断地对引用这些对象的代码做优化处理。
三个例子:
1)并行设备的硬件寄存器。2)一个中断服务子程序中会访问到的非自动变量。3)多线程应用中被几个任务共享的变量。
3.关键字const有什么含义?
解答:不应该答”const意味着常数“,可以说const意味着”只读“,(接下来的解释不是没看懂啊)
关键字const的作用是为读你代码的人传达非常有用的信息。实际上,声明一个参数为常量是为了告诉用户这个参数的应用目的。合理使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意修改,简而言之,这样减少了bug的存在。
4 .一个参数可以既是const又是volatile吗?一个指针可以使volatile吗?解释为什么?.
解答:可以,一个例子就是只读的状态寄存器。它是volatile,因为它可能被意想不到地改变;它又是const, 因为程序不应该试图去修改它; 一个指针也可以是volatile,一个例子是当一个中断服务子程序修改一个指向一个buffer的指针时。
5 .关键字static的作用是什么?
解答:
1).在函数体内,一个被声明为静态的变量在这一函数被调用的过程中维持其值不变。
2).在模块内(在函数体外),一个被声明为静态的变量可以被模块内所有函数访问,但不能被模块外其他函数访问。
3)它是一个本地的全局变量。在模块内,一个被声明为静态的函数只可被这一模块内的其他函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。(这一点跟第二点有点像)
6.下面的函数有什么错误
int square(volatile int *ptr)
{
return *ptr * *ptr;
}
解答:这段代码的目的是用来返回指针*ptr指向值的平方,但是由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码:
int square(volatile int *ptr)
{
int a,b; a=*ptr;b=*ptr; return a*b;
}
由于*ptr的值可能被意想不到地改变,因此a和b可能是不同的。
需将函数体内的代码改成:int a;a=*ptr;return a*a;
7.Typedef在C语言中频繁用以声明一个已经存在的数据类型的同义字,也可以用预处理器做类似的事,思考一下
#define P1 struct s*和typedef struct s* P2 这两种情况都是定义一个作为指向结构s的指针,哪种方法更好呢?
解答:typedef更好,因为第一个会出现这样的情况: 如果有这样的 P1 ptr1,ptr2这个就会相当于 struct s* ptr1,ptr2。
这样ptr1是一个指针,而ptr2就是一个结构。