面试问题
拓展问题
精读过什么编程语言,软件设计方面的书籍?有什么感想(钻研精神)
在项目空隙,如何在浩瀚的学习资料中去巩固自己的知识?(时效性,权威性)
有看过什么写的比较好的blog,book,专家之类的,如高焕堂, jollen
普通问题
调试程序的方法,死机崩溃的处理方法
CPP面试题
cpp定义的函数如何被c代码使用?
纯虚函数和虚函数有什么不同?
虚函数可以被直接使用,也可以被子类(sub class)重写以后以多态的形式调用,而纯虚函数必须在子类(sub class)中实现该函数才可以使用,因为纯虚函数在基类(baseclass)只有声明而没有定义。
虚函数中能否定义static变量,为什么?
在虚函数和纯虚函数的定义中不能有static标识符,原因很简单,被static修饰的函数在编译时候要求前期bind,然而虚函数却是动态绑定(run-time bind),而且被两者修饰的函数生命周期(liferecycle)也不一样。
构造函数可否是虚汗数,为什么?析构函数呢,可否是纯虚的呢?
构造函数不能为虚函数,要构造一个对象,必须清楚地知道要构造什么,否则无法构造一个对象。
析构函数可以为纯虚函数。
C语言面试题
C调用CPP和CPP调用C这两种方式需要如何做?即函数定义和声明的地方有什么注意的地方?
void *__func__(const void *buf, const int size); -> 有何问题?
堆和栈分别什么时候用到?
内联函数和宏定义的区别?
字节序(big endian和little endian)
字节对齐(数据对齐(data alignment))
指针使用
用变量a给出下面的定义
a) 一个整型数(An integer)
b)一个指向整型数的指针( A pointer to an integer)
c)一个指向指针的的指针,它指向的指针是指向一个整型数( A pointer to a pointer to anintege)r
d)一个有10个整型数的数组( An array of 10 integers)
e) 一个有10个指针的数组,该指针是指向一个整型数的。(An array of10 pointers to
integers)
f) 一个指向有10个整型数数组的指针( A pointer to anarray of 10 integers)
g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function
that takes aninteger as an argument and returns an integer)
h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数(An array of ten pointers to functions that take an integer argument and returnan integer )
答案是:
a) int a; // Aninteger
b) int *a; // Apointer to an integer
c) int **a; //A pointer to a pointer to an integer
d) int a[10];// An array of 10 integers
e) int *a[10];// An array of 10 pointers to integers
f) int(*a)[10]; // A pointer to an array of 10 integers
g) int(*a)(int); // A pointer to a function a that
takes aninteger argument and returns an integer
h) int(*a[10])(int); // An array of 10 pointers to
functions thattake an integer argument and return an
integer
const int a;
int const a;
const int *a;
int * const a;
int const * aconst;
/******/
前两个的作用是一样,a是一个常整型数。
第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。
第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。
最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。
关键字volatile
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
1) 并行设备的硬件寄存器(如:状态寄存器)
2) 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
3) 多线程应用中被几个任务共享的变量
回答不出这个问题的人是不会被雇佣的。我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。搞嵌入式的家伙们经常同硬件、中断、RTOS等等打交道,所有这些都要求用到volatile变量。不懂得volatile的内容将会带来灾难。 假设被面试者正确地回答了这是问题(嗯,怀疑是否会是这样),我将稍微深究一下,看一下这家伙是不是直正懂得volatile完全的重要性。
1)一个参数既可以是const还可以是volatile吗?解释为什么。
2); 一个指针可以是volatile 吗?解释为什么。
下面是答案:
1)是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
2); 是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。
位操作(Bit manipulation)
嵌入式系统总是要用户对变量或寄存器进行位操作。给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a的bit 3。在以上两个操作中,要保持其它位不变。
3) 用 #defines 和 bit masks 操作。这是一个有极高可移植性的方法,是应该被用到的方法。最佳的解决方案如下:
#define BIT3(0x1 << 3)
static int a;
voidset_bit3(void)
{
a |= BIT3;
}
voidclear_bit3(void)
{
a &= ~BIT3;
}
/***位段赋值***/
Data = Data& (~( 15 << 4 )) | ( n & 15 << 4 )
其中 Data16位,改变4~7位的值为n中4~7位的值
访问固定的内存位置(Accessing fixedmemory locations)
嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。
在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。编译器是一个纯粹的ANSI编译器。写代码去完成这一任务。这一问题测试你是否知道为了访问一绝对地址把一个整型数强制转换(typecast)为一指针是合法的。这一问题的实现方式随着个人风格不同而不同。典型的类似代码如下:
int *ptr;
ptr = (int*)0x67a9;
*ptr = 0xaa55;
A more obscureapproach is: ( 一个较晦涩的方法是):
*(int *const)(0x67a9) = 0xaa55;
中断(Interrupts)
中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展—让标准C支持中断。具代表事实是,产生了一个新的关键字__interrupt。下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。
__interruptdouble compute_area (double radius)
{
double area = PI* radius * radius;
printf("\nArea= %f", area);
return area;
}
这个函数有太多的错误了,以至让人不知从何说起了:
1)ISR 不能返回一个值。如果你不懂这个,那么你不会被雇用的。
2) ISR 不能传递参数。如果你没有看到这一点,你被雇用的机会等同第一项。
3) 在许多的处理器/编译器中,浮点一般都是不可重入的。有些处理器/编译器需要让额处的寄存器入栈,有些处理器/编译器就是不允许在ISR中做浮点运算。此外,ISR应该是短而有效率的,在ISR中做浮点运算是不明智的。
4) 与第三点一脉相承,printf()经常有重入和性能上的问题。如果你丢掉了第三和第四点,我不会太为难你的。不用说,如果你能得到后两点,那么你的被雇用前景越来越光明了。
数据类型转换
下面的代码输出是什么,为什么?
void foo(void)
{
unsigned int a= 6;
int b = -20;
(a+b > 6) ?puts("> 6") : puts("<= 6");
}
这个问题测试你是否懂得C语言中的整数自动转换原则,我发现有些开发者懂得极少这些东西。不管如何,这无符号整型问题的答案是输出是">6"。原因是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。因此-20变成了一个非常大的正整数,所以该表达式计算出的结果大于6。这一点对于应当频繁用到无符号数据类型的嵌入式系统来说是丰常重要的。
Android
andoid线程消息机制介绍?消息有无优先级之分?如何利用android的消息处理机制来构建 存在消息优先级的系统?
HAL stub框架的理解?
移植一个新的Modem,需要做什么事情?即 如何修改RIL?
Linux
调试手段常用的sysfs和proc接口的区别?
自旋锁在使用中需要注意哪几点?在什么情况下会死锁,举个列子
信号量和自旋锁有什么区别?
多线程编程在软件设计和编码中需要注意什么?或者说比单线程编程复杂在哪里?如何保证线程安全,即代码可重入?同步和互斥对应的系统接口以及如何使用?
如何避免内存泄漏,以及内存泄漏如何检测?
多线程
1.process和thread的本质区别?谈谈你对thread存在的必要性和好处?
2.process之间为何不能方便的共享数据?
3.pthread库在kernel中如何实现的?
4.多线程设计需要注意哪几点?
线程退出有几种方式?
死锁例子
Socket
阻塞和非阻塞socket的区别?
非阻塞socket如何判断断开?
Block +recv(WAITALL) : 返回值是否一定等于期望读取的字节数?为什么?
TCP/IP协议栈的分片是在哪一层做的?为什么要分片?
网络编程调试中用到哪些工具/命令,来查看网络延时,网络速度等
OOP
列举出几种常用的设计模式