Linux嵌入式经典面试题

Linux嵌入式经典面试题
Linux嵌入式经典面试题

C语言测试是招聘嵌入式系统程序员过程中必须而且有效的方法。这些年,我既参加也组织了许多这种测试,在这过程中我意识到这些测试能为面试者和被面试者提供许多有用信息,此外,撇开面试的压力不谈,这种测试也是相当有趣的。

从被面试者的角度来讲,你能了解许多关于出题者或监考者的情况。这个测试只是出题者为显示其对ANSI标准细节的知识而不是技术技巧而设计吗?这是个愚蠢的问题吗?如要你答出某个字符的ASCII值。这些问题着重考察你的系统调用和内存分配策略方面的能力吗?这标志着出题者也许花时间在微机上而不是在嵌入式系统上。如果上述任何问题的答案是"是"的话,那么我知道我得认真考虑我是否应该去做这份工作。

从面试者的角度来讲,一个测试也许能从多方面揭示应试者的素质:最基本的,你能了解应试者C语言的水平。不管怎么样,看一下这人如何回答他不会的问题也是满有趣。应试者是以好的直觉做出明智的选择,还是只是瞎蒙呢?当应试者在某个问题上卡住时是找借口呢,还是表现出对问题的真正的好奇心,把这看成学习的机会呢?我发现这些信息与他们的测试成绩一样有用。

有了这些想法,我决定出一些真正针对嵌入式系统的考题,希望这些令人头痛的考题能给正在找工作的人一点帮助。这些问题都是我这些年实际碰到的。其中有些题很难,但它们应该都能给你一点启迪。

这个测试适于不同水平的应试者,大多数初级水平的应试者的成绩会很差,经验丰富的程序员应该有很好的成绩。为了让你能自己决定某些问题的偏好,每个问题没有分配分数,如果选择这些考题为你所用,请自行按你的意思分配分数。

预处理器(Preprocessor)

1 . 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)

#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL

我在这想看到几件事情:

1) #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)

2)懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。

3) 意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。

4) 如果你在你的表达式中用到UL(表示无符号长整型),那么你有了一个好的起点。记住,第一印象很重要。

2 . 写一个"标准"宏MIN ,这个宏输入两个参数并返回较小的一个。

#define MIN(A,B) ((A)<= (B) ? (A) : (B))

这个测试是为下面的目的而设的:

1) 标识#define在宏中应用的基本知识。这是很重要的。因为在嵌入(inline)操作符变为标准C的一部分之前,宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法。

2)三重条件操作符的知识。这个操作符存在C语言中的原因是它使得编译器能产生比if-then-else更优化的代码,了解这个用法是很重要的。

3) 懂得在宏中小心地把参数用括号括起来

4) 我也用这个问题开始讨论宏的副作用,例如:当你写下面的代码时会发生什么事?

least = MIN(*p++, b);

3. 预处理器标识#error的目的是什么?

如果你不知道答案,请看参考文献1。这问题对区分一个正常的伙计和一个书呆子是很有用的。只有书呆子才会读C语言课本的附录去找出象这种问题的答案。当然如果你不是在找一个书呆子,那么应试者最好希望自己不要知道答案。

死循环(Infinite loops)

4. 嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?

这个问题用几个解决方案。我首选的方案是:

while(1)

{

}

一些程序员更喜欢如下方案:

for(;;)

{

}

这个实现方式让我为难,因为这个语法没有确切表达到底怎么回事。如果一个应试者给出这个作为方案,我将用这个作为一个机会去探究他们这样做的基本原理。如果他们的基本答案是:"我被教着这样做,但从没有想到过为什么。"这会给我留下一个坏印象。

第三个方案是用goto

Loop:

...

goto Loop;

应试者如给出上面的方案,这说明或者他是一个汇编语言程序员(这也许是好事)或者他是一个想进入新领域的BASIC/FORTRAN程序员。

数据声明(Data declarations)

5. 用变量a给出下面的定义

a) 一个整型数(An integer)

b)一个指向整型数的指针(A pointer to an integer)

c)一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to a pointer to an intege)r

d)一个有10个整型数的数组(An array of 10 integers)

e) 一个有10个指针的数组,该指针是指向一个整型数的。(An array of 10 pointers to integers)

f) 一个指向有10个整型数数组的指针(A pointer to an array of 10 integers)

g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument and returns an integer)

h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数(An array of ten pointers to functions that take an integer argument and return an integer )

答案是:

a) int a; // An integer

b) int *a; // A pointer 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 an integer argument and returns an integer

h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer

人们经常声称这里有几个问题是那种要翻一下书才能回答的问题,我同意这种说法。当我写这篇文章时,为了确定语法的正确性,我的确查了一下书。但是当我被面试的时候,我期望被问到这个问题(或者相近的问题)。因为在被面试的这段时间里,我确定我知道这个问题的答案。应试者如果不知道所有的答案(或至少大部分答案),那么也就没有为这次面试做准备,如果该面试者没有为这次面试做准备,那么他又能为什么出准备呢?

Static

6. 关键字static的作用是什么?

这个简单的问题很少有人能回答完全。在C语言中,关键字static有三个明显的作用:

1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。

2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。

3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。

大多数应试者能正确回答第一部分,一部分能正确回答第二部分,同是很少的人能懂得第三部分。这是一个应试者的严重的缺点,因为他显然不懂得本地化数据和代码范围的好处和重要性。

Const

7.关键字const有什么含意?

我只要一听到被面试者说:"const意味着常数",我就知道我正在和一个业余者打交道。去年Dan Saks已经在他的文章里完全概括了const 的所有用法,因此ESP(译者:Embedded Systems Programming)的每一位读者应该非常熟悉const能做什么和不能做什么.如果你从没有读到那篇文章,只要能说出const意味着"只读"就可以了。尽管这个答案不是完全的答案,但我接受它作为一个正确的答案。(如果你想知道更详细的答案,仔细读一下Saks的文章吧。)

如果应试者能正确回答这个问题,我将问他一个附加的问题:

下面的声明都是什么意思?

const int a;

int const a;

const int *a;

int * const a;

int const * a const;

/******/

前两个的作用是一样,a是一个常整型数。第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。如果应试者能正确回答这些问题,那么他就给我留下了一个好印象。顺带提一句,也许你可能会问,即使不用关键字const,也还是能很容易写出功能正确的程序,那么我为什么还要如此看重关键字const呢?我也如下的几下理由:

1) 关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。

如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的。)

2) 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。

3) 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。

V olatile

8. 关键字volatile有什么含意?并给出三个不同的例子。

一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:

1) 并行设备的硬件寄存器(如:状态寄存器)

2) 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)

3) 多线程应用中被几个任务共享的变量

回答不出这个问题的人是不会被雇佣的。我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。搞嵌入式的家伙们经常同硬件、中断、RTOS等等打交道,所有这些都要求用到volatile变量。不懂得volatile的内容将会带来灾难。

假设被面试者正确地回答了这是问题(嗯,怀疑是否会是这样),我将稍微深究一下,看一下这家伙是不是直正懂得volatile完全的重要性。

1)一个参数既可以是const还可以是volatile吗?解释为什么。

2); 一个指针可以是volatile 吗?解释为什么。

3); 下面的函数有什么错误:

int square(volatile int *ptr)

{

return *ptr * *ptr;

}

下面是答案:

1)是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。

2); 是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。

3) 这段代码有点变态。这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码:

int square(volatile int *ptr)

{

int a,b;

a = *ptr;

b = *ptr;

return a * b;

}

由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下:

long square(volatile int *ptr)

{

int a;

a = *ptr;

return a * a;

}

位操作(Bit manipulation)

9. 嵌入式系统总是要用户对变量或寄存器进行位操作。给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a 的bit 3。在以上两个操作中,要保持其它位不变。

对这个问题有三种基本的反应

1)不知道如何下手。该被面者从没做过任何嵌入式系统的工作。

2) 用bit fields。Bit fields是被扔到C语言死角的东西,它保证你的代码在不同编译器之间是不可移植的,同时也保证了的你的代码是不可重用的。我最近不幸看到Infineon为其较复杂的通信芯片写的驱动程序,它用到了bit fields因此完全对我无用,因为我的编译器用其它的方式来实现bit fields的。从道德讲:永远不要让一个非嵌入式的家伙粘实际硬件的边。

3) 用#defines 和bit masks 操作。这是一个有极高可移植性的方法,是应该被用到的方法。最佳的解决方案如下:

#define BIT3 (0x1 << 3)

static int a;

void set_bit3(void)

{

a |= BIT3;

}

void clear_bit3(void)

{

a &= ~BIT3;

}

一些人喜欢为设置和清除值而定义一个掩码同时定义一些说明常数,这也是可以接受的。我希望看到几个要点:说明常数、|=和&=~操作。访问固定的内存位置(Accessing fixed memory locations)

10. 嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。编译器是一个纯粹的ANSI编译器。写代码去完成这一任务。

这一问题测试你是否知道为了访问一绝对地址把一个整型数强制转换(typecast)为一指针是合法的。这一问题的实现方式随着个人风格不同而不同。典型的类似代码如下:

int *ptr;

ptr = (int *)0x67a9;

*ptr = 0xaa55;

A more obscure approach is:

一个较晦涩的方法是:

*(int * const)(0x67a9) = 0xaa55;

即使你的品味更接近第二种方案,但我建议你在面试时使用第一种方案。

中断(Interrupts)

11. 中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展—让标准C支持中断。具代表事实是,产生了一个新的关键字__interrupt。下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。

__interrupt double compute_area (double radius)

{

double area = PI * radius * radius;

printf("\nArea = %f", area);

return area;

}

这个函数有太多的错误了,以至让人不知从何说起了:

1)ISR 不能返回一个值。如果你不懂这个,那么你不会被雇用的。

2) ISR 不能传递参数。如果你没有看到这一点,你被雇用的机会等同第一项。

3) 在许多的处理器/编译器中,浮点一般都是不可重入的。有些处理器/编译器需要让额处的寄存器入栈,有些处理器/编译器就是不允许在ISR中做浮点运算。此外,ISR应该是短而有效率的,在ISR中做浮点运算是不明智的。

华为嵌入式面试题

华为嵌入式系统面试题 (1)什么是预编译,何时需要预编译: 答案: 1、总是使用不经常改动的大型代码体。 2、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选 项。在这种情况下,可以将所有包含文件预编译为一个预编译头。 (2)char * const p char const * p const char *p 上述三个有 什么区别? 答案: char * const p; //常量指针,p的值不可以修改 char const * p;//指向常量的指针,指向的常量值不可以改 const char *p; //和char const *p (3)char str1[] = "abc"; char str2[] = "abc"; const char str3[] = "abc"; const char str4[] = "abc"; const char *str5 = "abc"; const char *str6 = "abc"; char *str7 = "abc"; char *str8 = "abc"; cout < < ( str1 == str2 ) < < endl; cout < < ( str3 == str4 ) < < endl; cout < < ( str5 == str6 ) < < endl; cout < < ( str7 == str8 ) < < endl; 结果是:0 0 1 1 str1,str2,str3,str4是数组变量,它们有各自的存空间;而 str5,str6,str7,str8是指针,它们指向相同的常量区域。 (4)以下代码中的两个sizeof用法有问题吗? [C易] void UpperCase( char str[] ) // 将 str 中的小写字母转换成大 写字母{ for( size_t i=0; i

linux认证-笔试-基础——简答题、编程和多选题.doc

limix笔试题一一简答题、编程题和多选题 %1.简答题: 1.简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过 程。 参考答案: Linux通过i节点表将文件的逻辑结构和物理结构进行转换。 i节点是一个64字节长的表,表中包含了文件的相关信息,其中有文件的大小、文件所有者、文件的存取许可方式以及文件的类型等重要信息。在i节点表中最重要的内容是磁盘地址表。在磁盘地址表中有13个块号,文件将以块号在磁盘地址表中出现的顺序依次读取相应的块。Linux文件系统通过把i节点和文件名进行连接,当需要读取该文件时,文件系统在当前目录表中查找该文件名对应的项,由此得到该文件相对应的i节点号,通过该i节点的磁盘地址表把分散存放的文件物理块连接成文件的逻辑结构。 2.简述进程的启动、终止的方式以及如何进行进程的查看。 参考答案: 在Linux中启动一个进程有手工启动和调度启动两种方式: (1)手工启动 用户在输入端发出命令,直接启动一个进程的启动方式。可以分为: %1前台启动:直接在SHELL中输入命令进行启动。 %1后台启动:启动一个目前并不紧急的进程,如打印进程。 (2)调度启动 系统管理员根据系统资源和进程占用资源的情况,事先进行调度安排,指定任务运行的时间和场合,到时候系统会自动完成该任务。 经常使用的进程调度命令为:at、batch> crontab o 3.简述DNS进行域名解析的过程。 参考答案: 首先,客户端发出DNS请求翻译IP地址或主机名。DNS服务器在收到客户机的请求后: (1)检查DNS服务器的缓存,若查到请求的地址或名字,即向客户机发出应答信息; (2)若没有查到,则在数据库中查找,若查到请求的地址或名字,即向客户机发出应答信息; (3)若没有查到,则将请求发给根域DNS服务器,并依序从根域查找顶级域,由顶级查找二级域,二级域查找三级,直至找到要解析的地址或名字,即向客户机所在网络的DNS服务器发出应答信息,DNS服务器收到应答后现在缓存中存储,然后,将解析结果发给客户机。 (4)若没有找到,则返回错误信息。 4.系统管理员的职责包括那些?管理的对象是什么? 参考答案:

经典嵌入式面试题

经典嵌入式面试题 C语言测试就是招聘嵌入式系统程序员过程中必须而且有效得方法。这些年,我既参加也组织了许多这种测试,在这过程中我意识到这些测试能为带面试者与被面试者提供许多有用信息,此外,撇开面试得压力不谈,这种测试也就是相当有趣得。 从被面试者得角度来讲,您能了解许多关于出题者或监考者得情况。这个测试只就是出题者为显示其对ANSI标准细节得知识而不就是技术技巧而设计吗?这个愚蠢得问题吗?如要您答出某个字符得ASCII值。这些问题着重考察您得系统调用与内存分配策略方面得能力吗?这标志着出题者也许花时间在微机上而不上在嵌入式系统上。如果上述任何问题得答案就是"就是"得话,那么我知道我得认真考虑我就是否应该去做这份工作。 从面试者得角度来讲,一个测试也许能从多方面揭示应试者得素质:最基本得,您能了解应试者C语言得水平。不管怎么样,瞧一下这人如何回答她不会得问题也就是满有趣。应试者就是以好得直觉做出明智得选择,还就是只就是瞎蒙呢?当应试者在某个问题上卡住时就是找借口呢,还就是表现出对问题得真正得好奇心,把这瞧成学习得机会呢?我发现这些信息与她们得测试成绩一样有用。 有了这些想法,我决定出一些真正针对嵌入式系统得考题,希望这些令人头痛得考题能给正在找工作得人一点帮住。这些问题都就是我这

些年实际碰到得。其中有些题很难,但它们应该都能给您一点启迪。这个测试适于不同水平得应试者,大多数初级水平得应试者得成绩会很差,经验丰富得程序员应该有很好得成绩。为了让您能自己决定某些问题得偏好,每个问题没有分配分数,如果选择这些考题为您所用, 请自行按您得意思分配分数。 预处理器(Preprocessor)?1、用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #defineSECONDS_PER_YEAR(60 *60 *24 * 365)UL?我在这想瞧到几件事情: ?; #define 语法得基本知识(例如:不能以分号结束,括号得使用,等等) ?;懂得预处理器将为您计算常数表达式得值,因此,直接写出您就是如何计算一年中有多少秒而不就是计算出实际得值,就是更清晰而没有代价得。 ?; 意识到这个表达式将使一个16位机得整型数溢出-因此要用到长整型符号L,告诉编译器这个常数就是得长整型数。??;如果您在您得表达式中用到UL(表示无符号长整型),那么您有了一个好得起点。记住,第一印象很重要。 2、写一个"标准"宏MIN ,这个宏输入两个参数并返回较小得一个。#defineMIN(A,B) ((A) <=(B)? (A): (B) )

华为经典嵌入式面试题集资料

(1)什么是预编译,何时需要预编译: 答案: 1、总是使用不经常改动的大型代码体。 2、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。 (2)char * const p char const * p const char *p 上述三个有什么区别? 答案: char * const p; //常量指针,p的值不可以修改 char const * p;//指向常量的指针,指向的常量值不可以改const char *p;//和char const *p (3)char str1[] = "abc"; char str2[] = "abc"; const char str3[] = "abc"; const char str4[] = "abc"; const char *str5 = "abc"; const char *str6 = "abc"; char *str7 = "abc"; char *str8 = "abc"; cout < < ( str1 == str2 ) < < endl; cout < < ( str3 == str4 ) < < endl; cout < < ( str5 == str6 ) < < endl; cout < < ( str7 == str8 ) < < endl; 结果是:0 0 1 1 str1,str2,str3,str4是数组变量,它们有各自的内存空间;而str5,str6,str7,str8是指针,它们指向相同的常量区域。 (4)以下代码中的两个sizeof用法有问题吗? [C易] void UpperCase( char str[] ) // 将str 中的小写字母转换成大写字母{ for( size_t i=0; i

linux驱动工程师面试题整理

1、字符型驱动设备你是怎么创建设备文件的,就是/dev/下面的设备文件,供上层应用程序打开使用的文件? 答:mknod命令结合设备的主设备号和次设备号,可创建一个设备文件。 评:这只是其中一种方式,也叫手动创建设备文件。还有UDEV/MDEV自动创建设备文件的方式,UDEV/MDEV是运行在用户态的程序,可以动态管理设备文件,包括创建和删除设备文件,运行在用户态意味着系统要运行之后。那么在系统启动期间还有devfs创建了设备文件。一共有三种方式可以创建设备文件。 2、写一个中断服务需要注意哪些?如果中断产生之后要做比较多的事情你是怎么做的?答:中断处理例程应该尽量短,把能放在后半段(tasklet,等待队列等)的任务尽量放在后半段。 评:写一个中断服务程序要注意快进快出,在中断服务程序里面尽量快速采集信息,包括硬件信息,然后推出中断,要做其它事情可以使用工作队列或者tasklet方式。也就是中断上半部和下半部。 第二:中断服务程序中不能有阻塞操作。为什么?大家可以讨论。 第三:中断服务程序注意返回值,要用操作系统定义的宏做为返回值,而不是自己定义的OK,FAIL之类的。 3、自旋锁和信号量在互斥使用时需要注意哪些?在中断服务程序里面的互斥是使用自旋锁还是信号量?还是两者都能用?为什么? 答:使用自旋锁的进程不能睡眠,使用信号量的进程可以睡眠。中断服务例程中的互斥使用的是自旋锁,原因是在中断处理例程中,硬中断是关闭的,这样会丢失可能到来的中断。 4、原子操作你怎么理解?为了实现一个互斥,自己定义一个变量作为标记来作为一个资源只有一个使用者行不行? 答:原子操作指的是无法被打断的操作。我没懂第二句是什么意思,自己定义一个变量怎么可能标记资源的使用情况?其他进程又看不见这个变量 评:第二句话的意思是: 定义一个变量,比如 int flag =0; if(flag == 0) { flag = 1; 操作临界区; flag = 0; }这样可否?

嵌入式工程师经典面试题

上个星期, 去深圳一家搞 ARM 开发的公司面试, HR 叫我做了一份卷子, 里面都是 C 编程, 心中暗喜, 因为这些题基本上都在程序员面试宝典里见过。后来回到学校, 在网上搜索,原来这些题都是嵌入式工程师的经典面试题目, 很多网站上都可以找得到。现把他贴出来, 附上网上的答案,跟大家分享,因为这些题实在太经典了。 预处理器(Preprocessor 1 . 用预处理指令 #define 声明一个常数, 用以表明 1年中有多少秒 (忽略闰年问题 #define SECONDS_PER_YEAR (60 * 60 * 24 * 365UL 我在这想看到几件事情: 1 #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等 2 懂得预处理器将为你计算常数表达式的值,因此直接写出你如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。 3 意识到这个表达式将使一个 16位机的整型数溢出 -因此要用到长整型符号 L, 告诉编译器这个常数是的长整型数。 4 如果你在你的表达式中用到 UL (表示无符号长整型,那么你有了一个好的起点。记住,第一印象很重要。 2 . 写一个 " 标准 " 宏 MIN ,这个宏输入两个参数并返回较小的一个。 #define MIN(A,B ((A <= (B ? (A : (B 这个测试是为下面的目的而设的: 1 标识 #define在宏中应用的基本知识。这是很重要的。因为在嵌入 (inline操作符变为标准 C 的一部分之前,宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法。

LINUX内核经典面试题30道及解答

LINUX内核经典面试题 30道 1) Linux中主要有哪几种内核锁? 2) Linux中的用户模式和内核模式是什么含意? 3) 怎样申请大块内核内存? 4) 用户进程间通信主要哪几种方式? 5) 通过伙伴系统申请内核内存的函数有哪些? 6) 通过slab分配器申请内核内存的函数有? 7) Linux的内核空间和用户空间是如何划分的(以32位系统为例)? 8) vmalloc()申请的内存有什么特点? 9) 用户程序使用malloc()申请到的内存空间在什么范围? 10) 在支持并使能MMU的系统中,Linux内核和用户程序分别运行在物理地址模式还是虚拟地址模式? 11) ARM处理器是通过几级也表进行存储空间映射的? 12) Linux是通过什么组件来实现支持多种文件系通的? 13) Linux虚拟文件系统的关键数据结构有哪些?(至少写出四个) 14) 对文件或设备的操作函数保存在那个数据结构中? 15) Linux中的文件包括哪些? 16) 创建进程的系统调用有那些? 17) 调用schedule()进行进程切换的方式有几种? 18) Linux调度程序是根据进程的动态优先级还是静态优先级来调度进程的? 19) 进程调度的核心数据结构是哪个?

20) 如何加载、卸载一个模块? 21) 模块和应用程序分别运行在什么空间? 22) Linux中的浮点运算由应用程序实现还是内核实现? 23) 模块程序能否使用可链接的库函数? 24) TLB中缓存的是什么内容? 25) Linux中有哪几种设备? 26) 字符设备驱动程序的关键数据结构是哪个? 27) 设备驱动程序包括哪些功能函数? 28) 如何唯一标识一个设备? 29) Linux通过什么方式实现系统调用? 30) Linux软中断和工作队列的作用是什么? 参考解答

嵌入式工程师面试题--经典

1、将一个字符串逆序 2、将一个链表逆序 3、计算一个字节里(byte)里面有多少bit被置1 4、搜索给定的字节(byte) 5、在一个字符串中找到可能的最长的子字符串 6、字符串转换为整数 7、整数转换为字符串 style="MARGIN: 0px; COLOR: rgb(102,102,102); LINE-HEIGHT: 150%" wrap="break-word"1、char *strconv(char *p) { int i,length; char temp; length = strlen(p); for(i = 0;i < length/2;i++) { temp = *(p + i);

*(p + i) = *(p + length - 1 - i); *(p +length - 1 - i) = temp; } return p; } int main() { char src[100]; char *p; scanf("%s",src); p = strconv(src); printf("%s\n",p); return 0;

style="MARGIN: 0px; COLOR: rgb(102,102,102); LINE-HEIGHT: 150%" wrap="break-word"3、int cal(int data) //calculation the number of bit in one byte { int a; int count = 0; a = data % 100; while (a != 0) { count += a % 2; a /= 2; } return count;

Linux笔试题及答案

一。填空题: 1. 在Linux系统中,以文件方式访问设备。 2. Linux内核引导时,从文件/etc/fstab中读取要加载的文件系统。 3. Linux文件系统中每个文件用i节点来标识。 4. 全部磁盘块由四个部分组成,分别为引导块、专用块、i节点表块和数据存储块。 5. 链接分为:硬链接和符号链接。 6. 超级块包含了i节点表和空闲块表等重要的文件系统信息。 7. 某文件的权限为:d-rw-_r--_r--,用数值形式表示该权限,则该八进制数为:644,该文件属性是目录。 8. 前台起动的进程使用Ctrl+c终止。 9. 静态路由设定后,若网络拓扑结构发生变化,需由系统管理员修改路由的设置。 10. 网络管理的重要任务是:控制和监控。 11. 安装Linux系统对硬盘分区时,必须有两种分区类型:文件系统分区和交换分区。 13. 编写的Shell程序运行前必须赋予该脚本文件执行权限。 14. 系统管理的任务之一是能够在分布式环境中实现对程序和数据的安全保护、备份、恢复和更新。 15. 系统交换分区是作为系统虚拟存储器的一块区域。 16. 内核分为进程管理系统、内存管理系统、I/O管理系统和文件管理系统等四个子系统。 17. 内核配置是系统管理员在改变系统配置硬件时要进行的重要操作。 18. 在安装Linux系统中,使用netconfig程序对网络进行配置,该安装程序会一步步提示用户输入主机名、域名、域名服务器、IP地址、网关地址和子网掩码等必要信息。 19. 唯一标识每一个用户的是用户ID和用户名。 20 . RIP 协议是最为普遍的一种内部协议,一般称为动态路由信息协议。 21. 在Linux系统中所有内容都被表示为文件,组织文件的各种方法称为文件系统。 22. DHCP可以实现动态IP 地址分配。 23. 系统网络管理员的管理对象是服务器、用户和服务器的进程以及系统的各种资源。 24. 网络管理通常由监测、传输和管理三部分组成,其中管理部分是整个网络管理的中心。 25. 当想删除本系统用不上的设备驱动程序时必须编译内核,当内核不支持系统上的设备驱动程序时,必须对内核升级。 26 Ping命令可以测试网络中本机系统是否能到达一台远程主机,所以常常用于测试网络的连通性。 27. vi编辑器具有两种工作模式:命令模式和输入模式。 28. 可以用ls –al命令来观察文件的权限,每个文件的权限都用10位表示,并分为四段,其中第一段占 1 位,表示文件类型,第二段占3位,表示文件所有者对该文件的权限。 29. 进程与程序的区别在于其动态性,动态的产生和终止,从产生到终止进程可以具有的基本状态为:运行态、就绪态和等待态(阻塞态)。 30. DNS实际上是分布在internet上的主机信息的数据库,其作用是实现IP地址和主机名之间的转换。 31. Apache是实现WWW服务器功能的应用程序,即通常所说的―浏览web服务器‖,在服务器端为用户提供浏览web服务的就是apache应用程序。 32. 在Linux系统上做备份可以有两种类型:系统备份和用户备份。其中前者是指对操作系统的备份,后者是指对应用程序和用户文件的备份。 33. CD-ROM标准的文件系统类型是iso9660。 34. 当lilo.conf配置完毕后,使之生效,应运行的命令及参数是lilo。 35. 在使用ls命令时,用八进制形式显示非打印字符应使用参数-b。 36. Linux使用支持Windows 9.x/2000长文件名的文件系统的类型是vfat。 37. 设定限制用户使用磁盘空间的命令是quota。 38 在Linux系统中,用来存放系统所需要的配置文件和子目录的目录是/etc。 39. 硬连接只能建立对文件链接。符号链接可以跨不同文件系统创建。 40. 套接字文件的属性位是s。 41. 结束后台进程的命令是kill。 42. 进程的运行有两种方式,即独立运行和使用父进程运行。 43. Links分为硬链接和符号链接。 44. 在超级用户下显示Linux系统中正在运行的全部进程,应使用的命令及参数是ps -aux。

经典嵌入式面试题

经典嵌入式面试题 C语言测试就是招聘嵌入式系统程序员过程中必须而且有效的方法。这些年,我既参加也组织了许多这种测试,在这过程中我意识到这些测试能为带面试者与被面试者提供许多有用信息,此外,撇开面试的压力不谈,这种测试也就是相当有趣的。 从被面试者的角度来讲,您能了解许多关于出题者或监考者的情况。这个测试只就是出题者为显示其对ANSI标准细节的知识而不就是技术技巧而设计不?这个愚蠢的问题不?如要您答出某个字符的ASCII值。这些问题着重考察您的系统调用与内存分配策略方面的能力不?这标志着出题者也许花时间在微机上而不上在嵌入式系统上。如果上述任何问题的答案就是"就是"的话,那么我知道我得认真考虑我就是否应该去做这份工作。 从面试者的角度来讲,一个测试也许能从多方面揭示应试者的素质:最基本的,您能了解应试者C语言的水平。不管怎么样,瞧一下这人如何回答她不会的问题也就是满有趣。应试者就是以好的直觉做出明智的选择,还就是只就是瞎蒙呢?当应试者在某个问题上卡住时就是找借口呢,还就是表现出对问题的真正的好奇心,把这瞧成学习的机会呢?我发现这些信息与她们的测试成绩一样有用。 有了这些想法,我决定出一些真正针对嵌入式系统的考题,希望这些令人头痛的考题能给正在找工作的人一点帮住。这些问题都就是我这些

年实际碰到的。其中有些题很难,但它们应该都能给您一点启迪。 这个测试适于不同水平的应试者,大多数初级水平的应试者的成绩会很差,经验丰富的程序员应该有很好的成绩。为了让您能自己决定某些问题的偏好,每个问题没有分配分数,如果选择这些考题为您所用,请自行按您的意思分配分数。 预处理器(Preprocessor) 1 、用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 我在这想瞧到几件事情: ?; #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等) ?; 懂得预处理器将为您计算常数表达式的值,因此,直接写出您就是如何计算一年中有多少秒而不就是计算出实际的值,就是更清晰而没有代价的。 ?; 意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数就是的长整型数。 ?; 如果您在您的表达式中用到UL(表示无符号长整型),那么您有了一个好的起点。记住,第一印象很重要。 2 、写一个"标准"宏MIN ,这个宏输入两个参数并返回较小的一个。#define MIN(A,B) ( (A) <= (B) ? (A) : (B) )

linux面试题及答案

1.如何编写一个驱动? 2.设备中字符设备与块设备有什么主要的区别?请分别列举一些实际的设备说出它们是属于哪一类设备。 字符设备:字符设备是个能够像字节流(类似文件)一样被访问的设备,由字符设备驱动程序来实现这种特性。字符设备驱动程序通常至少实现和系统调用。字符终端、串口、鼠标、键盘、摄像头、声卡和显卡等就是典型的字符设备。 块设备:和字符设备类似,块设备也是通过目录下的文件系统节点来访问。块设备上能够容纳文件系统,如:u盘,卡,磁盘等。 字符设备和块设备的区别仅仅在于内核内部管理数据的方式,也就是内核及驱动程序之间的软件接口,而这些不同对用户来讲是透明的。 3.查看驱动模块中打印信息应该使用什么命令?如何查看内核中已有的字符设备的信息?如何查看正在使用的有哪些中断号? 1) 查看驱动模块中打印信息的命令: 2) 查看字符设备信息可以用和,可以查看模块的依赖关系,在加载模块时会加载其他依赖的模块。 3)显示当前使用的中断号 4.请简述主设备号和次设备号的用途。如果执行 c 4 64,创

建 使用的是那一类设备驱动程序。 1)主设备号:主设备号标识设备对应的驱动程序。虽然现代的内核允许多个驱动程序共享主设备号,但我们看待的大多数设备仍然按照“一个主设备对应一个驱动程序”的原则组织。 次设备号:次设备号由内核使用,用于正确确定设备文件所指的设备。依赖于驱动程序的编写方式,我们可以通过次设备号获得一个指向内核设备的直接指针,也可将此设备号当作设备本地数组的索引。 2)由驱动程序4管理,该文件所指的设备是64号设备。(感觉类似于串口终端或者字符设备终端)。 5.设备驱动程序中如何注册一个字符设备?分别解释一下它的几个参数的含义。 注册一个字符设备驱动有两种方法: 1) ( *, *) 该注册函数可以将结构嵌入到自己的设备特定的结构中。是一个指向结构体的指针,而是指向一个类似于结构(可以是结构,但不限于该结构)的指针. 2) ( , * , ) *); 该注册函数是早期的注册函数,是设备的主设备号,是驱动程序的名称,而是默认的结构(这是只限于结构)。

嵌入式C语言面试题汇总(超经典)

第一部分:基本概念及其它问答题 1、关键字static的作用是什么? 这个简单的问题很少有人能回答完全。在C语言中,关键字static有三个明显的作用: 1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。 2). 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。 3). 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。 大多数应试者能正确回答第一部分,一部分能正确回答第二部分,同是很少的人能懂得第三部分。这是一个应试者的严重的缺点,因为他显然不懂得本地化数据和代码范围的好处和重要性。 2、“引用”与指针的区别是什么? 答、1) 引用必须被初始化,指针不必。 2) 引用初始化以后不能被改变,指针可以改变所指的对象。 3) 不存在指向空值的引用,但是存在指向空值的指针。 指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作。程序中使用指针,程序的可读性差;而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。 流操作符<<和>>、赋值操作符=的返回值、拷贝构造函数的参数、赋值操作符=的参数、其它情况都推荐使用引用。 3、.h头文件中的ifndef/define/endif 的作用? 答:防止该头文件被重复引用。 4、#include 与#include “file.h”的区别? 答:前者是从Standard Library的路径寻找和引用file.h,而后者是从当前工作路径搜寻并引用file.h。 5、描述实时系统的基本特性 答:在特定时间内完成特定的任务,实时性与可靠性。 6、全局变量和局部变量在内存中是否有区别?如果有,是什么区别? 答:全局变量储存在静态数据区,局部变量在堆栈中。 7、什么是平衡二叉树? 答:左右子树都是平衡二叉树且左右子树的深度差值的绝对值不大于1。 8、堆栈溢出一般是由什么原因导致的? 答:1.没有回收垃圾资源 2.层次太深的递归调用

非常全的linux面试笔试题及参考答案

一.填空题: 1. 在系统中,以文件方式访问设备 . 2. 内核引导时,从文件中读取要加载的文件系统. 3. 文件系统中每个文件用i节点来标识. 4. 全部磁盘块由四个部分组成,分别为引导块、专用块、i节点表块和数据存储块. 5. 链接分为:硬链接和符号链接. 6. 超级块包含了i节点表和空闲块表等重要的文件系统信息. 7. 某文件的权限为:,用数值形式表示该权限,则该八进制数为: 644 ,该文件属性是目录 . 8. 前台起动的进程使用 c 终止. 9. 静态路由设定后,若网络拓扑结构发生变化,需由系统管理员修改路由的设置. 10. 网络管理的重要任务是:控制和监控. 11. 安装系统对硬盘分区时,有两种分区类型:文件系统分区和交换分区 . 13. 编写的程序运行前赋予该脚本文件执行权限. 14. 系统管理的任务之一是能够在分布式环境中实现对程序和数据的安全保护、备份、恢复和更新. 15. 系统交换分区是作为系统虚拟存储器的一块区域. 16. 内核分为进程管理系统、内存管理系统、管理系统和文件管理系统等四个子系统. 17. 内核配置是系统管理员在改变系统配置硬件时要进行的重要操作. 18. 在安装系统中,使用程序对网络进行配置,该安装程序会一步步提示用户输入主机名、域名、域名服务器、地址、网关地址和子网掩码等必要信息. 19. 唯一标识每一个用户的是用户和用户名. 20 . 协议是最为普遍的一种内部协议,一般称为动态路由信息协议. 21. 在系统中所有内容都被表示为文件,组织文件的各种方法称为文件系统 . 22. 可以实现动态地址分配. 23. 系统网络管理员的管理对象是服务器、用户和服务器的进程以及系统的各种资源. 24. 网络管理通常由监测、传输和管理三部分组成,其中管理部分是整个网络管理的中心. 25. 当想删除本系统用不上的设备驱动程序时编译内核,当内核不支持系统上的设备驱动程序时,对内核升级 . 26 命令可以测试网络中本机系统是否能到达一台远程主机,常常用于测试网络的 连通性 . 27. 编辑器具有两种工作模式:命令模式和输入模式 . 28. 可以用命令来观察文件的权限,每个文件的权限都用10位表示,并分为四段,其中第一段占1 位,表示文件类型,第二段占3位,表示文件所有者对该文件的权限. 29. 进程与程序的区别在于其动态性,动态的产生和终止,从产生到终止进程可以具有的基本状态为:运行态、就绪态和等待态(阻塞态) .

中兴手机嵌入式开发面试题汇总

中兴手机嵌入式开发面试题汇总 1:将一个整数10002存到磁盘上,以ASCII码形式存储和以二进制形式存储,占用的字节数 分别是 和2 和5 和2 和5 知识点:数据类型的存储方式 2:表达式!x 等效于 ==1 ==0 !=1 !=0 知识点:逻辑非 3:执行下列程序 #include ″stdio. h″ main { printf(″%d\n″,NULL); } 后输出的结果是 知识点:NULL的含义 4:下列关于C语言的叙述错误的是 A.英文字母大小写不加以区分 B.不同类型的变量可以出现在同一个表达式中 C.在赋值表达式中赋值号两边的类型可以不同

D.某些运算符在不同的场合可以有不同的含义 5:设int a=9,b=20 ;则printf( ″%d,%d\n ″,a--,--b) ;的输出结果是 ,19 ,20 ,19 ,20 知识点:运算符的优先级 6:函数调用语句“f((e1,e2),(e3,e4,e5)) ”中参数的个数是 知识点:函数调用 7:以“只读”方式打开文本文件a: \ , 下列语句中哪一个是正确的=fopen( ”a: \ ”, ”ab ”) 数形式参数的数据类型 B.函数返回值的数据类型 C.调用该函数时的实参的数据类型 D.任意指定的数据类型 知识点:有值函数 9:表达式!x||a==b 等效于 A.!((x||a)==b) B.!(x||y)==b C.!(x||(a==b)) D.(!x)||(a==b) 知识点:运算符的优先级 10:设int a=10, b=20, c=30;条件表达式a

11:下列数据中,不是C语言常量的是 A.′\n′ B.″a″ 12:C语言中计算a的3次方,正确的表达是 ^3 (a,3) **3 (a,3) 知识点:c的库函数 13:下列标识符中,不是C语言保留字的是 14:调用函数时,若实参是一个数组名,则向函数对应的形参传送的是 A.数组的长度 B.数组的首地址 C.数组第一个元素的值 D.整个数组元素的值 16:执行语句“k=5 | 3; ”后,变量k 的当前值是 17:完成C 源文件编辑后、到生成执行文件,C 语言处理系统必须执行的步骤依次为 A.连接、编译 B.编译、连接

常见LINUX笔试题 100道选择题 (答案见最后)

Linux认证笔试基本题(答案见最后) (以下均为单选题) 1.cron后台常驻程序(daemon)用于: A.负责文件在网络中的共享 B.管理打印子系统 C.跟踪管理系统信息和错误 D.管理系统日常任务的调度 2.在大多数Linux发行版本中,以下哪个属于块设备(block devices)? A.串行口 B.硬盘 C.虚拟终端 D.打印机 3.下面哪个Linux命令可以一次显示一页内容? A.pause B.cat C.more D.grep 4.怎样了解您在当前目录下还有多大空间? https://www.360docs.net/doc/e19986399.html,e df https://www.360docs.net/doc/e19986399.html,e du/ https://www.360docs.net/doc/e19986399.html,e du. https://www.360docs.net/doc/e19986399.html,e df. 5.怎样更改一个文件的权限设置? A.attrib B.chmod C.change D.file 6.假如您需要找出/etc/my.conf文件属于哪个包(package),您可以执行: A.rpm-q/etc/my.conf B.rpm-requires/etc/my.conf C.rpm-qf/etc/my.conf D.rpm-q|grep/etc/my.conf 7.假如当前系统是在level3运行,怎样不重启系统就可转换到level5运行? A.Set level=5 B.telinit5 C.run5 D.ALT-F7-5 8.那个命令用于改变IDE硬盘的设置? A.hdparam B.ideconfig C.hdparm D.hddparm

9.下面哪个命令可以列出定义在以后特定时间运行一次的所有任务? A.atq B.cron C.batch D.at 10.下面命令的作用是:set PS1="[\u\w\t]\\$";export PS1 A.改变错误信息提示 B.改变命令提示符 C.改变一些终端参数 D.改变辅助命令提示符 11.作为一个管理员,你希望在每一个新用户的目录下放一个文件.bashrc,那么你应该在哪个 目录下放这个文件,以便于新用户创建主目录时自动将这个文件复制到自己的目录下。 A./etc/skel/ B./etc/default/ C./etc/defaults/ D./etc/profile.d/ 12.在bash中,export命令的作用是: A.在子shell中运行命令 B.使在子shell中可以使用命令历史记录 C.为其它应用程序设置环境变量 D.提供NFS分区给网络中的其它系统使用 13.在使用了shadow口令的系统中,/etc/passwd和/etc/shadow两个文件的权限正确的是: A.-rw-r-----,-r-------- B.-rw-r--r--,-r--r--r-- C.-rw-r--r--,-r-------- D.-rw-r--rw-,-r-----r-- 14.下面哪个参数可以删除一个用户并同时删除用户的主目录? A.rmuser-r B.deluser-r https://www.360docs.net/doc/e19986399.html,erdel-r https://www.360docs.net/doc/e19986399.html,ermgr-r 15.有一个备份程序mybackup,需要在周一至周五下午1点和晚上8点各运行一次,下面哪条crontab的项可以完成这项工作? A.013,20**1,5mybackup B.013,20**1,2,3,4,5mybackup C.*13,20**1,2,3,4,5mybackup D.013,201,5**mybackup 16.如何从当前系统中卸载一个已装载的文件系统 A.umount B.dismount C.mount-u D.从/etc/fstab中删除这个文件系统项

嵌入式笔试题

嵌入式笔试题 国内普遍认同的嵌入式系统定义为:以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。 下面就由为大家介绍一下嵌入式笔试题的文章,欢迎阅读。 嵌入式笔试题篇11:用C语言实现大小端的测试Int CheckCpu(){union{int a;char b;}c;c.a=1;if(c.b==1)printf(“小端);else printf(“大端);}2:volatile的作用有哪些?Volatile第一变量相当于告诉编译器这个变量的值会随时发生变化,每次使用之前都要去内存里从新读取它的值,并不要随意针对它做优化,主要用在:1:一个中断子程序中会访问到的非自动变量;2:多线程应用中被几个线程共享的变量;3:并行设备的硬件寄存器。 3:C语言中static关键字的作用有哪些?1:在函数体中,一个被声明为静态的变量在这个变量在调用过程中维持其值不变;2:在模块内(但在函数体外),一个被声明为静态的变量,可以被这个模块内的所用函数使用,但不能被模块外的函数使用,它是一个本地的全局变量;3:在模块内,一个被声明为静态变量的函数,智能被这个模块内的函数调用;4:static全局变量与局部变量的区别:static全局变量只能被初始化一次,防止其他单元文件中被引用;5:static局部变量与局部变量的区别:static局部变量只能被初始化一次,下一次依据上一次结果的值;6:static函数与普通函数的区别:static在内存中只用一份,普通函数在每

一次调用中维持一份拷贝。 4:请问下面三种变量的区别:Int const *p : 指向常整型的指针;Int *const p; 指向整型的常指针;Int *const *p:指向常整型的常指针;5:在ARM系统中,在函数调用的时候,参数是通过哪种方式传递的。 当参数小于等于4的时候是通过r0~r3来进行传递的,当参数大于4的时候是通过压栈的方式进行传递。 6:中断与异常有何区别.异常在处理的时候必须考虑与处理器的时钟同步,实际上异常也称为同步中断,在处理器执行到因编译错误而导致的错误指令时,或者在执行期间出现特殊错误,必须靠内核处理的时候,处理器就会产生一个异常;所谓中断是指外部硬件产生的一个电信号从CPU的中断引脚进入,打断CPU的运行。 所谓异常是指软件运行过程中发生了一些必须作出处理的事件,CPU自动产生一个陷入来打断CPU的运行。 7:用预处理指令#define表示一年中有多少秒#define SECONDS_PER_YEAR (60*60*24*365)UL注意后面必须加UL,表示计算的结构是常整型。 8:简述SPI,UART,I2C三种传输方式。 SPI:高速同步串行口,首发独立,可同步进行SPI接口主要应用在EEPROM,Flash,实时时钟,A/D转化器,数字信号处理,是一种全双工同步通讯总线,该接口一般使用四条线:串行时钟线(sck),主出从入线,主入从出线,低电平有效地的从机选择线。

硬件、嵌入式工程师笔面试

笔面试题 1、技术类 (1)描述一下你的项目 (2)单片机I/O口需要注意的问题 驱动能力不强,高电平驱动时需要加上拉电阻; 电平匹配,上拉或分组。 51单片机的P0口常用作数据线和低8位地址线、P2常用作高8位地址线。 (3)单片机不能启动的原因 1)晶振没有振荡,测量晶振是否起振; 2)一直在复位状态,检查复位电路; 3)程序飞了,检查程序; 4)程序编制错误,检查程序; 5)单片机坏了,更换单片机芯片; 6)硬件电路错误。 (4)单片机最小系统 1)复位电路: 当引脚9出现2个机器周期以上高电平时,单片机复位,程序从头开始运行。

2)时钟电路:有振荡器电路产生频率等于晶振频率,这时用的是外界晶振。 也可以又外部单独输入,此时XTAL2脚接地,时钟信号由XTAL1输入。 3)电源电路:VCC和GND引脚。 4)程序下载电路。(并不严格包含) (5)哈弗结构和冯洛伊曼结构 哈佛结构:是一种将程序指令储存和数据储存分开的存储器结构。中央处理器首先到程序指令储存器中读取程序指令内容,解码后得到数据地址,再到相应的数据储存器中读取数据,并进行下一步的操作(通常是执行)。程序指令储存和数据储存分开,数据和指令的储存可以同时进行,可以使指令和数据有不同的数据宽度,与冯.诺曼结构处理器比较,哈佛结构处理器有两个明显的特点: 1、使用两个独立的存储器模块,分别存储指令和数据,每个存储模块都不允许指令和数据并存; 2、使用独立的两条总线,分别作为CPU与每个存储器之间的专用通信路径,而这两条总线之间毫无关联。 改进的哈佛结构,其结构特点为: 1、使用两个独立的存储器模块,分别存储指令和数据,每个存储模块都不允许指令和数据并存,以便实现并行处理; 2、具有一条独立的地址总线和一条独立的数据总线,利用公用地址总线访问两个存储模块(程序存储模块和数据存储模块),公用数据总线则被用来完成程序存储模块或数据存储模块与CPU之间的数据传输; 哈佛结构的微处理器通常具有较高的执行效率。其程序指令和数据指令分开组织和储存的,执行时可以预先读取下一条指令。目前使用哈佛结构的中央处理器和微控制器有很多,除了上面提到的Microchip公司的PIC系列芯片,还有摩托罗拉公司的MC68系列、Zilog公司的Z8系列、ATMEL公司的A VR系列和安谋公司的ARM9、ARM10和ARM11。 冯·诺伊曼结构:也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的

相关文档
最新文档