嵌入式软件工程师面试资料

上传人:博****1 文档编号:497969537 上传时间:2022-08-15 格式:DOCX 页数:18 大小:42.14KB
返回 下载 相关 举报
嵌入式软件工程师面试资料_第1页
第1页 / 共18页
嵌入式软件工程师面试资料_第2页
第2页 / 共18页
嵌入式软件工程师面试资料_第3页
第3页 / 共18页
嵌入式软件工程师面试资料_第4页
第4页 / 共18页
嵌入式软件工程师面试资料_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《嵌入式软件工程师面试资料》由会员分享,可在线阅读,更多相关《嵌入式软件工程师面试资料(18页珍藏版)》请在金锄头文库上搜索。

1、1、C/C+编程语言2、算法思想和数据结构3、UNIX/Linux操作系统上的软件开发环境及常用工具(GNU开发套件),熟悉各种Linux 的调试工具和方法,如GDB、G+、coredump4、常见嵌入式处理器,有ARM7、ARM9、ARM11等嵌入式处理器编程,包括Ethernet、UART、 USB、DMA、I2C、SPI 等等5、网络开发及相关网络协议,如TCP/IP,SERIA, SNMP,TCP、UDP、HTTP、FTP等网络协议6、linux系统的Socket网络编程7、linux系统的多线程编程8、linux系统的常用脚本语言(Shell、PHP)9、Linux模块的底层驱动编程

2、10、应用层得RTP工作原理11、Linux内核的修改、配置、编译等什么是预编译,何时需要预编译、预编译又称预处理,是做一些代码文本的替换工作,处理#开头的指令,比如拷贝#include 包含的文件代码,#define宏定义的替换,条件编译等就 是为编译做的预备工作的阶段预编译指令指示了在程序正式编译前就由编译器进行了操作 可以放在程序的任何位置。何时使用:当大部分文件代码基本上不会更改时,比如MFC的一些头文件以及一些必要的 API使用代码,也可以把你自己的一部分代码封装起来到一个C或C+文件中,(比如在其 中包含一些头文件或必要的代码什么的,然后在VC-C/C+PreCompiled He

3、aders里选择第 三项Create compiled Header file)来指定为预编译头文件,这样就在以后的程序修改中 编译时不会反复编译这部分。注意:过多的使用预编译头文件会大大降低编译的速度。深入理解 char * const p,char const *p,const char *p 的区别1、关键看const修饰的是谁2、 由于没有const *的运算,若出现const *的形式,则const实际上是修饰前面的。 char *const p(const修饰的是p):只能对“某个固定的位置”进 行读写操作,并且 在定义p时就必须初始化(因为在后面不能执行“p=. ”的操作,因此就

4、不能在后面初始化, 因此只能在定义时初始化)。(“某个固定的位置”是相对于char *p来说所限定的内容) char const*p,由于没有const*运算,则const实际上是修饰前面的char,因此char const*p 等价于 const char*p。const char*p 或者 char const *p (因为没有 const*p 运算,因此 const修饰的还是前面的char):可以对任意位置(非系统敏感区域)进行“只读”操作。(“只读”是相对于char *p来说所限定的内容)一个32位的机器,该机器的指针是多少位答案: 指针是多少位只要看地址总线的位数就行了。80386以

5、后的机子都是32的数据总线。所以 指针的位数就是4个字节了。关键字static的作用是什么?定义静态变量关键字 const 有什么含意? 表示常量不可以修改的变量。关键字 volatile 有什么含意?并举出三个不同的例子?一个定义为 volatile 的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去 假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取 这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子1) . 并行设备的硬件寄存器(如:状态寄存器)2) .个中断服务子程序中会访问到的非自动变量(Non-au toma

6、tic variables)3) . 多线程应用中被几个任务共享的变量回答不出这个问题的人是不会被雇佣的。我认为这是区分C程序员和嵌入式系统程序员的最 基本的问题。嵌入式系统程序员经常同硬件、中断、RTOS等等打交道,所用这些都要求 volatile变量。不懂得volatile内容将会带来灾难。假设被面试者正确地回答了这是问题(嗯,怀疑这否会是这样),我将稍微深究一下,看一下这家伙是不是直正懂得volatile完全的重要性。1) . 一个参数既可以是 const 还可以是 volatile 吗?解释为什么。2) . 一个指针可以是 volatile 吗?解释为什么。3) . 下面的函数有什么错

7、误: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 = *pt

8、r;b = *ptr;return a * b;由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能 返不是你所期望的平方值!正确的代码如下:long square(volatile int *ptr)int a;a = *ptr;return a * a;列举几种进程的同步机制,并比较其优缺点。原子操作 信号量机制 自旋锁 管程,会合,分布式系统进程之间通信的途径目的:1、数据传输:一个进程向另一个进程传输数据,一般在一个字节和几M字节之间。2、共享数据3、资源共享:多个进程之间共享同样的资源,为了做到这一点需要内核提供锁和同步机制。4、通知事件:一个进程向另一个

9、进程或一组进程发送消息,通知他梦发生了某种事件(如进 程终止样通知付进程)5、进程控制:有些进程希望完全控制另一个进程(Debug进程),此时控制进程希望能够 拦截另一个进程的所有的陷入和异常,并能够及时知道他的状态改变。#管道(pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘 关系的进程间使用。进程的亲缘关系通常是指父子进程关系。创建一个简单的管道,可以使用系统调用pipe()。它接受一个参数,也就是一个包括两个 整数的数组。如果系统调用成功,此数组将包括管道使用的两个文件描述符。创建一个管道 之后,一般情况下进程将产生一个新的进程。系统调用: pipe();原型

10、: int pipe(int fd2); 返回值:如果系统调用成功,返回0。如果系统调用失败返回-1:errno=EMFILE(没有空亲的文件描述符)EMFILE (系统文件表已满)EFAULT( fd 数组无效)注意:fdO用于读取管道,fd1用于写入管道。管道的创建#include#include#include#includeint main()int pipe_fd2;if(pipe(pipe_fd)0)printf(pipe create errorn);return -1;elseprintf(pipe create successn);close(pipe_fd0);close(

11、pipe_fd1);管道的读写管道主要用于不同进程间通信。实际上,通常先创建一个管道,再通过fork函数创建一个 子进程。图见附件。子进程写入和父进程读的命名管道:图见附件 管道读写注意事项: 可以通过打开两个管道来创建一个双向的管道。但需要在子理程中正确地设置文件描述符 必须在系统调用fork()中调用pipe(),否则子进程将不会继承文件描述符。当使用半双工 管道时,任何关联的进程都必须共享一个相关的祖先进程。因为管道存在于系统内核之中 所以任何不在创建管道的进程的祖先进程之中的进程都将无法寻址它。而在命名管道中却不 是这样。管道实例见:pipe_rw.c#include #include

12、 #include#include #include int main()int pipe_fd2;pid_t pid;char buf_r100;char* p_wbuf;int r_num;memset (buf_r,0,sizeof (buf_r) ) ;数组中的数据清0;if(pipe(pipe_fd)0)printf(%d numbers read from be pipe is %sn,r_num,buf_r);close(pipe_fd0);exit(0);else if(pid0) close(pipe_fd0);if(write(pipe_fd1,Hello,5)!=-1)

13、printf(parent write success!n);if(write(pipe_fd1, Pipe,5)!=-1) printf(parent wirte2 succes!n); close(pipe_fd1);sleep(3);waitpid(pid,NULL,0);exit(0);# 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进 程间的通信。# 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访 问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此, 主要作为进程

14、间以及同一进程内不同线程之间的同步手段。# 消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列 标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小 受限等缺点。# 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发 生。信号是软件中断。信号(signal)机制是Unix系统中最为古老的进程之间的能信机制。它 用于在一个或多个进程之间传递异步信号。很多条件可以产生一个信号。# 共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段 共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针 对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合 使用,来实现进程间的同步和通信。# 套接字( socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可 用于不同及其间的进程通信。死锁产生的原因及四个必要条件 产生死锁的原因主要是:(1)因为系统资源不足。(2)进程运行推进的顺序不合适。( 3 )

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号