叶圣民//2018.07.12.//嵌入式 Linux 开发工具篇问题整理//C语言测试

2019-07-12 17:48发布

嵌入式 Linux 开发工具篇问题整理

1、 嵌入式开发与传统开发的区别?(同类问题:单片机开发与嵌入式开发的区别)

            是否有无操作系统;  

2、 移植操作系统的好处有哪些?

1. 降低了 软件 硬件 耦合度;可移植性 适应各种硬件平台;2. 降低了对软件开发人员的要求(只需懂软件编写);3. 提供了多任务机制;4. 提供网络协议栈5. 提供了开源的软件工具  

3、 嵌入式工程师的岗位划分有哪些?所具备的能力是什么?

岗位划分:销售岗位(销售总监)生产岗位(生产总监)研发岗位(技术总监)       具备能力:1.设计芯片驱动程序,编写软件概要和详细设计说明书。  2.编写驱动代码,并进行单元测试和系统测试。  3.配合硬件工程师调试硬件电路。  4.单板软件需求分析、设计、编码与测试。

4、 人工智能和嵌入式之间有什么关系?人工智能和大数据、云计算的关系?

嵌入式是人工智能开发的系统软件(底层软件<驱动>)人工智能需要 大数据 云计算 的技术支持才能完成拟人和庞大的数据计算。  

5、CPU、GPU、DPU、TPU 分别是什么?

CPU全称:Central Processing Unit, 即中央处理器;GPU全称:Graphics Processing Unit, 即图像处理器;TPU全称:Tensor Processing Unit, 即张量处理器;DPU全称:Deep learning Processing Unit, 即深度学习处理器; 

6、 嵌入式操作系统有哪些?vxwork 的特点?uCOSII 的特点?

VxWork,Linux,uCOSII,WinCEVxWork:硬实时性  

7、 什么是实时性?哪些操作系统具有实时性?

实时性:在指定时间完成指定工作VxWork(硬实时性)Linux(无实时性)  

8、 嵌入式的就业前景和以后的发展方向如何?

嵌入式开发的就业方向有很多,门槛高低不一样。下面主要介绍嵌入式开发 四大就业发展方向:1. ARM + Linux/Android开发2. FPGA开发3. DSP开发4. IC设计

9、 Linux 操作系统有哪些特点?

1.安全可靠2.模块化程度高3.源码公开4.广泛的硬件支持5.安全性及可靠性好6.具有优秀的开发工具7.有很好的网络支持利文件系统支持8.与UNIX完全兼容 

10、 Linux 和 unix 操作系统的区别?

Linux 是开源的、免费的并且提供了大量强大功能的操作系统  

11、 虚拟机的作用是什么?主流的虚拟机有哪些?

用软件的方法在PC机上模拟一台其他操作系统的PC机;RedHat,Ubuntu  

12、 分别阐述 POSIX、GNU、GPL 的理解?

POSIX:Unix 和 Linux 达成的在双方平台上都可以编译运行程序的协议;GNU:Linux 提出的区别于 Unix 的计划,提供许多独有且功能强大的工具;GPL:Linux代码开源,但是使用的工程师对源码的修改必须上传共享的协议;  

13、 Linux 发行版有哪些?各自的特点是什么?

Ubuntu、Fedora常用于桌面环境Red Hat、CentOS、Debian常用于服务器Ubuntu:安装简单        Unity 3D图形界面,比较华丽(因人而异)        对一些专有驱动支持比较好,例如显卡驱动        社区比较活跃,几乎遇到的问题都可以找到答案        版本更新较快,基本半年一个版本Debian:Free,最符合开源精神的发行版。默认不包含任何专有驱动。        软件包通常选择比较稳定的版本而不是最新的版本        系统的开发维护完全是由社区驱动的        APT软件包管理,图形化安装方式对新手友好Fedora:YUM包管理(新的包管理方式正在研发中) 新技术吸纳较快,所以喜欢尝试新技术的可以选择它 官网提供多种桌面环境镜像,可以满足不同桌面喜好的用户(默认是Gnome) 

14、 Linux 和windows 的区别?

Linux 开源Windows 不开源  

15、 Linux 文件类型有哪些?(ls -a/ls -l)

-(普通文件),d(目录文件),c/b(设备文件),l(链接文件)P(管道文件),s(共享文件),f(堆栈文件),.(隐藏文件)文件属性: 可读 可写 可执行r w x权重值:4 2 1   

16、 罗列 Linux 下文件操作的命令有哪些?(常见面试命令)

创建文件:touch;(强)删除:rm -f 文件名;编辑器 :gedit;查看:cat ;      编译器:gcc    执行可执行文件:./  

17、 如何配置 vim 编辑器?Linux 下还有哪些比较常用的文本编辑器?

vim 文件名;i 插入模式;esc 底行模式;esc + shift: wq(保存退出)yy 复制 ;nyy 复制n行 ;p 粘贴;dd 删除 ;u 恢复;Gedit,vi  

18、 如何压缩、解压文件?命令是什么?

tar cvzf 文件名.tar.gz 文件名tar xvzf 文件名.tar.gz(解压的当前目录)tar xvzf 文件名.tar.gz -c 目录名(解压到指定目录下)  

19、 gcc 编译器的优点有哪些?还知道哪些 C 的编译器?

可交叉编译;能够生成 预处理( .i),编译( .o),汇编 文件预处理:gcc -E 文件名.c > 文件名.i(>重定向);  gcc 文件名.c -I../(指定第三方搜索路径)编译:gcc -c 文件名.c ;汇编:gcc -S 文件名.c;C的编译器:  

20、 什么是交叉编译器?交叉编译器的作用?为什么需要交叉编译?

交叉编译:在当前 CPU 平台上编译的文件可以在其他 CPU 平台上工作;       作用:不同的 CPU 有不同的汇编;  

21、 C 语言中源文件到可执行文件经历哪几个步骤?每个步骤具体做哪些工作?

预处理,编译,汇编 链接预处理:头文件展开,宏替换,条件编译;编译:语法检查,词法分析;汇编:生成汇编语言;链接:地址和空间分配,重定义和符号决议;统计生成有逻辑的符号表进行地址    和空间分配;分为:静态 动态 链接;  

22、 #include 和 #include “stdio.h”的区别?

<>:只在系统头文件库中查找所需头文件;“ ” :现在当前目录(或指定目录)中的头文件库查找所需头文件,无果后再去 系统有文件库中查找;  

23、 分别阐述-I -w -Wall -O3 的作用?

-l 链接头文件库;-w 关闭警告;-Wall 开启警告;-O3 3级优化  

24、 什么是库文件?库文件的特点?

库文件即DLL(Dynamic Link Library)文件,是动态链接库文件,又称“应用程序拓 ”,是软件文件类型。特点:只能使用函数或变量但看不到具体实现;  

25、 Linux 下库文件的分类有哪些?库文件的存放路径是什么?

静态库 动态库;根目录下 lib 目录;  

26、 静态库和动态库的区别?

静态库:文件大,速度快,易部署,不易升级;动态库:文件小,速度慢,不易部署,易升级;  

27、 如何制作和使用静态库和动态库?

静态库: gcc -c 头文件.c   ar rcs lib头文件.a 头文件.o链接库:gcc 文件名.c -l头文件 -L.(其中-L./L:指定第三方搜索路径; . :当前目录)动态库: gcc -shared -fPIC -o 库名.so 源文件链接库:gcc 源文件.c ./库名.so -o 可执行文件  

28、 GDB的特点有哪些?

1. 能启动被调用程序;2. 能监视程序中变量的值;3. 能逐行执行代码;   

29、 分别阐述 run break info break continue finish 命令的作用?  

run:运行程序;break:断点;        info break:查看断点;        continue:跳过当前断点运行到下一次断点(无法直接跳出在循环中的断点);        finish:跳过当前断点运行,但只运行完子程序;  

30、 make 工程管理的作用?

一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中, makefile定义了一系列的规则来指定,哪 些文件需要先编译,哪些文件需要后编译, 哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell 脚本一样,其中也可以执行操所系统的命令。  

31、 makefile 的语法是什么?(定义、执行顺序)

 在各个子目录和当前目录中建立 mkdir Makefile,用vim对Makefile进行编写;      三要素:目标,依赖,命令;执行命令需要依赖文件,会生成目标文件                   格式:  目标:依赖                                tab          命令        执行循序:由上而下执行;  

32、 企业级工程目录是如何创建?分别描述三个不同 makefile 的作用?

总控 Makefile:将各个子目录下的 .o 文件链接生成可执行文件;子目录 Makefile:将目录下的 .c 文件编译生成 .o 文件;scripts 目录下的 Makefile:相当于C语言中的头文件定义了一些变量



测试题1.用C语言打印出杨辉三角 杨辉三角形是形如:11   11   2   11   3   3   11   4   6   4   1的三角形,其实质是二项式(a+b)n次方展开后各项的系数排成的三角形,它的特点是左右两边全是1,从第二行起,中间的每一个数是上一行里相邻两个数之和。2.C语言实现简单的计算器(加、减、乘、除)3.利用递归方法实现一个函数,该函数能够实现n的阶乘,n! = n*(n-1)**3*2*1;4.输入一个字符串,计算字符串中子串出现的次数
实现方法第一题  杨辉三角形#include typedef int Int; Int main() //mian函数 { Int n; //变量n;用于读取键盘输入 Int i; //变量i;用于表示行 Int j; //变量j;用于表示列 Int tri[100][100]; //定义100行100列的二维数组 printf("(num < 100)num = ");//输出(num < 100)num =? scanf("%d",&n); //读取键盘输入 for(i = 0;i <= n;i++) //从i=0,每次i+1,循环到i=n; { for(j = 1;j <= i;j++) //从j=0,每次j+1,循环到j=i; { if(j == 0) //判断如果j是0 { tri[i][j] = 1; //二维数组tri[i][0]为1 printf("%d ",tri[i][j]);//打印 } if(j == i) //判断如果j等于i { tri[i][j] = 1; //二维数组tri[i][j]为1; printf("%d ",tri[i][j]); //打印 } else //不满足以上条件 { tri[i][j] = tri[i - 1][j - 1] + tri[i - 1][j]; //二维数组当前的值为此数值上一行和(此数值上一行)前一列想加的值 if(tri[i][j] >= 10)//判断tri[是否大于10] { printf("%d ",tri[i][j]); //打印 } else { printf("%d ",tri[i][j]); //打印 } } } } return 0; //返回0 }

第二题  计算器#include #include //头文件中包含exit函数 typedef double Double; typedef signed int Int; typedef signed char Char; Int main() //主函数 { Double a; //变量a(双精度);用来读取键盘输入 Double b; //变量b(双精度);用来读取键盘输入 Char m; //变量m;用来读取键盘输入 while(m != '~') //当 m 不为 ~ 时 死循环 { printf("quit:1~1 (exmple 1+2) Please input : "); //打印quit:1~1 (exmple 1+2) Please input : scanf("%lf%c%lf",&a,&m,&b); //读取键盘输入给a,m,b switch(m) //判断 m { case '+' : printf("result = %lf ",a + b);break; //如果m是+;打印a+b的值 case '-' : printf("result = %lf ",a - b);break; //如果m是-;打印a-b的值 case '*' : printf("result = %lf ",a * b);break; //如果m是*;打印a*b的值 case '/' : printf("result = %lf ",a / b);break; //如果m是/;打印a/b的值 //case '~' :printf(" Thanks! "); exit(0); //如果m是~;调用quit函数;无错退出死循环 default: printf("error ");break; } } printf(" Thanks! "); }

第三题  递归调用实现阶乘#include #include //头文件包含exit函数 typedef float Float; Float fact(Float n) //fact子函数 { if(n < 0) //判断n是否<0 { printf("error! "); //打印error! } if(n == 1 || n == 0) //判断n是否等于1或者n是否等于0 { return 1; //返回1 } return n * fact(n - 1); //返回n * fact(n - 1):如此循环可以实现n*(n-1)一直加到n=1之后函数返回1,数值不变化 } Float main() //主函数 { Float n; //定义变量n,用于读取键盘输入值 while(n != 35) //死循环 { printf("if input=35 quit; Please input : "); //打印 scanf("%f",&n); //读取键盘输入给n printf("result = %.0f ",fact(n)); //打印子函数返回值,不显示小数点后数据 // switch(n) //判断n // { // case 99:exit(0); //如果n为35;退出死循环 // } } printf(" Thanks! "); //如果 n = 35 那么计算量太大,float 数据类型不满足计算,本机不做要求;退出输出Thanks! return ; //返回 }

第四题       输入一个字符串,计算字符串中子串出现的次数#include #include //包含字符的头文件库;包含strncmp和strlen子函数 typedef unsigned int Int; typedef unsigned char Char; Int main() //主函数 { Char str1[100]; //定义一维数组str1 Char str2[20]; //定义一维数组str2 printf("example:hello h 输入2个数组: "); //打印 scanf("%s %s",str1,str2); //读取键盘输入给数组str1 str2 Char *p1 = str1; //定义指针p1指向数组str1地址 Char *p2 = str2; //定义指针p2指向数组str2地址 Int n; //定义变量n Int num = 0; //定义变量num,用来记录重复个数 n = strlen(p2); //读出p2字符串长度 while(strlen(p1) > n) //如果字符串1的长度大于字符串2的长度进入循环 { if(strncmp(p1,p2,n) == 0) //调用strncmp函数进行判断 { num++; //每记到一次‘'