嵌入式软件开发面试题(一)

news2024/10/6 18:24:00

目录

1.用预处理指令表示一年有多少秒

2.写出float x 与“零值”比较的if语句

3.为什么说if(0==x)比if(x==0)好?

4.将地0x8000中存放的整形变量,清除bit1。

5.linux下用shell命令在当前目录下创建myfolder目录,并将此目录的权限设为拥有者可读写群组和其他成员均可读不可写,且拥有者,群组和其他成员全都不可执行。

6.以下为32 位机器上的C 程序,请计算下列sizeof 的值.

7.简述代码编译后生成的map文件里面的内容?

8.在数据通信过程中,设置某普通串口的波特率为115200,则此串口每秒能传输多少KB数据。写出推导过程

9.如下代码的输出是什么?

10.如下ISR代码是否有问题? 如有问题指出问题点?

11.列举出10个Linux操作命令。

12.写出你熟悉的一个嵌入式芯片的型号、性能指标及资源分布情况

13.画出你最熟悉的一个实践项目的系统框图注:此题目,在纸上作答然后拍照上传

14.列举一个你在所做项目中遇到的技术问题,并描述分析问题的思路及最终解决问题的方法。

15.根据如下简易原理图,实现发光二极管的流水灯控制。要求控制方向依次从左到右从上到

16.进程和线程的区别??

17.静态局部变量和局部变量的区别


        总结一下最近看到的面试题吧!

        表达很重要,有时候不会表达你会这个别人也不知道,还有不要紧张不然会把会的的东西也说不出来。下面是我自己的理解不一定对哦,有不同的意见欢迎讨论。

1.用预处理指令表示一年有多少秒

        忽略了闰年。防止数据超过整型的限制,毕竟有些单片机的整型是16位的。或者8位的,单片机中整型的位数和CPU的位数是一致的。 当然如果整型是8位那长整型16也存不下哈哈,这题吧有些不太严谨。

#define UL unsigned long int
#define YEAR UL( 60 * 60 * 24 * 365)

2.写出float x 与“零值”比较的if语句

        之前看过B站李晓力嵌入式,正好看到这个了,说float和double是表示浮点型的,就是小数,小数不像整数,小数给个范围就有无数个。但是float是怎么表示一个小数的呢,他是由定点数乘以基数得到的,这个基数通常是2倍数

 

 深入理解C语言浮点数类型 【C语言进阶必看】_哔哩哔哩_bilibili

所以比较浮点型要确定一个范围

float的精度只有7位1位整数6位小数

所以说只能是区域性的判断,我们在0.000001和-0.000001之间的数都被认为是0

if( (x > -0.000001) && (x < 0.000001)){}

3.为什么说if(0==x)比if(x==0)好?

        如果你少写了一个等号

        x = 0不会报错, 0 = x会报错,正确书写他俩的效果是一致的,就是在错误书写时可以让大家很好的判断出来。

4.将地0x8000中存放的整形变量,清除bit1。

        答案很多,直接操作地址用无符号整型就好,因为机器的位数永远和它的整型一致。

*( unsigned int *)0x8000 &= 0x1101;

*( unsigned int *)0x8000 &= ~(0x1 << 1);

        其实上面的第一种不好,但是当时我紧张就写了第一种这个形式,之前在ARM裸机开发的时候我们经常做寄存器的操作,开始都是这种取反左移在位运算的,后面知道了寄存器就是32位的才直接操作就写个32位的16进制数。不知道位数的时候最好用取反左移的形式,会自动变成对应位的16进制数,我第一种是默认他就0x8000这种16位的地址了。

5.linux下用shell命令在当前目录下创建myfolder目录,并将此目录的权限设为拥有者可读写群组和其他成员均可读不可写,且拥有者,群组和其他成员全都不可执行。

mkdir myfolder

sudo chmod 644 myfolder

因为不知道当前目录在用户目录下还是根目录下,加上sudo确保更改权限成功

三个数字分别是拥有者,组群和其它用户的权限每个用户用三位二进制表示分别是可读可写可执行

然后转化成对应10进制就行了。可读可写就是6可读不可写就是4.其实最前面还有一个d表示是文件还是目录

6.以下为32 位机器上的C 程序,请计算下列sizeof 的值.

char str[] = "hello world";
char *p1 = str;
int n = 100;
void *p2 = malloc(n);

第一个字符串算上结束标志大小是12

第二个一个指针32位机的话是4

第三个整型变量是4

第四个一个malloc申请空间后的指针还是一个指针所以还是4

7.简述代码编译后生成的map文件里面的内容?

        这题有点懵因为我用map文件只在编译内核依赖的时候用过,一个依赖于其它模块的模块在编译时要把对应模块的map拿过来。里面的内容分为五大块

Archive member included to satisfy reference by file (symbol)
调用的库函数信息:来自哪个.a中的哪个.o
Allocating common symbols
未初始化的全局变量:大小 变量出处
Discarded input sections
没有被调用的函数、变量
Memory Configuration
根据.ld文件中MEMORY来划分的内存区域:名称、起始地址、长度
Linker script and memory map
链接所需要的.o .a
根据.ld文件中SECTION来划分的区域:
.txt 代码段
.rodata 字符串和局部变量
.srodata 库中用到的rodata
.rela.dyn
.rela.text. 待重定位的函数信息
.data 数据段(大)
.sdata 数据段(小)
.bss 初始化为0的变量(大)
.sbss 初始化为0的变量(小)
COMMON 未初始化的变量
.attributes
.debug_info
.debug_abbrev
.debug_loc
.debug_aranges
.debug_line
.debug_str
.debug_frame
 

8.在数据通信过程中,设置某普通串口的波特率为115200,则此串口每秒能传输多少KB数据。写出推导过程

115200 / 10 = 11520 byte   //假设8N1的状态下

11520 / 1024 = 1.25 KB

 

9.如下代码的输出是什么?

int x, y, z;
x = y = 10;
z = ++x || ++y;
printf("x=%d, y=%d, z=%d", x, y, z);

逻辑或有一个不是0就结束了它的值也只是0或者1而位或才是每一位都或

当时草率了直接写的11 10 1

x=11,y=10,z=1

10.如下ISR代码是否有问题? 如有问题指出问题点?

#define PI 3.14
__interrupt double isr_function (double radius)
{
    double area = PI * radius * radius;
    printf("Area = %f", area);
    return area;
}

        ISR就是中断服务程序的英文缩写,中断服务程序不允许有参数传入也不能有返回值都要是void。

        printf是一个不可重入的函数,它的底层调用是全局的同一时间只能一个函数在用,可是写到中断中就未可知了,只能使用重定向到串口的printf或者自己封装的寄存器串口进行打印,其实直接用也不一定错误,就是很危险。通常在中断入口进行中断禁止结束在打开。

11.列举出10个Linux操作命令。

ls pwd touch vi(有可能不算,毕竟是程序的命令不确定算不算linux的,可是这个程序所有的linux都内置的,但是话又说回来所有的命令不都是封装好的程序么。)mkdir grep find chmod ping

tftp ifconfig fdisk echo cat nc nm 。。。。。

12.写出你熟悉的一个嵌入式芯片的型号、性能指标及资源分布情况

其实最熟悉的是32的c8t6哈哈,感觉太简单了,就写了一个比较熟悉的A核的exynos4412


exynos4412: 4核,1.5GHZ,4G内存,内核架构四颗CPU全是Ctrox-A9八级流水线,支持IC,uart,ADCHDMI,CAN,SPI,DMA等常见外设,使用精简指令集,采用32位架构

13.画出你最熟悉的一个实践项目的系统框图注:此题目,在纸上作答然后拍照上传

我把我的zigbee物联网仓储解决方案放上去了,B站有图,当时画了半小时呢,主要太大了,这次就简单画画

14.列举一个你在所做项目中遇到的技术问题,并描述分析问题的思路及最终解决问题的方法。

文件删了,懒着再写一次了,就把前几天移植FreeRTOs的那个问题写上去了。

15.根据如下简易原理图,实现发光二极管的流水灯控制。要求控制方向依次从左到右从上到

这题可挺经典,遇到好几次了,

也没说芯片型号只能写伪代码了,

//由于不知道芯片型号这里采取裸机伪代码的形式表述
//引用芯片的代码库
//由于矩阵LED的控制方式全是采取引脚控制基极,所以高电平导通 


int main()
{
	//初始化系统时钟及相关引脚时钟 
	//配置引脚寄存器 
	//通常使用一个寄存器管理一组引脚的输出情况,所以下面遍历可以采取位运算的形式
	//可以循环左移向高位遍历加if复位循环右移低位遍历if复位
	while(1){
		//也可以在这里恢复两个寄存器的初始状态,将出for循环的条件变成A7被置位和B8被置位。 
		for(;;){
			//由于顺序是左到右上到下外层遍历 V1-V4也就是PA8引脚到PA11引脚为高电平,在设置PA这组引脚某位
			//为高电平时其它引脚保证为低电平。 
			for(;;){
					//同理从左到右遍历 PB7到PB4. 
			}
		}
	}
} 

16.进程和线程的区别??

进程:进程是系统分配资源和调度的基本单位,也就是说进程可以单独运行一段程序。
线程:线程是cpu调度和分派的最小基本单位。

区别:
1.一个进程可以包含至少一个线程,一般来说也就是主线程,而一个线程只能属于一个进程;
2.进程拥有独立的内存,而线程没有独立的资源空间, 只是暂时存储在计数器,寄存器,栈中,同一个进程间的线程可以共享资源。
3.将代码放入到代码区之后,进程产生,但还没执行,我们所说的执行一般是是主线程main函数开始执行。
4.进程比线程更加消耗资源
5.进程对资源的保护要求高,而线程要求不高
6.进程是处理器这一层面的抽象,而线程是进程的基础上进一步并发的抽象
7.同一个进程下,一个线程的挂掉,会导致整个进程的挂掉,而进程之间不会相互影响
8.总的来说:我们都知道程序不能单独运行,只有将它放入内存中,分配资源才能运行,程序是指令的集合,而进程是程序的一次执行活动,属于动态概念
9.我们可以打个比方:进程相当于某一个大型项目,世界上可能有人同时在做这个项目,有其独特的方式;而线程就相当于这个项目下的一些程序员,多个程序员去完成这一个项目肯定要比一个人完成快的多,也就是能在同一时间操作。

决定同步:
1.互斥锁:同一个进程下,当某个线程使用进程的共享资源时,其他线程必须等待该线程结束
2.信号量:进程拥有同一时间最大访问数量


-----------------------------------
©著作权归作者所有:来自51CTO博客作者漫话人生的原创作品,请联系作者获取转载授权,否则将追究法律责任
进程和线程的定义和区别
https://blog.51cto.com/u_15711868/5455223

线程之间可以独立拥有的资源

线程独立的资源包括:
(1)线程ID:每个线程都有自己唯一的ID,用于区分不同的线程。

(2)寄存器组的值:当线程切换时,必须将原有的线程的寄存器集合的状态保存,以便重新切换时得以恢复。

(3)线程的堆栈:堆栈是保证线程独立运行所必须的。

(4)错误返回码:由于同一个进程中有很多个线程同时运行,可能某个线程进行系统调用后设置了error值,而在该线程还没有处理这个错误,另外一个线程就在此时被调度器投入运行,这样错误值就有可能被修改。所以,不同的线程应该拥有自己的错误返回码变量。

(5)线程优先级:线程调度的次序(并不是优先级大的一定会先执行,优先级大只是最先执行的机会大)。

17.静态局部变量和局部变量的区别

区别:

1、静态局部变量属于静态存储类别,在静态存储区内分配存储分配单元。在程序整个运行期间都不释放。而自动变量(即动态局部变量)属于动态存储类别,占动态存储区空间而不占静态存储空间,函数调用结束后立即释放。

2、对静态局部变量是在编译时赋初值的,即只赋值一次,在程序运行时它已有初值。以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。而对自动变量赋初值,不是在编译时进行的,而是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。

3、如在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0或空字符。而对自动变量来说,如果不赋初值则它的值是一个不确定的值。这是由于每次函数调用结束后存储单元已释放,下次调用时又重新另分配存储单元,而所分配单元的值不确定。

4、虽然静态局部变量在函数调用结束后仍然存在,但其他函数不能引用它

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/719265.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

携手共赢!润建股份与科士达达成战略合作

7月4日&#xff08;今日&#xff09;&#xff0c;润建股份有限公司&#xff08;以下简称”润建股份“&#xff09;与深圳科士达科技股份有限公司&#xff0c;在科士达光明工业园正式签署战略合作框架协议&#xff0c;双方将发挥各自领域的技术优势&#xff0c;在新能源与数字科…

Android开发之屏幕尺寸的兼容

屏幕尺寸和密度 本部分提供了具有特定屏幕配置&#xff08;由屏幕尺寸和密度定义&#xff09;的设备的相对数量数据。为了简化针对不同屏幕配置设计界面的过程&#xff0c;Android 将实际屏幕尺寸和密度的范围划分为多个区间&#xff08;如下表所示&#xff09;。 ldpi mdpitv…

MySQL之数据库引擎详解(内附面试题:InnoDB和MyISAM的联系与区别)

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于MySQL数据库引擎的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一. 数据库引擎是什么&#xff…

【kubernetes系列】Kubernetes之生命周期和重启策略

概述 Pod 遵循一个预定义的生命周期&#xff0c;起始于 Pending 阶段&#xff0c;如果至少 其中有一个主要容器正常启动&#xff0c;则进入 Running&#xff0c;之后取决于 Pod 中是否有容器以 失败状态结束而进入 Succeeded 或者 Failed 阶段。 在 Pod 运行期间&#xff0c;k…

(30)精准降落和悬停(IRLock)

文章目录 30.1 概述 30.2 哪里可以买到 30.3 连接到自动驾驶仪 30.4 安装到框架上 30.5 通过任务规划器进行设置 30.6 飞行和测试 30.1 概述 Copter 支持使用 IR-LOCK 传感器(IR-LOCK sensor)和声纳或激光雷达(sonar or lidar)进行精确着陆。使用该系统&#xff0c;当飞行…

畅谈RocketMQ重复消费7个根源问题

在众多关于MQ的面试八股文中有这么一道题&#xff0c;“如何保证MQ消息消费的幂等性”。 为什么需要保证幂等性呢&#xff1f;是因为消息会重复消费。 为什么消息会重复消费&#xff1f; 明明已经消费了&#xff0c;为什么消息会被再次被消费呢&#xff1f; 不同的MQ产生的…

0基础学习VR全景平台篇 第56篇:专业版功能-故事线

功能位置示意 一、本功能将用在哪里&#xff1f; 故事线功能&#xff0c;支持将多个VR视频片段&#xff0c;自由设置剧情&#xff0c;在故事中设置多个路线结局&#xff0c;实现VR视频创作新玩法。 区别传统VR视频单项输出内容&#xff0c;促使用户主动思考&#xff0c;参与剧…

windows、linux部署seata1.3.0

前提:https://github.com/alibaba/spring-cloud-alibaba/wiki/版本说明Spring Cloud AlibabaSpring CloudSpring BootNacosSeata2.2.7.RELEASESpring Cloud Hoxton.SR122.3.12.RELEASE2.0.31.3.0背景:seata配合nacos使用,并开启nacos,nacos使用默认的namespace,mysql5.7 s…

在Jetpack Compose中使用SurfaceView

在 Android 开发中&#xff0c;SurfaceView 是一种特殊的视图&#xff0c;它拥有自己的专用绘图表面&#xff0c;可以在后台线程中更新&#xff0c;非常适合需要频繁和快速绘制的地方&#xff0c;如游戏和视频播放。然而&#xff0c;在Jetpack Compose&#xff08;Google的新的…

dxf文件怎么转成dwg格式?分享几种简单的转换方法

将DXF文件转成DWG格式可以提高CAD文件的兼容性和功能性&#xff0c;使其更易于在不同的CAD软件之间传输和共享。如果我们需要与其他人共享CAD图纸&#xff0c;或者想要更好地利用CAD编辑软件的各种功能和工具&#xff0c;将文件转换为DWG格式会更好一些&#xff0c;那么怎么进行…

佳明手表APP开发系列02——汉字和图标的标准显示

前言 使用点阵字库的方式来汉化或者增强佳明App的显示是一种传统的方法&#xff0c;操作繁琐&#xff0c;效果也一般。笔者通过进一步的学习&#xff0c;发现佳明的MonkeyC支持一种新的方式&#xff0c;即 BmpFont文件的显示&#xff0c;可以像使用普通字符一样对包括汉字在内…

东芝光电耦合器TLP152(TPL,E的工作原理以及应用

东芝深力科TLP152(TPL,E是SO6封装中的光电耦合器&#xff0c;由GaA组成ℓ作为红外发光二极管&#xff08;LED&#xff09;光学耦合到集成的高增益、高速光电探测器IC芯片。光电探测器IC芯片具有内部屏蔽&#xff0c;提供20kV的高共模瞬态抗扰度/s&#xff0c;从而在输入和输出引…

MySQL-分库分表详解(二)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…

港联证券|利好刺激创新药板块迎久违拉升 估值处历史低位

昨日&#xff0c;国家医保局就《谈判药品续约规则》及《非独家药品竞价规则》公开征求意见。在此利好消息影响下&#xff0c;创新药板块集体拉升。截至收盘&#xff0c;创新药指数涨幅近1%&#xff0c;实现四连阳。港股创新药指数收盘涨超3%。 机构认为政策利好创新药发展 《非…

Impala3.4源码阅读笔记(一)data-cache功能

前言 本文为笔者个人阅读Apache Impala源码时的笔记&#xff0c;仅代表我个人对代码的理解&#xff0c;个人水平有限&#xff0c;文章可能存在理解错误、遗漏或者过时之处。如果有任何错误或者有更好的见解&#xff0c;欢迎指正。 基本信息 data-cache是impala在本地的数据缓…

解决github无法打开问题

第一步&#xff0c;去如下目录复制hosts文件副本到桌面【切记&#xff0c;要复制到其他文件夹下&#xff0c;不要直接改原文件】。 C:\Windows\System32\drivers\etc 第二步&#xff0c;以文本文档形式打开复制的副本文件&#xff0c;添加如下语句保存后【替换】掉原有hosts文件…

Ubuntu 16.04 安装Arduino ESP32开发环境记录

文章目录 安装arduino开发环境&#xff1a;安装ESP32开发环境编译上传 安装arduino开发环境&#xff1a; Arduino IDE 2.x好像对于ubuntu16.04不太支持&#xff0c;尝试了一下执行不了。这里 我们可以下载早期的1.8.x版本。 根据自己的电脑类型在红框中选择对应的版本进行下载…

CHI 控制信号说明

&#xff08;部分描述采用了他人的文章&#xff0c;待后续补充出处&#xff0c;此处为草稿&#xff09; Address PA/VA 位宽之间的对应关系&#xff1b; Non-secure bit 该bit指示了secure和non-secure空间&#xff0c;对于snoopable的trans, 即使地址相同&#xff0c;secure和…

阿里首次公布 Java10W 字面试复盘笔记,面面俱到、太全了

Java 面试 “金三银四&#xff0c;金九银十”这个字眼对于程序员应该是再熟悉不过的了&#xff0c;每年的金三银、金九银十都会有很多程序员找工作、跳槽等一系列的安排。说实话&#xff0c;面试中 7 分靠能力&#xff0c;3 分靠技能&#xff1b;在刚开始的时候介绍项目都是技…

代码行数统计插件(Intellij IDEA 代码统计插件 Statistic 详细使用教程)

代码行数统计插件&#xff08;Intellij IDEA 代码统计插件 Statistic 详细使用教程&#xff09; 在项目的开发过程中&#xff0c;你有没有遇到以下的一些场景&#xff1a; 想统计一下整个项目的代码量有多少&#xff0c;比如有多少源代码文件&#xff0c;总体有多少行代码&…