影石Insta360嵌入式软件开发工程师笔试9-21
《嵌入式软件开发笔试与面试手册》:https://blog.nowcoder.net/zhuanlan/jvN8gj
《软件开发笔试汇总》:https://blog.nowcoder.net/zhuanlan/0oDWVm
选择题(共2题)
1.[单选]
如下哪个命令可以帮助你知道shell命令的用法?
A. more
B. man
C. help
D. pwd
2.[单选]
以下代码共创建几个进程?
int main()
{
fork() || fork();
}
A.3
B.4
C.5
D.2
问答题
1、描述操作系统中锁的底层实现原理。
具体的锁会跟操作系统、硬件喝特点的需求有所不同。这里主要介绍Linux操作系统中锁的底层实现原理。
1)自旋锁:自旋锁使用原子操作来检查和设置锁状态。当一个线程尝试获取锁时,它会使用如test-and-set或compare-and-swap等硬件指令来检查锁是否可用。如果锁被占用,线程会在一个循环中不断地尝试获取锁,这就是所谓的"自旋"。
2)互斥锁(互斥量):互斥量的实现通常结合了自旋锁和调度器的功能。当一个线程尝试获取一个已经被占用的互斥量时,它可能首先会自旋一小段时间,然后如果仍然不能获取锁,它会被放入休眠状态,直到锁被释放。
3)读写锁:读写锁通常使用一个计数器来跟踪当前的读者数量。写锁会检查这个计数器,确保没有活跃的读者,然后才能被获得。
4)信号量:信号量使用一个整数值和一个等待队列。当线程尝试减少信号量的值并且结果为负时,线程会被放入等待队列并休眠。当信号量被释放时,等待队列中的线程之一会被唤醒。
5)RCU锁:RCU使用了一种特殊的引用计数技术。当读者开始读取时,它们会增加一个计数器。写者会创建数据的一个新副本并进行修改,然后更新指向数据的指针。只有当所有的读者都完成读取(即引用计数器归零)时,旧的数据才会被释放。
2、请从“光圈”、“快门速度”、“感光度”、“白平衡”、“景深“中任选2个进行叙述?
笔试是只需要写两个,在此就全部叙述了。
1)光圈是相机镜头中的一个开口,它决定了多少光线可以进入相机并达到传感器。光圈的大小通常用f-stop数值表示,如f/1.4、f/2.8等。较小的f-stop值表示大的光圈开口,允许更多的光线进入,而较大的f-stop值则表示小的光圈。光圈的大小还影响到照片的景深。
2)快门速度表示相机的快门打开的时间长度,允许光线进入传感器。它可以是几秒或几分之一秒,如1s、1/100s、1/1000s等。快的快门速度可以捕捉到快速的动作,而慢的快门速度可以创造动态或模糊的效果。
3)感光度,通常称为ISO,表示相机传感器对光的敏感性。较低的ISO值(如ISO 100或200)意味着较低的敏感性,适用于光线充足的环境,而较高的ISO值(如ISO 1600或3200)在低光环境中更为有用。但是,较高的ISO值可能会导致照片中出现噪点。
4)白平衡是相机调整颜色温度,确保照片中的白色真正显示为白色,而不是偏向某种颜色(如蓝色或橙色)。不同的光源(如日光、草率灯、白炽灯)会产生不同的颜色温度,白平衡确保颜色的准确性。
5)景深描述了照片中清晰和模糊区域的范围。浅景深意味着只有照片的一小部分是清晰的,而其余部分是模糊的,这通常是由大光圈(如f/1.4)产生的。深景深意味着照片的大部分或全部都是清晰的,这通常是由小光圈(如f/16)产生的。
3、数组指针和指针数组分别是什么?他们有什么区别?什么是函数指针?他一般有哪些使用场景?
分别是:
数组指针是指向数组的指针。例如,p是一个指针,它指向一个包含10个整数的数组,int (*p)[10]。
指针数组是一个数组,其中每个元素都是指针。例如,int *arr[10]定义了一个数组,该数组有10个元素,每个元素都是一个指向整数的指针。
区别:
数组指针是一个指针,它指向一个整个数组。
指针数组是一个数组,它的每个元素都是指针。
函数指针:
函数指针是指向函数的指针,而不是指向数据的指针。通过函数指针,我们可以调用函数,就像直接使用函数名一样。
使用场景:
回调函数、跳转表、插件架构
4、关键字static的用途是什么?
1)局部变量:使函数内的变量在多次调用之间保持其值。
2)全局变量/函数:限制其作用域仅在定义它的文件中。
3)类成员 (仅C++):为类的所有对象创建一个共享的变量,或定义一个不依赖特定对象的函数。
5、描述DMA的作用以及内存处理机制。
DMA的作用:
DMA允许外部硬件子系统直接访问计算机的内存,而无需通过CPU进行中介处理,提高了数据传输的效率。
内存处理机制:
1)请求与授权:当一个外部设备需要进行数据传输时,它发送一个DMA请求给DMA控制器。DMA控制器在得到CPU的许可后,会发出一个授权信号给请求的设备。
2)地址与计数:DMA控制器有自己的地址寄存器和计数寄存器。地址寄存器决定了数据在内存中的位置,而计数寄存器决定了要传输的数据量。
3)数据传输:一旦得到授权,DMA控制器会直接控制数据总线和地址总线,从而绕过CPU直接将数据从外部设备传输到内存,或从内存传输到外部设备。
4)终止:当所有数据都被传输完毕,DMA控制器会终止操作并通知CPU数据传输已完成。
6、如何保证编写的代码功能稳定性?
1)代码审查:定期进行代码审查可以帮助识别和修复潜在的问题,并确保代码质量。
2)单元测试:为代码的每个功能或模块编写单元测试,并确保它们在每次更改后都能通过。
3)集成测试:确保不同的代码部分可以正常地一起工作。
4)错误处理和日志:编写鲁棒的错误处理代码,并记录详细的日志,以便在出现问题时进行调试。
5)版本控制:Git
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
本专栏主要发布嵌入式软件开发相关岗位2023年(2024届)的笔试真题(嵌入式软件开发、通用软件开发、C/C++软件开发、算法工程师、数据开发、测试开发等)主要是算法编程题,其中一些岗位笔试含有对应的选择题、填空题、简单题。