1:malloc和new区别
内存分配:malloc在堆上分配空间,需要手动计算大小;new可以在堆上分配,自动计算大小,并且new会调用构造函数,去初始化对象。
关键字:new是操作符,malloc是库函数
返回值:new返回对象类型的指针,分配失败会抛出异常;malloc返回void指针,分配失败返回null
扩充:new先去调用operator new,申请足够的内存,然后调用构造函数,初始化成员变量;delete释放内存,并调用析构函数。
operator new只分配内存,不调用构造函数;operator delete释放内存,不调用析构函数
placement new 在指定位置调用构造函数,不调用析构函数。
malloc还有relloc,calloc。
2:iic、spi、uart
1、iic:
通信模式:串行同步半双工,多主多从,短距离。总线空闲时高电平
速率:标准模式100kbit/s,快速模式可达400kbit/s,高速模式可达3.4Mbit/s。
线:SCL(时钟线)、SDA(数据线),采用TTL电平
为什么要接上拉电阻?
因为iic是开漏输出(od门由于内部结构,只能输出低电平),无法输出高电平。在漏极接上拉电阻才能实现”线与“功能(将他们输出端相接,外界上拉电阻。一个是低电平的时候,全是低电平;全是高电平的时候,输出高电平)
新的理解:如果不接,从设备在发送应答信号低电平的时候,如果主设备设计的不好,输出了高电平,两者就会导通,导致短路。
在iic内部,主设备和从设备都是od门,数据发送完之后,主设备就不驱动sda了,这时候sda的电平由外部设备决定,如果从设备也不驱动,这时候SDA的状态就称为“悬空”,状态不确定,如果接上拉电阻,就可以保证此时是高电平。当接了上拉电阻的时,如果从设备接收到信号,发送应答位,这时候驱动sda线,两者相当于接地,sda就从高电平变为低电平,主设备就知道从设备应答。
数据帧:
发送数据时,先发送一个起始信号(SDA拉低,产生下降沿),唤醒从设备
然后,发送的第一个字节中,前七位是从设备的地址,表示要和哪个从设备通信,被选中的从设备开始工作,其他从设备忽略之后的信号,最后一个bit是读写标志位,表示进行读操作或者写操作。然后发送一个应答位。如果主机收到应答位,就可以开始传输数据。
第二个字节中,会存储要读写的从机寄存器地址,表示要操作哪个寄存器。然后发送应答位
之后就可以传输数据了,发送完数据之后要发送一个应答位,如此循环,直到发送完数据。
数据发送完之后,发送停止信号,结束通信。
在SCL处于高电平时,SDA信号才有效。
2 、uart
通信模式:串行异步全双工
波特率:每秒钟传输的bit数
传输距离:
TTL电平:0.5m以内采用(短距离,因为一般是5v左右表示高电平,所以不适合长距离)
RS232:0.5m~15m(最大30m左右,有的也说50m,根据具体情况吧),3v-12v表示高电平1,速率一般为20kbps
RS485:速率可达10Mbps,标准情况最大距离1200m,最大也可达3km。
数据格式:最开始电平拉低,维持一段时间,表示起始位,要开始发送数据。然后发送一个字节数据,发送完之后发校验位,再发送停止位,停止位可以是1位或者1.5位等,要继续发送数据就循环这个过程。
发送的数据
起始位 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 校验位 | 停止位 |
内部实现:数据线发送到fifo队列里,发送的时候从队列取数据,通过移位寄存器发出去。接收数据时,数据放到fifo队列,再通过移位寄存器取数据。
如何知道有数据? : 可以通过轮询或者中断实现。
3:select,poll,epoll的区别
·接口上
select和poll提供一个接口
epoll提供两个接口,这两个接口实现它们一个接口的功能
·参数和返回值
select传入可读,可写,异常三个集合,返回后需要进行遍历取出就绪事件
poll只需传递一个集合,返回后需要进行遍历取出就绪事件
epoll只需通过epoll_ctl添加一次,epoll_wait取出就绪事件
·底层实现
select和poll通过轮询实现,select是数组,poll是链表
epoll通过回调机制实现,将就绪io从红黑树拷贝到就绪队列
·大小限制
select有最大数量限制
poll和epoll没有限制
·触发方式
select和poll水平触发
epoll边缘触发和水平触发
·效率
少量io,大量活跃。 select和poll效率较高
大量io,少量活跃。 epoll效率高
4:c++ 3大特性
·封装
通过限定符比如private,protected,来隐藏类内部的实现细节,只对外部提供接口
·继承
用public、private、protected来修饰
这些修饰符表示基类成员的最高权限
比如private继承,继承后基类最高权限就变成private,原本是private的还是private,子类还是不能对其进行访问
如果要访问private
class base
{
private:
a
}
class dev:public base
{
using b:c;可以通过这种方式进行访问
}
·多态