【02】卧安科技——卧安科技 嵌入式软件工程师-校招笔试 ,题目记录及解析
卧安科技 嵌入式软件工程师-校招题
文章目录
- 1.使用static修饰函数体中的变量,函数调用多次也只能是分配一次内存空间。()
- 2.在一个源文件内,static修饰的全局变量或者函数,只能本地调用而不能被其他源文件调用。()
- 3.内存分配中,通过malloc()从栈区申请一段空间,然后可以在不需要时通过free()释放空间。()
- 4.在int *const a;中,表示 **指针指向** 是不可修改的;在const int *a;中,表示 **内容值** ―是不可修改的。
- 5.在程序中,数字10使用十进制表示为 **2** ,使用八进制表示为 **02** ,使用十六进制表示为 **0x02** ; 数字-5的二进制表示为 **11111011** 。
- 6.理想情况下,允许输入电压范围最高为3.6V的12位ADC直接接到采集点,采集到的AD值为1024,如何计算采集点的电压值
- 7.假定通过UART发送10KB数据,波特率为115200bps,数据位为8bit,无校验位,停止位为1bit,无流控,理想情况下发送时间为
- 8.I2C通过SCL线 **高电平期间** , SDA线 **下降沿** 表示起始信号;通过SCL线 **高电平期间** , SDA线 **上升沿** 表示停止信号;在传输数据时,SDA线上的电平变化发生在SCL线为 **低** 电平时。
- 9.对于32位单片机,小端模式下,如下代码,
- 10.对于32位单片机,有如下代码,
- 11.有定义unsigned int a = 5,*b,*c[5];则以下操作有问题的是?
- 12.写一个一般情况下使用的宏MAX,输入两个参数,返回较大的一个。
- 13.写一行表达式,将变量unsigned short a的第3位置位。
- 14.写一行表达式,将变量unsigned short a的第6位清零。
- 15.写一行表达式,将变量unsigned short a除以16并赋值给自身。
- 16.写一行表达式,将变量unsigned char a的低4位和变量unsigned char b的低位,赋值给unsigned char c的高4位和低4位。
- 17.写一段代码,定义256Bytes的数组缓冲区aBuffer,取出从Flash地址0x80000开始的256Bytes 数据存到aBuffer中。
- 18.写一个函数sum(),使用递归的方法,输入一个正整数N(N<2^16),输出从1到该整数的所有整数之和。
- 19.写一个函数count(),输入一个正整数N(N<2432),输出该整数的二进制表示里被置为1的位的个数。
- 20.数组和单链表在存储位置和大小上有什么区别?
- 21.列举两个建议使用volatile的情况。
- 22.列举一些降低功耗的方法?
- 23.列举你使用过的较为熟悉单片机型号。
卧安科技 嵌入式软件工程师-校招题
1.使用static修饰函数体中的变量,函数调用多次也只能是分配一次内存空间。()
对
2.在一个源文件内,static修饰的全局变量或者函数,只能本地调用而不能被其他源文件调用。()
错
static修饰的函数是可以被其他文件使用的
static修饰的函数不能被其他文件直接使用,这是和普通函数的区别,但是可以用过其他方式调用:
1.在文件中定义一个对外提供的函数,该函数在内部调用static修饰的函数,这就实现了间接调用static修饰的函数。
2.将static修饰的函数的函数指针传递出去,其他文件可以通过函数指针进行调用。
实例代码:
#include <stdio.h>
static int fun(void)
{printf("fun test\n");return 1;
}int fun1(void)
{fun();return 1;
}int fun2(void **result)
{*result = (void *)fun;return 1;
}/*外部通过fun2调用的举例*/int(*p)(void);p = NULL;fun2((void **)&p);p();
3.内存分配中,通过malloc()从栈区申请一段空间,然后可以在不需要时通过free()释放空间。()
对
4.在int *const a;中,表示 指针指向 是不可修改的;在const int *a;中,表示 内容值 ―是不可修改的。
5.在程序中,数字10使用十进制表示为 2 ,使用八进制表示为 02 ,使用十六进制表示为 0x02 ; 数字-5的二进制表示为 11111011 。
负数的十进制变二进制:原码--反码--加一(补码);二进制变十进制:减一--反码--原码。
5的原码:00000101 反码:11111010 补码(反码+1):11111011
6.理想情况下,允许输入电压范围最高为3.6V的12位ADC直接接到采集点,采集到的AD值为1024,如何计算采集点的电压值
Vin = 3.6*1024/(2^12) = 0.9 V。
7.假定通过UART发送10KB数据,波特率为115200bps,数据位为8bit,无校验位,停止位为1bit,无流控,理想情况下发送时间为
t = 10*1024/(115200/10) = 0.8889 s。
8.I2C通过SCL线 高电平期间 , SDA线 下降沿 表示起始信号;通过SCL线 高电平期间 , SDA线 上升沿 表示停止信号;在传输数据时,SDA线上的电平变化发生在SCL线为 低 电平时。
9.对于32位单片机,小端模式下,如下代码,
union
{
Struct
{
uint8_t : 3;
uint8_t bs3Val: 3;
uint8_t bs5Val : 5;
}tBitset;
uint8_t ucVal;
}unTest,*p;
unTest.ucVal = 0;
unTest.tBitset.bs3Val = 3;
p = &unTest;
unTest.ucVal的值为(十六进制) 0x00 , sizeof(unTest)的值为 12 , sizeof§的值为 4 。
10.对于32位单片机,有如下代码,
unsigned char *p1;
unsigned int *p2;
p1=(unsigned char *)0x801000;
p2=(unsigned int *)0x810000;
p1 +5指向的地址为 0x801005 ; p2+5指向的地址为 0x810014 。
11.有定义unsigned int a = 5,*b,*c[5];则以下操作有问题的是?
D
b = &a
*b = a
c[4]=b
a =**c
提交后答案是b,感觉有些问题;;;编译器验证D的运行出错;
12.写一个一般情况下使用的宏MAX,输入两个参数,返回较大的一个。
#define MAX(a,b) ((a > b) ? a : b)
13.写一行表达式,将变量unsigned short a的第3位置位。
a = a | 00000100;
14.写一行表达式,将变量unsigned short a的第6位清零。
a = a & 11011111;
15.写一行表达式,将变量unsigned short a除以16并赋值给自身。
a /= 16;
16.写一行表达式,将变量unsigned char a的低4位和变量unsigned char b的低位,赋值给unsigned char c的高4位和低4位。
c = (a & 00001111) << 4 | (b & 00001111);
17.写一段代码,定义256Bytes的数组缓冲区aBuffer,取出从Flash地址0x80000开始的256Bytes 数据存到aBuffer中。
#include<stdio.h>
#define BufferSize 256
#define uchar unsigned char
uchar aBuffer[BufferSize];
uchar *p = 0x80000;
uchar i =0;
while(BufferSize--){
aBuffer[i++] = *p++;
}
18.写一个函数sum(),使用递归的方法,输入一个正整数N(N<2^16),输出从1到该整数的所有整数之和。
int sum(int N){
if(N == 1)return N;
return sum(N-1) + N;
}
19.写一个函数count(),输入一个正整数N(N<2432),输出该整数的二进制表示里被置为1的位的个数。
int count(N){
int countt = 0;
while(N){N = N & (N - 1);countt++;
}
return countt;
}
20.数组和单链表在存储位置和大小上有什么区别?
(1)位置区别:
数组是顺序存储,存储在连续空间上,逻辑上相邻的两个数物理位置上也相邻;而单链表是链式存储,不要求连续存储空间,逻辑上相邻的两个数不要物理上求相邻,可以是零散的内存空间。
(2)大小区别:
数组定义时空间大小就确定了,不能再增大或减小,一旦超出数组最大容量只能重新定义一个更大的数组;而链表存储空间大小是动态的,可随时追加或减小,空间大小随着元素的多少而变化。
21.列举两个建议使用volatile的情况。
(1)中断
中断程序中若修改其他程序使用的变量,应该使用volatile,例如,b=a;c=a;这时在b和c之间发生了中断,中断中刚好修改了a的值,那么c的赋值就会改变,所以要用volatile。
(2)多线程
在多线程多任务情况下,访问一个共享变量,应使用volatile。例如,线程1在cpu1中执行变量a,同时线程2又在cpu2中执行a,那么当线程1再次执行a时,a的值可能已经被修改了,需要从内存中重新读取a。所以,应使用volatile。
(3)硬件寄存器
硬件寄存器的值可能会随着硬件工作状态的变化而变化,应加volatile。例如,在AD转换中,电压值可能实时变化的,所以每次都需要重新读取。
22.列举一些降低功耗的方法?
程序上:
- (1)动态调整处理器的工作频率和电压。例如,播放音乐时,较低的时钟频率,仍然可以保证播放的高质量,当时钟频率降低时,可以同时降低处理器的工作电压,可以降低功耗;
- (2)初始化处理:在初始化的时候将一些外围模块,设置到功耗最低模式。
- (3)待机时休眠时,关闭掉不要的外设功能。
硬件上:
- (1)采用低功耗的微处理器;
- (2)选用低功耗的外围器件;
- (3)分区分时供电系统。
23.列举你使用过的较为熟悉单片机型号。
STC89C52;
STC15F2K60S2;
STM32f4ZGT6