MS汇总

自我介绍

我叫XXX,毕业于19界XXX通信工程,在18年8月的时候去了XXXX,担任嵌入式开发工程师,

  • 主要的工作内容是:负责报站器一体机的维护和开发,公交路牌字库芯片开发

由于原公司搬家,从蓝都科创园搬到了余杭区的人和街道,交通不便
后面我就离职进了涂鸦科技有限公司,担任的是嵌入式开发工程师主要负责的内容是,

  • KA客户支持时间再3个月左右,目的是为了熟悉涂鸦业务,更好地了解客户需求,从而推进业务开发,期间主要是客户协助客户MCU方案落地主要芯片是STM32。开发客户支持demo 较为完整的demo包含具有ota,配网功能,获取天气,获取mac 地址、获取和相关其他dp点的一些功能的demo。涂鸦协议解析
  • 最近的项目是flash替换方案。组织其他部门开会同步会议。品质、供应链。
  • 是完整灯带的项目开发项目开发和网关灯移植。

面试岗位要求

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

项目一flash 大致介绍

flash 主要是nor flash 替换方案。
nandflash和nor flash 的主要去区别是芯片内执行(XIP ,eXecute In Place),这样应用程序可以直接在Flash闪存内运行
Nor flash的集成度低,成本高,但优势是支持XIP (execution in place)
Nand flash应为单位面积集成度高,成本低多用于数据存储
● NOR的读速度比NAND稍快一些。
● NAND的写入速度比NOR快很多。
● NAND的4ms擦除速度远比NOR的5ms快。
● 大多数写入操作需要先进行擦除操作。
● NAND的擦除单元更小,相应的擦除电路更少
NOR - FLASH 基本单位是 MOSFET(晶体场效应管)

在这里插入图片描述
讲讲基本组成单元
MOSFET 'mɔsfet 场效应管

  • Floating Gate :浮动的门
  • GATE :一般在gate 上去加载电压
  • p-well :基地
  • Drain:排水沟

读:读操作仅仅施加了电压,对于bit line上的读出电流需要sense amplifier转成对应的‘0’/‘1’;读取的速率基本取决于主控IC的频率
写 :由于施加在GATE上的强正电场,一些电子被“拉入”浮栅。 一旦进入,这些电子就不再有所需的能量来逃离浮栅的限制,这样 Flash Cell 就实现了编程。
擦:由于施加在GAET加一个负电压,使电子能够通过氧化物势垒“隧道。 通过这个过程,浮栅耗尽了电子,降低了它们的阈值电压。 如果观察单个细胞水平(通常在nA范围内),电流是微小的)。 由于电流很小,电场必须保持很长时间才能提取足够数量的电子,使擦除操作相对缓慢。一般行业对擦的数据是100W detasheet 一般标注是10W次
原因:
但是随着擦写次数的增多,浮动栅存储电子的能力就逐渐减弱,Erase margin(擦除比较电压) 和 Program margin写的区别会越来越小,当两者相交时,就会造成存储的数据错乱。

FLASH SPI 6线的方式如下:
Standard SPI:CLK / CS / DI / DO / WP / Hold --> DI DO都是单向的;
Dual SPI:CLK / CS / IO0 / IO1 / WP / Hold --> DI和DO是双向的;
Quad SPI:CLK / CS / IO0 / IO1 / IO2 / IO3 --> DI和DO是双向的,称作DI0 DI1,,同时WP和HOLD也变成输入输出管脚,称作DI2 、DI3;

结合上述运行方式的差异,所以得知同一个片上系统,运行速度:DOUT < DIO < QOUT < QIO

NOR - FLASH 关键寄存器
在这里插入图片描述

一般情况下SR寄存器有两个SR1 和 SR2, 他们指示着Flash能否被write、写保护的状态,4线状态,当前擦除/写入的状态等。

flash ID

碰到的技术难题

过擦 过擦的原因 在擦除完成后 一些芯片没有过擦修复,导致:由于施加在GAET加一个负电压,使电子能够通过氧化物势垒“隧道。读 给他加正电压 由于过擦远低于正常值 读出来的数据也会不正常、

还有使用python 库 Openpyxl matplotlib 呈现excel 折线图方式。

system tick 能够作为定时器 来使用

灯带项目详细介绍

功能::json,驱动、pwm、I2C、多线程,freetros、按键、红外、音乐、多场景
主控是BK7231t芯片 博通的一款芯片、
期间碰到了什么问题
当时出了什么问题 硬件有什么问题
灯带用什么协议 使用了什么功能

多任务 多线程 怎么进行同步 锁 死锁

freertos 线程是如何创建 任务是进行切换的 调度器是进行切换 栈如何划分的
最开始链表和链表项
在这里插入图片描述

然后 freertos 链表如何进行切换 调度器 优先级高的切换系统
xTaskCreate()看上去很像函数,但其实是一个宏,真正被调用的函数是xTaskGenericCreate()
关注点usStackDepth 和申请栈的大小 4 像16位的话就2
任务块
任务优先级32
有个变量用于检验堆栈是否溢出

新创建的任务加入就绪列表数组
表示从此以后MSP指针被FreeRTOS接管
从就绪列表数组中找出最高优先级列表
调度器是通过判断任务的优先级进行

死锁

致命的拥抱

任务A执行并成功获取互斥X。 2. 任务A由任务B预加密。 3. 任务B成功地使用互斥量Y,然后尝试也使用互斥量X-但是互斥量X是由任务A持有的,所以任务B不可用。 任务B选择进入阻塞状态等待互斥X被释放。 4. 任务A继续执行。 它试图使用互斥体Y-但是互斥体Y是由任务B持有的,所以任务A无法使用。 任务A选择进入阻塞状态等待互斥量Y被释放。253在此场景结束时,任务A等待任务B持有的互斥体,而任务B等待任务A持有的互斥体。 已发生死锁,因为两个任务都无法继续。 与优先级反转一样,避免死锁的最佳方法是在设计时考虑其潜力,并设计系统以确保死锁
队列

事件组

heap_2.c 会有碎片
heap_4.加了一个内存合并算法

SPI

SPI总线四种工作方式
SPI 模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置,时钟极性(CPOL)对传输协议没有重大的影响。

   时序详解:

CPOL:时钟极性选择,为0时SPI总线空闲为低电平,为1时SPI总线空闲为高电平

CPHA:时钟相位选择,为0时在SCK第一个跳变沿采样,为1时在SCK第二个跳变沿采样

工作方式1:

当CPHA=0、CPOL=0时SPI总线工作在方式1。MISO引脚上的数据在第一个SPSCK沿跳变之前已经上线了,而为了保证正确传输,MOSI引脚的MSB位必须与SPSCK的第一个边沿同步,在SPI传输过程中,首先将数据上线,然后在同步时钟信号的上升沿时,SPI的接收方捕捉位信号,在时钟信号的一个周期结束时(下降沿),下一位数据信号上线,再重复上述过程,直到一个字节的8位信号传输结束。

工作方式2:

当CPHA=0、CPOL=1时SPI总线工作在方式2。与前者唯一不同之处只是在同步时钟信号的下降沿时捕捉位信号,上升沿时下一位数据上线。

工作方式3:

当CPHA=1、CPOL=0时SPI总线工作在方式3。MISO引脚和MOSI引脚上的数据的MSB位必须与SPSCK的第一个边沿同步,在SPI传输过程中,在同步时钟信号周期开始时(上升沿)数据上线,然后在同步时钟信号的下降沿时,SPI的接收方捕捉位信号,在时钟信号的一个周期结束时(上升沿),下一位数据信号上线,再重复上述过程,直到一个字节的8位信号传输结束。

工作方式4:

当CPHA=1、CPOL=1时SPI总线工作在方式4。与前者唯一不同之处只是在同步时钟信号的上升沿时捕捉位信号,下降沿时下一位数据上线。
————————————————
版权声明:本文为CSDN博主「写代码的篮球球痴」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weiqifa0/article/details/82765892

I2C

两根线SDA(串行数据线)- SCL(串行时钟线)都是双向I/O线,开漏输出,上拉电阻接电源VCC,总线空闲时.两根线都是高电平
任何器件既可以作为主机也可以作为从机,但同一时刻只允许有一个主机。
三种类型信号, 它们分别是:开始信号、结束信号和应答信号。
主设备发送一段数据后,从设备需要回应一个ACK。
由IIC地址决定,8位地址,减去1位广播地址,是7位地址,2^7=128,但是地址0x00(广播地址)不用,那就是127个地址, 所以理论上可以挂127个从器件。
电阻计算:https://blog.csdn.net/sternlycore/article/details/85851669
SDA数据线上的每个字节必须是8位,每次传输的字节数量没有限制。每个字节后必须跟一个响应位(ACK)。
数据传输时:SCL在高电平时候,SDA要稳定。
ACK 应答是SDA为低电平,NACK 不应答SDA为是高电平。
一个7-bit的地址是从最高位(MSB) 开始发送的,这个地址后面会紧跟1-bit(R/W)的操作符,1表示读操作,0表示写操作。 接下来的一个bit是NACK/ACK,
————————————————
版权声明:本文为CSDN博主「墨客Y」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_38179373/article/details/108572715

(详解+代码)协议部分

IIC部分

void IIC_Init(void); //初始化 IIC 的 IO 口
void IIC_Start(void); //发送 IIC 开始信号
void IIC_Stop(void); //发送 IIC 停止信号
void IIC_Send_Byte(u8 txd); //IIC 发送一个字节
u8 IIC_Read_Byte(unsigned char ack);//IIC 读取一个字节
u8 IIC_Wait_Ack(void); //IIC 等待 ACK 信号
void IIC_Ack(void); //IIC 发送 ACK 信号
void IIC_NAck(void); //IIC 不发送 ACK 信号
void IIC_Write_One_Byte(u8 daddr,u8 addr,u8 data);
u8 IIC_Read_One_Byte(u8 daddr,u8 addr);

初始化 IIC 的 IO 口

默认SDA和SCL都是高电平

//初始化IIC
void IIC_Init(void)
{					     
 	RCC->APB2ENR|=1<<3;		//先使能外设IO PORTB时钟 							 
	GPIOB->CRL&=0X00FFFFFF;	//PB6/7 推挽输出
	GPIOB->CRL|=0X33000000;	   
	GPIOB->ODR|=3<<6;     	//PB6,7 输出高
}

IIC 开始信号

在这里插入图片描述

void IIC_Start(void)
{
	SDA_OUT();     //sda线输出
	IIC_SDA=1;	  	  
	IIC_SCL=1;
	delay_us(4);
 	IIC_SDA=0;//START:when CLK is high,DATA change form high to low 
	delay_us(4);
	IIC_SCL=0;//钳住I2C总线,准备发送或接收数据 
}	

图+代码说明:两根线都是高电平。SDA先拉低并且维持4us SCL也拉低4us并准备发送数据

两根线最后的状态:

  • SDA = 0 低电平。
  • SCL = 0 低电平。

IIC发送一个字节

在这里插入图片描述
//IIC发送一个字节
//返回从机有无应答

void IIC_Send_Byte(u8 txd)
{                        
    u8 t;   
	SDA_OUT(); 	    
    IIC_SCL=0;//拉低时钟开始数据传输
    for(t=0;t<8;t++)
    {              
        IIC_SDA=(txd&0x80)>>7;
        txd<<=1; 	  
		delay_us(2);   //对TEA5767这三个延时都是必须的
		IIC_SCL=1;
		delay_us(2); 
		IIC_SCL=0;	   
		delay_us(2);
    }	 
} 	

数据有效性:上述代码可以由下图来解释
在这里插入图片描述
注意:IC器件读取数据, SCL高电平,SDA必须要稳定。

两根线最后的状态:

  • SDA = 0 低电平。
  • SCL = 0 低电平。

IIC 读一个字节

//读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
u8 IIC_Read_Byte(unsigned char ack)
{
		unsigned char i,receive=0;
		SDA_IN();//SDA设置为输入
    for(i=0;i<8;i++ )
		{
        IIC_SCL=0; 
        delay_us(2);
				IIC_SCL=1;
        receive<<=1;
        if(READ_SDA)receive++;   
				delay_us(1); 
    }					 
    if (!ack)
        IIC_NAck();//发送nACK
    else
        IIC_Ack(); //发送ACK   
    return receive;
}

响应ACK和非响应NACK

在这里插入图片描述

在这里插入图片描述
可以从红色的竖线 进行理解。应答是低电平,不应答是高电平

//产生ACK应答
void IIC_Ack(void)
{
	IIC_SCL=0;
	SDA_OUT();
	IIC_SDA=0;
	delay_us(2);
	IIC_SCL=1;
	delay_us(2);
	IIC_SCL=0;
}
//不产生ACK应答		    
void IIC_NAck(void)
{
	IIC_SCL=0;
	SDA_OUT();
	IIC_SDA=1;
	delay_us(2);
	IIC_SCL=1;
	delay_us(2);
	IIC_SCL=0;
}		

两根线最后的状态:
应答ACK:

  • SDA = 0 低电平。
  • SCL = 0 低电平。
    不应答NACK:
  • SDA = 1 高电平。
  • SCL = 0 低电平。

IIC 停止信号

在这里插入图片描述

void IIC_Stop(void)
{
	SDA_OUT();//sda线输出
	IIC_SCL=0;
	IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
 	delay_us(4);
	IIC_SCL=1; 
	IIC_SDA=1;//发送I2C总线结束信号
	delay_us(4);							   	
}

很简单一句话来概括:停止信号是SCL 在高电平的时候 ,SDA拉高。
而开始信号是 SDA先拉低,SCL紧接拉低。

stm32 中断

在图 52.1.1 中,STM32F1 在复位后,先从 0X08000004 地址取出复位中断向量的地址,并
跳转到复位中断服务程序,如图标号①所示;在复位中断服务程序执行完之后,会跳转到我们
的 main 函数,如图标号②所示;而我们的 main 函数一般都是一个死循环,在 main 函数执行过
程中,如果收到中断请求(发生重中断),此时 STM32F1 强制将 PC 指针指回中断向量表处,
如图标号③所示;然后,根据中断源进入相应的中断服务程序,如图标号④所示;在执行完中
断服务程序以后,程序再次返回 main 函数执行,如图标号⑤所示。
在这里插入图片描述

---------网络 -----------

三次捂手 四次捂手

TCP/IP模型与OSI模型各层的对照关系。

在这里插入图片描述
TCP和 UDP 区别

在这里插入图片描述

可靠新

三次握手

CP是面向连接的,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。在TCP/IP协议中,TCP协议提供可靠的连接服务,连接是通过三次握手进行初始化的。三次握手的目的是同步连接双方的序列号和确认号并交换 TCP窗口大小信息。

在这里插入图片描述

四次挥手

第一次分手: 主机1(可以使客户端,也可以是服务器端),设置Sequence Number,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了;
第二次分手: 主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我“同意”你的关闭请求;

第三次分手: 主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入LAST_ACK状态;

第四次分手: 主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。

在这里插入图片描述

TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值