应聘嵌入式软件工程师

时间:2021-06-10 19:52:38


数据结构(C语言)部分常考的知识点:

1、局部变量能、全局变量和静态变量

2、堆和栈   

3、Const、volatile、define、typedef的用途

4、链表(比如链表的插入、删除和排序)

5、排序(考查冒泡法的较多)

6、可重入函数 、malloc函数

7、指针(常考函数指针,函数指针,数组指针,指针数组和其他的应用),结构体和共用体

8、#include<filename.h>和#include“filename.h”的区别。

 

操作系统部分常考的知识点:

1、中断和异常

2、进程和线程

3、进程的同步机制,进程通信和进程的死锁 

4、优先级反转和优先级继承问题

5、makefile文件

 

 

一些嵌入式开发的网址:

国外站点

Linux设备网站,由Rick Lehrbaum创建和维护,是一个嵌入式Linux入门网站,其中包含嵌入式Linux行业的每日新闻、完整系列的快速参考指南、由重要开发者撰写的大量文章,还包括一个交互论坛。

http://www.linuxdevices.com/

下载嵌入式Linux交叉编译工具链的好地方

SnapGear Embedded Linux Distribution Home Page

http://www.snapgear.org/snapgear/index.html

http://www.uclinux.org/pub/uClinux/...lf-tools/gcc-3/

嵌入式Linux联盟(ELC),一个非盈利性的厂商中立的同业工会,其目标是在整个嵌入式、应用和设备市场中发展和推广Linux。

www.embedded-linux.org

Beyond Logic公司主页,提供了许多嵌入式Linux系统开发的资料。

http://www.beyondlogic.org

嵌入式Linux期刊(ELJ,Embedded Linux Journal),主要关注Linux和其他开源软件在嵌入式系统中的应用。 其中有很多业界领导者为ELJ撰写文章。

embedded.linuxjournal.com

有几本写嵌入式Linux系统的书

http://www.embeddedlogic.com/ELSweb/booklinks.html

有关PowerPC体系的嵌入式

www.mvista.com

www.denx.de/e/index1.php

IXP4XX Open Source Developers Guide

http://ixp4xx-osdg.sourceforge.net/

uClinux/ARM项目

http://adam.kaist.ac.kr/~hschoe/notice.html

D_J嵌入式个人主页,有很多资料!

http://staff.ustc.edu.cn/~wangzhuo/index.html

renbagshoes的个人主页,有些资料可能你会用的到!

http://timity.nease.net

嵌入式Linux操作系统

小型化的嵌入式Linux版本

uClinux — 在没有 MMU 的系统上运行的 Linux。目前支持 Motorola 68K、MCF5206 和MCF5207 ColdFire 微处理器。

http://www.uclinux.org/index.html

Etlinux — 设计用于在小型工业计算机,尤其是 PC/104 模块上运行的 Linux 的完全分发版

http://www.prosa.it/etlinux/index.html

Tiny Linux ── 可以运行在 386 上的 Linux 分发版。

http://tiny.seul.org/en/

ThinLinux ── 面向专用的照相机服务器、X-10 控制器、MP3 播放器和其它类似的嵌入式应用的最小化的 Linux 分发版。

www.thinlinux.org

LRP(Linux Route Project)

http://www.linuxrouter.org

Peeweelinux一个小的嵌入式Linux发行版

http://freshmeat.net/projects/peeweelinux

具有实时扩展功能的嵌入式Linux版本

RT-Linux主页

http://www.fsmlabs.com

http://www.rtlinux.com

RTAI

http://www.rtai.org

EL/IX

SRT-Linux

嵌入式GUI

Microwindows由Century Software的CEO Greg Haerr主持开发的一个公开源码(LGPL)的项目。Microwindows致力于为一些小型设备和平台提供现代图形窗口环境。Microwindows支持许多硬件平台,移植性很强。Microwindows的主要目的之一便是运行在嵌入式Linux上,并且提供了基于Win32/X的两套API接口。

http://www.microwindows.org

http://microwindows.org

MiniGUI由原清华大学教师魏永明先生开发,是中国人做的得较好的*软件之一。MiniGUI 是一种面向嵌入式系统或者实时系统的公开源码(LGPL)的图形用户界面支持系统。它主要运行于Linux控制台,实际可以运行在任何一种具有POSIX线程支持的POSIX兼容系统上。

http://www.minigui.org

飞漫软件的MiniGUI项目

http://www.minigui.com/company/cindex.shtml

Qt/Embedded是著名的QT库开发商Trolltech正在进行的面向嵌入式系统的QT版本。Qt/Embedded对于各种硬件接口到GUI工具包提供了完整的图形栈。Qt/Embedded的API同Qt/X11和Qt/Windows的相同,但它并不是基于X11库的。Qt/Embedded是公开源码(LGPL)项目。

http://www.trolltech.com

OpenGUI基于一个用汇编实现的x86图形内核,提供了一个快速的、32位的、高层的C/C++图形接口。OpenGUI也是一个公开源码(LGPL)项目。OpenGUI提供了二维绘图原语,消息驱动的API和BMP文件格式支持。

http://www.tutok.sk/fastgl

PicoGUI是一个可以工作在包括手持式设备等各种硬件上的小型的、可移植的、基于客户/服务器结构的GUI。同X Window系统一样,它具有客户—服务器结构的灵活性,但又不同于X Window系统,它将字体、BMP文件、控件以及一些应用程序所需要的其它的一些资源直接集成在服务器。虽然减少了系统的灵活性,但在速度上有了很大的提高,并且减小了程序大小。

http://picogui.org

Tiny-X是一个为嵌入式系统而开发的紧缩型的X Window服务器。它由SuSE赞助,由XFree86的核心成员Keith Packard开发。Tiny-X的目标是可以在小内存或几乎无内存的情况下良好运行。

http://www.pps.jussieu.fr/~jch/software/kdrive.html

 

凹凸笔试题目(嵌入式软件开发)

Embedded Software Design Engineer

1 读程序段,回答问题

int main(int argc,char *argv[])

{

int c=9,d=0;

c=c++%5;

d=c;

printf("d=%d\n",d);

return 0;

}

a) 写出程序输出

b) 在一个可移植的系统中这种表达式是否存在风险?why?

#include "stdio.h"

int a=0;

int b;

static char c;

int main(int argc,char *argv[])

{

char d=4;

static short e;

a++;

b=100;

c=(char)++a;

e=(++d)++;

printf("a=%d, b=%d, c=%d, d= %d, e=%d",a,b,c,d,e);

return 0;

}

a) 写出程序输出

b) 编译器如果安排各个变量(a,b,c,d)在内存中的布局(eg. stack,heap,data section,bss section),最好用图形方式描述。

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

__interrupt double compute_area(double radius)

{

double area = PI * radius *radius;

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

return area;

}

3 C/C++基础知识问题

a) 关键字volatile在编译时有什么含义?并给出三个不同使用场景的例子(可以伪代码或者文字描述)。

b) C语言中static关键字的具体作用有哪些 ?

c) 请问下面三种变量声明有何区别?请给出具体含义

int const *p;p是一个指向常整型变量的指针。

int* const p;p是一个指向整型变量的常数执政。

int const* const p;

4 嵌入式系统相关问题

a) 对于整形变量A=0x12345678,请画出在little endian及big endian的方式下在内存中是如何存储的。

b) 在ARM系统中,函数调用的时候,参数是通过哪种方式传递的?

c) 中断(interrupt,如键盘中断)与异常(exception,如除零异常)有何区别?

5 设周期性任务P1,P2,P3的周期为T1,T2,T3分别为100,150,400;执行时间分别为20,40,100。请设计一种调度算法进行任务调度,满足任务执行周期及任务周期。

6 优先级反转问题在嵌入式系统中是一中严重的问题,必须给与足够重视。

a) 首先请解释优先级反转问题

b) 很多RTOS提供优先级继承策略(Priority inheritance)和优先级天花板策略(Priority ceilings)用来解决优先级反转问题,请讨论这两种策略。

 

 

参考答案:

1 5

  存在风险,因为c=c++%5;这个表达式对c有两次修改,行为未定义,c的值不确定

  int a=0; // data section

  int b;   // data section

  static char c; // BSS

  int main(int argc,char *argv[])

  {

    char d=4;         // stack

    static short e;   // BSS

    a++;

    b=100;

    c=(char)++a;

    e=(++d)++;

    printf("a=%d, b=%d, c=%d, d= %d, e=%d",a,b,c,d,e);

    return 0;

  }

  a=2,b=100,c=2,d=6,e=5

 

2 a)ISR不能返回一个值;

  b)ISR不能传递参数;

  c)浮点一般都是不可重入的;

  d)printf函数有重入和性能上的问题。

 

3 a) 用volatile关键字定义变量,相当于告诉编译器,这个变量的值会随时发生变化,每次使用时都需要去内存里

重新读取它的值,并不要随意针对它作优化。

建议使用volatile变量的场所:

(1) 并行设备的硬件寄存器

(2) 一个中断服务子程序中会访问到的非自动变量(全局变量)

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

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

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

访问。它是一个本地的全局变量。

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

模块的本地范围内使用。

     static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;

     static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;

     static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

  c) 一个指向常整型数的指针

     一个指向整型数的常指针

     一个指向常整型数的常指针

4

 

a) 0x12345678

 little endian        big endian 刚好反过来

  高地址--〉 0x12      低地址--〉 0x12

             0x34                 0x34

             0x56                 0x56

  低地址--〉 0x78      高地址--〉 0x78

b)参数<=4时候,通过R0~R3传递,>4的通过压栈方式传递

c)   异常:在产生时必须考虑与处理器的时钟同步,实践上,异常也称为同步中断。在处理器执行到由于编程失误而导致的错误指令时,或者在执行期间出现特殊情况(如缺页),必须靠内核处理的时候,处理器就会产生一个异常。

所谓中断应该是指外部硬件产生的一个电信号,从cpu的中断引脚进入,打断cpu当前的运行;

所谓异常,是指软件运行中发生了一些必须作出处理的事件,cpu自动产生一个陷入来打断当前运行,转入异常处理流程。

异步与同步的区别`

5

 

6 高优先级任务需要等待低优先级任务释放资源,而低优先级任务又正在等待中等优先级任务的现象叫做优先级反转

  优先级继承策略(Priority inheritance):继承现有被阻塞任务的最高优先级作为其优先级,任务退出临界区,恢

复初始优先级。

  优先级天花板策略(Priority ceilings):控制访问临界资源的信号量的优先级天花板。

  优先级继承策略对任务执行流程的影响相对教小,因为只有当高优先级任务申请已被低优先级任务占有的临界资源

这一事实发生时,才抬升低优先级任务的优先级。