你好,我叫***,今~~ 年24岁毕业于黄河科技学院测控技术与仪器专业,我的工作经验是从去年的暑假开始,到今年7月份,主要做过的项目有阿里云远程室内环境检测及智能语音控制系统主要用于各个房间的信息采集和显示还有就是灯啊继电器的控制,智能手环主要是血压测量,心率,计步,还有温湿度的测量,以及蓝牙传输
我认为我已经具备了一定的经验积累和能力素养希望可以加入到具有创新和挑战的团队中,继续深扎业务,发挥自己的优势。
短期内做好自己的本职工作,适应公司节奏,打好基础,未来3到5年内我希望自己能在自己的专业领域内有所创新和突破。
有其他offer
我刚开始,看机会时间不长目前有一两个
嵌入式技术与应用主要研究嵌入式技术、嵌入式产品软件开发等方面基本知识和技能,进行嵌入式产品生产、管理、售后维护等。例如:高清电视(HDTV)、路由器、汽车电子等嵌入式技术应用开发
一个计算机系统有哪些单元模块组成
一台能够工作的 计算机 要有这样几个部份构成: CPU (进行运算、控制)、 RAM (数据存储)、 ROM (程序存储)、输入/输出设备(例如:串行口、并行输出口等)总线又分为数据总线、地址总线和控制总线3种。
MCU最小系统是什么
电源部分、晶振部分、复位部分
C代码中为什么分.C .H
这样做目的是为了实现软件的模块化
使软件结构清晰,而且也便于别人使用你写的程序
sizeof和strlen的区别
sizeof是一个操作符,而strlen是库函数。
sizeof的参数可以是数据的类型,也可以是变量,而strlen只能以结尾为’\0’的字符串作参数。
编译器在编译时就计算出了sizeof的结果,而strlen必须在运行时才能计算出来。
sizeof计算数据类型占内存的大小,strlen计算字符串实际长度。
结构体和联合体
各成员各自拥有自己的内存,各自使用互不干涉,同时存在的,遵循内存对齐原则。一个struct变量的总长度等于所有成员的长度之和。
联合体union
各成员共用一块内存空间,并且同时只有一个成员可以得到这块内存的使用权(对该内存的读写),各变量共用一个内存首地址。因而,联合体比结构体更节约内存。一个union变量的总长度至少能容纳最大的成员变量,而且要满足是所有成员变量类型大小的整数倍。不允许对联合体变量名U2直接赋值或其他操作。
static有什么用,用在局部变量里是干什么的,static会放在程序的哪个部分,为什么生命周期作用时间会变缓
1.static的作用 (1) 修饰局部变量时,只初始化一次,延长了局部变量生命周期,直到程序结束才释放。 (2)修饰全局变量,全局变量智能在本文件访问,不能在其他文件访问。静态存储区
一般函数里面的局部变量生命周期到什么时候为止
函数调用结束后
static 的最主要功能是隐藏,其次因为 static 变量存放在静态存储区,所以它具备持久性和默认值0。
Const关键词、
关键字const用来定义只读变量,被const定义的变量它的值是不允许改变的,即不允许给它重新赋值,即使是赋相同的值也不可以。 所以说它定义的是只读变量,这也就意味着必须在定义的时候就给它赋初值。
const表示(运行时)常量语义:被const修饰的对象在所在的作用域无法进行修改操作,编译器对于试图直接修改const对象的表达式会产生编译错误。 volatile表示“易变的”,即在运行期对象可能在当前程序上下文的控制流以外被修改(例如多线程中被其它线程修改;对象所在的存储器可能被多个硬件设备随机修改等情况):被volatile修饰的对象,编译器不会对这个对象的操作进行优化。
一级指针就是指指针,就是内存地址,二级指针就是指向指针的指针,就是地址的地址(这个可以指的是取得所谓的指向的该位置的内容)
数组指针与指针数组的区别
指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身的大小决定,每一个元素都是一个指针,在32 位系统下任何类型的指针永远是占4 个字节。它是“储存指针的数组”的简称。
数组指针:首先它是一个指针,它指向一个数组。在32 位系统下任何类型的指针永远是占4 个字节,至于它指向的数组占多少字节,不知道,具体要看数组大小。它是“指向数组的指针”的简称。
数组和链表有什么区别
数组是一组具有相同数据类型的变量的集合,这些变量称之为集合的元素
每个元素都有一个编号,称之为下标,可以通过下标来区别并访问数组元素,数组元素的个数叫做数据的长度
1.在内存中,数组是一块连续的区域
2.数组需要预留空间
在使用前需要提前申请所占内存的大小,这样不知道需要多大的空间,就预先申请可能会浪费内存空间,即数组空间利用率低
ps:数组的空间在编译阶段就需要进行确定,所以需要提前给出数组空间的大小(在运行阶段是不允许改变的)
3.在数组起始位置处,插入数据和删除数据效率低。
插入数据时,待插入位置的的元素和它后面的所有元素都需要向后搬移
删除数据时,待删除位置后面的所有元素都需要向前搬移
4.随机访问效率很高,时间复杂度可以达到O(1)
因为数组的内存是连续的,想要访问那个元素,直接从数组的首地址处向后偏移就可以访问到了
5.数组开辟的空间,在不够使用的时候需要扩容,扩容的话,就会涉及到需要把旧数组中的所有元素向新数组中搬移
6.数组的空间是从栈分配的
随机访问性强,查找速度快,时间复杂度为O(1)
1.头插和头删的效率低,时间复杂度为O(N)
2.空间利用率不高
3.内存空间要求高,必须有足够的连续的内存空间
4.数组空间的大小固定,不能动态拓展
链表
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的
链表的特性是在中间任意位置插入和删除元素都非常快,不需要移动其它元素
对于单向链表而言,链表中的每一个元素都要保存一个指向下一个元素的指针
对于双向链表而言,链表中的每个元素既要保存指向下一个元素的指针,又要保存指向上一个元素的指针
对于双向循环链表而言,链表中的最后一个元素保存一个指向第一个元素的指针
1.在内存中,元素的空间可以在任意地方,空间是分散的,不需要连续
2.链表中的元素都会两个属性,一个是元素的值,另一个是指针,此指针标记了下一个元素的地址
每一个数据都会保存下一个数据的内存的地址,通过此地址可以找到下一个数据
3.查找数据时效率低,时间复杂度为O(N)
因为链表的空间是分散的,所以不具有随机访问性,如要需要访问某个位置的数据,需要从第一个数据开始找起,依次往后遍历,直到找到待查询的位置,故可能在查找某个元素时,时间复杂度达到O(N)
4.空间不需要提前指定大小,是动态申请的,根据需求动态的申请和删除内存空间,扩展方便,故空间的利用率较高
5.任意位置插入元素和删除元素效率较高,时间复杂度为O(1)
6.链表的空间是从堆中分配的
1.任意位置插入元素和删除元素的速度快,时间复杂度为O(1)
2.内存利用率高,不会浪费内存
3.链表的空间大小不固定,可以动态拓展
随机访问效率低,时间复杂度为0(N)
对于想要快速访问数据,不经常有插入和删除元素的时候,选择数组
对于需要经常的插入和删除元素,而对访问元素时的效率没有很高要求的话,选择链表
指针 uint ulong他们在32位和64位系统中的数据长度是多少
GPIO(general purpose intput output)是通用输入输出端口的简称,可以通过软件来控制其输入和输出。51 单片机芯片的 GPIO 引脚与外部设备连接起来,从而实现与外部通讯、 控制以及数据采集的功能。过 GPIO 最简单的应用还属点亮 LED 灯了,只需通过软件控制 GPIO 输出高低电平即可。当然GPIO 还可以作为输入控制,比如在引脚上接入一个按键,通过电平的高低判断按键是否按下
看门狗
是一个定时器电路,一般有一个输入,叫喂狗,一个输出到MCU的RST端,MCU正常工作的时候,每隔一端时间输出一个信号到喂狗端,给WDT清零,如果超过规定的时间不喂狗,(一般在程序跑飞时),WDT 定时超过,就回给出一个复位信号到MCU,是MCU复位.防止MCU死机.看门狗的作用就是防止程序发生死循环,或者说程序跑飞。
*工作原理: *在系统运行以后也就启动了看门狗的计数器,看门狗就开始自动计数,如果到了一定的时间还不去清看门狗,那么看门狗计数器就会溢出从而引起看门狗中断,造成系统复位。所以在使用有看门狗的芯片时要注意清看门狗。
除了单片机有用过其他的带系统的平台,应用部分还是驱动部分
TCP/IP 套接字,服务端和客户端的流程是怎么样的,服务端调用那些函数,什么过程
TCP协议是在通信的两台设备之间建立连接通道,对传输的数据大小没有限制,但是因为建立了连接,相对可靠一些,但是速度会慢一些。TCP协议又称为三次握手–四次挥手协议,因为建立过程有三步(发送请求、获取 反馈、建立连接)。通常情况下,我们的蓝牙通信、打电话都是使用的 TCP 协议。
UDP协议需要将数据打包,因为包有大小,所以对数据大小是有限制的,UDP是不用建立连接的,但不保证待接收方一定会接收到消息,所以不可靠。但是,因为不用建立连接,因此速度要快一些。通常情况下,我们发送短信都是使用的 UDP 协议。
1 创建socket对象 2使用bind()绑定主机号host和端口号port 3使用listen()监听 4使用accept()被动连接
5 使用send()/rece() 发送/接收数据
客户端:调用connect
1创建socket对象 2使用connect连接到服务器端 3使用send()/recv() 发送/接收数据 4关闭socket对象
Makefile
1目标:依赖文件 2$^ 代表所有依赖文件3 @ 代表所有目标文件 4 @ 代表所有目标文件 4 @代表所有目标文件4< 代表第一个依赖文件 5% 代表通配符 6@指令:屏蔽指令 7定义变量(变量大写) 8变量名=值1 值2 … 9使用变量 $(变量名)
linux 配置文件修改后立即生效命令# source /etc/profile看版本号Cat /proc/version看系统环境变量env
重定向echo
一个进程可以只有一个线程,也就是主线程,一个进程可以有一个主线程和很多个子线程。
区别:一个程序至少有一个进程,而一个进程至少有一个线程。一个应用程序可以同时启动多个进程。例如对于IE浏览器,每打开一个IE浏览器,就启动了一个新的进程。而线程则是指进程中的一个执行流程,一个进程可以有多个线程,每个线程分别执行不同的任务,当进程内的多个线程同时运行时,这种运行方式就被成为并发运行。
另外,线程和进程还有一个非常重要的区别:每个进程在执行过程中都拥有独立的内存单元,而同一个进程中的多个线程则共享内存。
多进程多线程
在同一个时间里,同一个计算机系统中如果允许两个或两个以上的进程处于运行状态,这便是多进程,也称多任务。现代的操作系统几乎都是多任务操作系统,能够同时管理多个进程的运行。
多线程是一种执行模型,它允许多个线程存在于进程的上下文中,以便它们独立执行但共享其进程资源。
进程是死的,只是一些资源的集合,真正的程序执行都是线程来完成的,程序启动的时候操作系统就帮你创建了一个主线程。每个线程有自己的堆栈。
进程和线程在多核cpu,多cpu中的运行关系
操作系统会拆分CPU为一段段时间的运行片,轮流分配给不同的程序。对于多cpu,多个进程可以并行在多个cpu中计算,当然也会存在进程切换;对于单cpu,多个进程在这个单cpu中是并发运行,根据时间片读取上下文+执行程序+保存上下文。同一个进程同一时间段只能在一个cpu中运行,如果进程数小于cpu数,那么未使用的cpu将会空闲。
多线程的概念主要有两种:一种是用户态多线程;一种是内核态多线程,对于内核态多线程(java1.2之后用内核级线程),在操作系统内核的支持下可以在多核下并行运行;
对于多核cpu,进程中的多线程并行执行。对于单核cpu,多线程在单cpu中并发执行,根据时间片切换线程。同一个线程同一时间段只能在一个cpu内核中运行,如果线程数小于cpu内核数,那么将有多余的内核空闲。
大小端和转字节序
大端模式是指高字节数据存放在低地址处,低字节数据放在高地址处。
小端模式是指低字节数据存放在低地址处,高字节数据放在高地址处。
硬件
AD软件 原理图到PCB的流程
导入机构图 → 设置边框 → 设置层叠 → 设置约束规则 → 布局 → 打孔走线 → 覆铜 → 加光学定位点 → 防焊开窗 → 放丝印 → 导文件 PCB绘制时布局和走线还有很多细节和要求需要根据具体的情况来看
给你一个不知道有没有问题的开发板首先你会怎么做,步骤是什么
先上电 看看芯片有没有问题。 直接上手摸一下烫不烫 没问题的话就检查其他部分电路是不是正常。 供电没问题的话就点个灯。
智能手环stm32f411ceuxflash是512KB RAM是128KB最高主频168MHz 因为系统初始化SystemInit函数里初始化APB1总线时钟为4分频即42M,APB2总线时钟为2分频即84M 智能家居STM32F103RCT6flash是256KB RAM是48KB最高主频72MHz 72M- 系统时钟 = SYCCLK = AHB1 = 168MHz
-APB2 = 72MHz
-APB1 = 36MHz
在项目里承担什么角色 嵌入式软件工程师 小组里的项目岗位的分配 项目组长负责干嘛
OLED 模块买的那家公司的 全视科技公司
用哪个口操作的(怎么操作OLED模块的)操作的总线用的哪个
OLED OLED_D/C PA 15 OLED_CS PB7 OLED_RES PB13 通用功能 OLED_SCL PB3 OLED_SI PB5 复用功能 用SPI1总线操作
MPU6050是干什么的 后期的算法 从哪个平台上移植的官方的还是第三方厂家
手环的界面有多少页
蓝牙用的是模组还是芯片 怎把单片机的数据通过蓝牙发送出去的
因为SPI是全双工,IIC的不是。 SPI没有定义速度限制,一般的实现通常能达到甚至超过10 Mbps。 IIC 最高的速度也就快速+模式(1 Mbps)和高速模式(3.4 Mbps),后面的模式还需要额外的I/O缓冲区,还并不是总是容易实现的。
IIC的两根线都有什么作用 假设挂了3个IIC的片子,他们是怎么进行主网通信的
IIC串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。 所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上,一般SDA、SCL都会接上拉电阻实现电平的转换以及提高驱动能力。
方法一:(内置了两种地址的模块)
对于内置了两种地址的模块,可以通过对某个引脚置高或置低来选择其中一个地址,现假设置高为A,置低为B。
假设你有三个模块要同时通信,首先将模块1置高,模块2、模块3的地址选择口置低,这样仅有模块1在地址A,然后对地址A进行通信即可防止其他模块干扰。接下来将模块1置低,模块2置高,即可对模块2通信。循环下去即可实现同时对三个模块通信。
方法二:(具有使能端的模块)
若你手中的模块某个引脚必须拉低或拉高才能正常使用,那么仿照方法一,对其中一个使能,其他均处于非使能状态,如此便可以仅对其中一个模块通信咯。
100kb/s、300kb/s、3.4Mkb/s由IIC地址决定,8位地址,减去1位广播地址,是7位地址,2^7=128,但是地址0x00不用,那就是127个地址, 所以理论上可以挂127个从器件。IIC协议没有规定总线上device最大数目,但是规定了总线电容不能超过400pF。管脚都是有输入电容的,PCB上也会有寄生电容,所以会有一个限制。实际设计中经验值大概是不超过8个器件。
uart、IIC、SPI都是一种具有协议特征的收发器、接口、总线,它规定数据按照什么的时序传输,rs232,、rs485是传输时候的电平标准,规定了按照上述协议传输的高电平与低电平的电压都应该是多少;uart还是一种硬件,是个收发器,发送和接收,是个设备,是完成特定功能的硬件,它本身并不是协议,它本身是硬件设备,但它具有协议特征,意思是运用uart收发器进行数据的收发必须按照uart协议的时序进行收发,比如可以在uart的发送端(TXD)发送信号然后通过电平转换芯片转换为RS232/R485逻辑电平在发送线上传输,再通过电平转换芯片让接收端按照时序接收。
RS232与RS485一般都默认跑的UART协议。以UART协议(时序)通过UART收发器的收发端(硬件设备)使用RS232/RS485电平标准进行数据得传输
简单介绍一下你对Lora模块的理解 有啥特点
lora模块是LPWAN通信技术中的一种,一种基于扩频技术的超远距离无线传输方案。目前全球免费频段有,433、868、915MHz等。lora通信技术最大特点,灵敏度高、传输距离远、工作功耗低、组网节点多等特点。主要应用于物联网行业,如无线抄表(电表/水表)、工业自动控制、环境监测、环保监测等。
首先是传输距离,和平常普通的模块一样,采用lora扩频技术,3~8km的传输距离,但是传输方式上却有独特的特点,该模块可选用3种通信模式,分为低功耗优先模式、均衡模式、距离优先模式,也就是说需要低功耗的,传输距离不远的可以采用第一种,那样功耗会很低。其他的模式也是同一个道理。详细可参见下图;-‘
然后是该lora模块的一个网关特点,该lora模块可以GPRS、3G、4G网络,NB-IOT(物联网专网),进行组网,可能有人会问,为啥不直接用gprs或者4G传输数据呢?因为不是所有地方都有信号,而且信号也很好,所以该功能主要针对,无信号或信号不好,然而数据需要传公网上服务器的,比如一些油井,偏远山区,加油站等。可以使用这种特有的lora网关进行数据传输。
并且无需用户建立数据中心,不用关心协议,即可实现设备到设备(不同种类设备也可通信),设备要平台之间的数据通信。
BH1750是干啥用的BH1750FVI是一款数字型光强度传感器集成芯片
ESP8266是一款超低功耗的UART-WiFi 透传模块,专为移动设备和物联网应用设计,可将用户的物理设备连接到Wi-Fi 无线网络上,进行互联网或局域网通信,实现联网功能
简单介绍一下Free RTOS是怎么理解的 任务是怎么调度的 怎么切换的
一个轻量级的操作系统,功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能等,可基本满足较小系统的需要。通信方式有:消息队列、信号量、互斥锁(互斥信号量)、事件标志组以及任务通知等。
任务切换具体过程
抢占式调度
每个任务都有不同的优先级,任务会一直运行直到被高优先级任务抢占或者遇到阻塞式的 API 函数,比如 vTaskDelay。
时间片调度
每个任务都有相同的优先级,任务会运行固定的时间片个数或者遇到阻塞式的 API 函数,比如vTaskDelay,才会执行同优先级任务之间的任务切换。
如果用户在 FreeRTOS 的配置文件 FreeRTOSConfig.h 中禁止使用时间片调度, 那么每个任务必须配置不同的优先级。当 FreeRTOS 多任务启动执行后,基本会按照如下的方式去执行:
假设现在有两个任务task1,task2
✔ 首先执行的最高优先级的任务 Task1, Task1 会一直运行直到遇到 系统阻塞式的 API 函数,比如延迟,事件标志等待,信号量等待, Task1 任务会被挂起,也就是释放 CPU 的执行权,让低优先级的任务得到执行。
✔ FreeRTOS 操作系统继续执行任务就绪列表中下一个最高优先级的任务 Task2,Task2 执行过程中有两种情况:
Task1由于 延迟时间到, 接收到信号量消息 等方面的原因, 使得 Task1从挂起状态恢复到就绪态,在抢占式调度器的作用下,Task2 的执行会被 Task1 抢占。
Task2 会一直运行直到遇到系统阻塞式的 API 函数,比如延迟,事件标志等待,信号量等待, Task2任务会被挂起,继而执行就绪列表中下一个最高优先级的任务。
✔ 如果用户创建了多个任务并且采用抢占式调度器的话,基本都是按照上面两条来执行。 根据抢占式调度器,当前的任务要么被高优先级任务抢占,要么通过调用阻塞式 API 来释放 CPU 使用权让低优先级任务执行,没有用户任务执行时就执行空闲任务。
简单介绍一下MQTT 有什么特点 项目中是怎么用的
是一种基于发布/订阅(publish/subscribe)模式的轻量级协议,该协议构建于TCP/IP协议之上,MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。
MQTT协议 :固定报头,剩余长度,报文标识符,有效载荷