深圳幻海软件技术有限公司 欢迎您!

嵌入式面试题1

2023-06-26

1、用预处理指令交换两个参数的值#defineSWAP(a,b){intc=a;a=b;b=c}2、写出floatx与“零值”比较的if语句if(x<=0.000001&&x>=-0.000001)float型变量和“零值”比较的方法: constfloatEP

1、用预处理指令交换两个参数的值

#define SWAP(a,b) { int c=a;a=b;b=c}

2、写出floatx与“零值”比较的if语句

if(x<=0.000001 && x>=-0.000001)

float型变量和“零值”比较的方法:
 
const float EPSINON = 0.000001;
 
if ((x >= - EPSINON) && (x <=EPSINON))
 
浮点型变量并不精确,其中EPSINON是允许的误差(即精度),所以不可将float变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。如果写成if (x == 0.0),则是错误的。
 EPSILON指的是浮点数可表示的最小值
因为1.0在计算机中可能存为0.999999或1.00001等,很难恰好是1.0

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

为了更好的发现因为疏忽将if(x==0)错写成if(x=0)导致的错误,因为将常量写在前,当你少写一个=时,if(0=x)程序就会报错,从而提醒你,而写成if(x=0)程序并不会报错而是当成赋值语句。

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

设地址0x8000 存放的整形变量为a,清除bit1,则就是置bit1为0,则需要让 a &= 111 1111 1111 1101,而1111 1111 1111 1101 可通过(0x01<<1)再取反得到。
因此:a &=~(0x01<<1) 

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

mkdir myfolder

chmod 644 myfolder

6、在32位机器上如下变量类型所占的内存分别是多少
short        2
char*        4
long long        8
double        8

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

从map文件我们可以了解到:

  • 程序各区段的寻址是否正确
  • 程序各区段的size,即目前存储器的使用量
  • 程序中各个symbol的地址
  • 各个symbol在存储器中的顺序关系(这在调试时很有用)
  • 各个程序文件的存储用量

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

波特率115200代表1秒可以传送115200 bits的数据。业内常用的格式是8位数据,无校验位,1位停止位。加上一个必须的1 bit的起始位,一字节的串口数据一共是10位。

115200 bit/10=11520 Byte

所以115200波特率一秒可以传11520字节(Byte),即11.52KB/s

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

11 11 11

10、如下代码会有什么问题? 为什么?

由于使用#if eData1 ... #endif  以至于函数void doSomething() 未定义。

11、列举出10个C语言标准库函数

<math.h> :  int abs(int x); //求整数x绝对值

                   float pow(float x, float y);//计算x的y次幂

                   float log(float x) ;//计算x的自然对数

                  float sqrt(float x) ;//计算x的平方根

<stdio.h>: 

 int printf(char *format...) 产生格式化输出的函数 

int getchar(void) 从键盘上读取一个键,并返回该键的键值

 int putchar(char c) 在屏幕上显示字符c

int scanf(char *format[,argument,...]) 执行格式化输入

int puts(char *string) 送一字符串到流中

<stdlib.h>:

void exit(int retval) 结束程序

int atoi(const char *s) 将字符串s转换为int类型

<string.h>

int strlen(char *s) 计算字符串s的长度

char *strlwr(char *s) 将字符串s转换为小写形式

char *strupr(char *s) 将字符串s转换为大写形式

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

芯片型号:STM32F407ZGT6

1.ST:芯片公司的简称;

2.M:芯片Cortex-M系列;

3.32:32为处理器;

4.F:通用性的产品;

5.407:芯片系列信号;

6.Z:芯片的管教数量(144pin)

7.G:内存ROM容量(1024K字节);

8.T:芯片形状;

STM32F40xZGT6芯片的内部资源: flash:1M字节; RAM:192K字节;(重点:记住程序申请的空前不要溢出) 定时器:14个; 看门狗(WDG):2个; RTC 24位的系统滴答定时器 模数转换器(ADC):24个 数模转换器(DAC):2个 IO口:114个,51单片机24个 SPI:3个; UART:6个 USB:2个 CAN:3个 SDIO:1个 带有以太网借口

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

答:采集信息不能上传到共享内存,或者web控制端下发的命令一直没有响应,节点没有执行对应动作

这个检测分为两部分,linux和单片机

1.linux主控层面

 用ipcs命令,检查IPC所有信息,

2.过编写测试程序,验证共享内存中的数据是否正确,

还有用测试程序往消息队列中发送数据。

相当于启动另一个匹配主控程序的进程,读取shm和msg的数据

15、已知有N个点,求由这N个点组成的多边形的外接矩形的四个顶点坐标。即完善如下函数。

  1. void GetCoordRect(stCoord* arrCoord,int32_t nCount,stCoord_t* arrRect)
  2. {
  3. int32_t XMax,XMin,YMax,YMin;
  4. XMax = arrCord[0].nX;
  5. XMin = arrCord[0].nX;
  6. YMax = arrCord[0].nY;
  7. YMin = arrCord[0].nY;
  8. for(int i=0;i<nCount;i++)
  9. {
  10. if(arrCord[i].x > XMax)
  11. {
  12. XMax = arrCord[i].nX;
  13. }
  14. if(arrCord[i].x < XMin)
  15. {
  16. XMin = arrCord[i].nX;
  17. }
  18. }
  19. for(int i=0;i<nCount;i++)
  20. {
  21. if(arrCord[i].nY > YMax)
  22. {
  23. YMax = arrCord[i].nY;
  24. }
  25. if(arrCord[i].nY < YMin)
  26. {
  27. YMin = arrCord[i].nY;
  28. }
  29. }
  30. printf("外接矩形的坐标是:(%d,%d) (%d,%d)\n",XMin,YMin,XMax,YMin);
  31. printf("外接矩形的坐标是:(%d,%d) (%d,%d)\n",XMin,YMax,XMax,YMax);
  32. }

文章知识点与官方知识档案匹配,可进一步学习相关知识
算法技能树首页概览48445 人正在系统学习中