嵌入式 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++; //每记到一次‘'