当前位置: 首页 > news >正文

【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
http://www.dtcms.com/a/325926.html

相关文章:

  • Vue3 学习教程,从入门到精通,Vue 3 选项式 API 语法知识点与案例详解(33)
  • 爬虫与数据分析相结合案例总结
  • 远程服务器下载百度云里文件
  • golang包管理工具中 GOPATH 与 Go Modules 的区别总结
  • JSON Schema
  • LabVIEW模糊逻辑控制车辆停靠
  • 在docker上部署fastapi的相关操作
  • day072-代码检查工具-Sonar与maven私服-Nexus
  • 深度学习-卷积神经网络-VGG
  • Maven 报错:Blocked mirror for repositories【完美解决】
  • 文旅元宇宙:科技重塑数字消费新文明
  • Azimutt:一款免费开源的多功能数据库工具
  • USB 设备百科
  • 解决:Error updating changes: detected dubious ownership in repository at
  • 爬虫和数据分析相结合的案例
  • Nami Cloud 提供高性能云服务,加速 Walrus 的应用普及
  • K8s集群+Rancher Server:部署DolphinScheduler 3.2.2集群
  • etf期权剩余0天还能交易吗?
  • Facebook广告投放进阶:ABO精测与CBO放量的协同增长策略
  • Android13 Framework隐藏某些App
  • 【深度学习基础】贝叶斯理论
  • Next.js API 路由:构建后端端点
  • 数据结构3线性表——单链表(C)
  • Flutter - 应用启动/路由管理
  • 13、Docker Compose 安装 Redis 哨兵集群(一主两从)
  • 容器技术之docker
  • Excel 连接阿里云 RDS MySQL
  • AAAI-2025 | 北理工具身导航新范式!FloNa:基于平面图引导的具身视觉导航
  • Dashboard.vue 组件分析
  • CLIP在文生图模型中的应用