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个点组成的多边形的外接矩形的四个顶点坐标。即完善如下函数。
- void GetCoordRect(stCoord* arrCoord,int32_t nCount,stCoord_t* arrRect)
- {
- int32_t XMax,XMin,YMax,YMin;
-
- XMax = arrCord[0].nX;
- XMin = arrCord[0].nX;
- YMax = arrCord[0].nY;
- YMin = arrCord[0].nY;
-
- for(int i=0;i<nCount;i++)
- {
-
- if(arrCord[i].x > XMax)
- {
- XMax = arrCord[i].nX;
- }
- if(arrCord[i].x < XMin)
- {
- XMin = arrCord[i].nX;
- }
- }
-
- for(int i=0;i<nCount;i++)
- {
-
- if(arrCord[i].nY > YMax)
- {
- YMax = arrCord[i].nY;
- }
- if(arrCord[i].nY < YMin)
- {
- YMin = arrCord[i].nY;
- }
- }
-
- printf("外接矩形的坐标是:(%d,%d) (%d,%d)\n",XMin,YMin,XMax,YMin);
- printf("外接矩形的坐标是:(%d,%d) (%d,%d)\n",XMin,YMax,XMax,YMax);
-
-
-
- }