摩拜嵌入式软件工程师笔试题详解

作者

Lee

公司虽然倒闭了,但是笔试题还是值得深究。

试题来自牛客网。

下面代码片段中有哪些隐患或者错误

void*get1(){charbuf[12]={"abc"};returnbuf;}voidget2(int*p){p=newint[10];}intmain(){int*m;get2(m);m=get1();memcpy(m,"aaa",3);return0;}

题解:

指针m没有初始化,属于野指针;

get2(m)属于值传递,操作完后并没有让指针m指向新申请的空间;

returnbuf属于返回栈空间地址,函数调用完,栈空间被释放,所以返回的地址没有任何意义,不能使用;

memcpy函数,会直接导致段错误,因为此时m还是一个野指针。

用变量a给出以下定义:

一个指向指针的指针,它指向的指针是指向一个整型数;

一个有10个指针的数组,该指针是指向一个整型数的;

一个指向有10个整型数数组的指针;

答案:

int**a;int*a[10];int(*a)[10];

简述SPIIICUART接口的区别和各自收发数据的方法

答案:UART是全双工方式,主机和从机至少要接三根线,RX(接收)、TX(发送)和GND;SPI是全双工串行总线,由一个主设备和多个从设备组成,由四跟信号线组成:SDI(串行数据输入)、SDO(串行数据输出)、SCK(串行移位时钟)、CS(从使能),以CS选择从机;IIC是半双工通信,由两根信号线组成:SCL(时钟线)和SDA(数据线),以地址选择从机。

从以下几种无线通信方式中选取一种了解的尽可能详细的描述一下:BLE,WiFi,NFC,NB-IoT,eMTC。

答案:

BLE,即蓝牙技术,是一种近距离无线通信方式,诞生于年,由Ericsson公司首先提出。蓝牙协议的标准版本为.15.4,其传输频段为全球公共通用的2.4GHzISM频段,提供1Mbps的传输速率和10m的传输距离。缺点是高成本、低传输距离、扛干扰能力不强;

WiFi(WirelessFidelity,无线高保真),也是一种短距离无线通信技术,正式名称是.11b,其工作频率是2.4GHz,最高速率可达11Mbps,覆盖范围可达m。是以太网的一种无线扩展。

NFC(NearFieldCommunication,近距离无线传输),是由Philips、NOKIA和Sony主推的一种类似于RFID(非接触式射频识别)的短距离无线通信技术。和RFID不同,NFC采用双向的识别和连接,在20cm距离内工作与13.56MHz频率范围内。

NB-IOT:窄带物联网(NarrowBandInternetofThings,NB-IoT),NB-IoT是IoT领域一个新兴的技术,支持低功耗设备在广域网的蜂窝数据连接,也被叫作低功耗广域网(LPWAN)。NB-IoT支持待机时间长、对网络连接要求较高设备的高效连接。

全称是LTEenhancedMTO,是基于LTE演进的物联网技术。为了更加适合物与物之间的通信,也为了更低的成本,对LTE协议进行了裁剪和优化。eMTC基于蜂窝网络进行部署,其用户设备通过支持1.4MHz的射频和基带带宽,可以直接接入现有的LTE网络。eMTC支持上下行最大1Mbps的峰值速率,可以支持丰富、创新的物联应用。

试描述MQTT、CoAP、HTTP三种协议的区别。

答案:

协议栈MQTT使用TCP协议;CoAP使用UDP协议;HTTP使用TCP协议。请求方式MQTT使用发布/订阅请求方式;CoAP使用POST/GET请求方式;HTTP同样使用POST/GET请求方式。通讯消息格式MQTT:

CoAP:

HTTP:

特点和应用场景MQTT是多个客户端通过一个中央代理传递消息的多对多协议。它通过让客户端发布消息、代理决定消息路由和复制来解耦生产者和消费者。虽然MQTT持久性有一些支持,但它是最好的实时通讯总线。CoAP基本上是一个在Client和Server之间传递状态信息的单对单协议。虽然它支持观察资源,但是CoAP最适合状态转移模型,而不是单纯的基于事件。HTTP是适合使用在性能好一些的终端上,相对以上一些比较重,对设备要求相对高一些。不适合M2M的场景。六

试描述TCP建立和断开连接时的三次握手和四次挥手。

答案:

一顿饭的功夫,我终于给女朋友讲明白了TCP四次分手

一个无序的长度为n的数组,找到最小的值,请用C语言编码实现以下函数。

intget_min(int*array,intn){}

答案:

intget_min(int*array,intn){inti;intmin=array[0];for(i=1;in;i++){if(array[i]min)min=array[i];}returnmin;}题解:因为是无序的数组,所以只能从数组第一个元素开始,逐个比较,记录下较小的数字,直到数组遍历完毕。

工厂生产摩拜单车包含两道工序,工序A每5min生产一辆摩拜单车,生产完成后送到工序B检测,每1min检测一辆,检测失败的需要返回工序A重新生产;试用多线程(多任务)的机制实现上述的生产工序,实现产能的最大化。

答案:

#includestdio.h#includepthread.h#includestdlib.h#includeunistd.h#includetime.h#includequeueusingnamespacestd;queueintq1;//存放已经生产的、未检测的车辆queueintq2;//存放检测不合格的车辆intnum=0;//车辆编号void*create_bike(void*arg){while(1){if(q2.empty())//没有不合格的,生产新的车辆{sleep(5);num++;printf("生产了一辆自行车%d,待检测\n",num);q1.push(num);}else//有不合格的车辆,重新生产{intn=q2.front();q2.pop();sleep(5);printf("车辆%d重新生产完成,待检测\n",n);q1.push(n);}}}void*test_bike(void*arg){while(1){if(!q1.empty())//有需要检测的自行车{intn=q1.front();q1.pop();sleep(1);if(rand()%2==0){printf("自行车%d检测合格\n",n);}else{printf("自行车%d检测不合格,返厂\n",n);q2.push(n);}}}}intmain(){intret;pthread_ttid[2]={0};srand(time(NULL));ret=pthread_create(tid[0],NULL,create_bike,NULL);if(ret!=0){perror("pthread_create");exit(1);}ret=pthread_create(tid[1],NULL,test_bike,NULL);if(ret!=0){perror("pthread_create2");exit(1);}void*val;pthread_join(tid[0],val);pthread_join(tid[1],val);return0;}

运行结果:

生产了一辆自行车1,待检测自行车1检测合格生产了一辆自行车2,待检测自行车2检测不合格,返厂生产了一辆自行车3,待检测自行车3检测不合格,返厂车辆2重新生产完成,待检测自行车2检测不合格,返厂车辆3重新生产完成,待检测自行车3检测不合格,返厂车辆2重新生产完成,待检测自行车2检测不合格,返厂车辆3重新生产完成,待检测自行车3检测合格车辆2重新生产完成,待检测自行车2检测合格生产了一辆自行车4,待检测自行车4检测合格生产了一辆自行车5,待检测自行车5检测不合格,返厂生产了一辆自行车6,待检测自行车6检测合格车辆5重新生产完成,待检测自行车5检测不合格,返厂生产了一辆自行车7,待检测自行车7检测不合格,返厂车辆5重新生产完成,待检测自行车5检测不合格,返厂车辆7重新生产完成,待检测自行车7检测不合格,返厂车辆5重新生产完成,待检测自行车5检测不合格,返厂车辆7重新生产完成,待检测自行车7检测合格车辆5重新生产完成,待检测自行车5检测合格生产了一辆自行车8,待检测自行车8检测不合格,返厂生产了一辆自行车9,待检测

题解:

创建两个线程,一个负责生产自行车,一个负责检测自行车。

生产之前需要检测队列,如果有不合格的车辆,则重新生产不合格的车辆,如果没有不合格的车辆,则生产新的车辆。

检测自行车之前,需要检测队列,如果有自行车需要检测,则开始任务,如果没有,不做任何处理。

学嵌入式,从学益得开始

扫描


转载请注明:http://www.zjiaren.com/kfff/kfff/13045.html