嵌入式知识整理
1.const,static,volatile,inline,extern的含义
const:只读修饰,不允许被修改static:修饰局部变量时,有默认值为0,是一个值不变的变量,为其开辟内存,函数结束后不被释放,直到程序结束才释放
修饰全局变量时,允许本源文件内所有函数访问,不能被其他源文件访问,即一个本地的变量
static修饰的函数仅允许本文件内其他函数调用。
volatile:表示每次使用volatile修饰的变量时,不是从加载到程序的存储单元读取,而是从实际地址读取,不采取优化方式。
inline:表示inline修饰的函数在使用时是直接在调用函数内展开,而不是新建堆栈内存调用,减少了开销
2.linux下如何定位内存泄漏
内存泄漏的概念:当申请的内存空间没有被及时释放时,之后的程序都将无法使用该内存空间定位内存泄漏的方式:
a.ps和kill对程序占用的内存进行监测和释放
b.利用valgrind对程序进行调试
3.UART,IIC,SPI区别
UART:异步收发接口(全双工,异步,串行,速度最慢)三线(TX,RX,GND)IIC:双线串行总线(半双工,同步,串行,速度第二)双线(时钟线,数据线)
SPI:同步外设接口(全双工,同步,串行,速度最快)三线(数据输出,数据输入,时钟线)
4.给指定地址赋值
int *p=(int *)0xff11f1;*p=250;
5.iso七层模型有哪些,tcp/udp属于哪一层?
应用层,会话层,表示层,网络层,传输层,数据链路层,物理层tcp/udp属于传输层
优缺点 优点 缺点
TCP: 面向连接,传输稳定 连接的延时问题导致安全性不高
数据不容易丢失 连接耗时多
UDP: 无需连接,直接发送 UDP容易丢包,乱序
安全性高
6.linux下同步模式和异步模式
同步模式:由处理消息者等待消息是否被触发异步模式:由触发机制来通知消息处理者
7.C++实现多态的方式有哪些?
首先理解多态的概念:“一个接口,多种方法”,程序运行时才决定调用的函数分为编译时多态(静态多态):重载、泛型编程(不需要考虑数据类型的标准模板库)
运行时多态(动态多态):虚函数
实现多态的方式:
a.重载:不论是否有虚函数,在作用域相同、函数名同名的情况下,参数(个数、类型、数目)不同即为重载
b.覆盖:在不同作用域下,同名同参数的不同函数构成覆盖
c.隐藏:在不同作用域下,同名不同参数的,基类有无虚函数都是隐藏,同名相同参数的,基类无虚函数为隐藏。
8.计算结构体大小的规则
以占内存最大成员变量为宽度,其余的变量所占大小要能被最大的成员变量整除最后加和大小要是最大成员变量的宽度倍数
9.由两种遍历二叉树的方式推出二叉树
规则,按照遍历方式的规则将二叉树逐步分解10.堆和栈的区别、联系
在操作系统中:堆(heap):由使用者申请,可申请的大小由操作系统的虚拟内存决定,申请效率慢
栈(stack):由系统直接分配,有系统栈空间限制,申请效率快
静态存储区域:在程序编译的时候分配,程序运行过程中一直存在,用于存放静态数据,全局数据和常量。
在数据结构中:
堆栈即指代栈这种先入后出的数据结构,由push、pop操作来操控
与堆栈相对的数据结构常指队列,队列内按照先入先出的规则(应用于二叉树层次遍历)
11.如何利用c语言直接跳转到指定的地址
首先理解一个类似于int *的数据类型 void (*)(void), 前者是指向整型数据类型的指针,后者是指向函数的指针(无参数无返回值)(void (*)(void))0x10000000相当于把0x10000000强制转化为了函数类型指针,则最后只需要((void (*)(void))0x1000000)()执行
12.数据库的四大特性
原子性:数据库操作事务要么全部成功要么全部失败回滚一致性:指的是数据库内事务从一个一致的形态到另一个一致的形态
隔离性:当多个用户访问数据库时,不能互相干扰,即多个并发事物之间需要隔离
持久性:一旦操作成功提交,对于数据库的改变是永久的,遇到故障也不会丢失操作。
13.单例模式的实现方式
单例模式概念:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例实现方式:
a.一般的单例模式:声明一个静态私有的类变量,实现一个静态方法去判断该变量是否为NULL,若不是则实例化它
b.在多线程的情况下,在静态的类方法加上synchronized修饰,实现线程同步(懒汉单例)
14.用户态和系统态的区别:
进程指向用户的代码时处于用户态(此时级别最低),当调用内核时处于内核态(此时权限最高)
15.申请大片内存的方式:
vmalloc、kmalloc、get_free_pages(直接申请页)
16.C++内强制转换:
static_cast:用于自然的低风险的转换,不能用于指针之类的转换reinterpret_cast:用于不同类型之间的指针或者引用的转换
const_cast:去掉const属性的转换
dynamic_cast:功能与reinterpret_cast类似,但是有转换后检查的功能(检查安全性)
17.do{}while(0)的作用:
a.用于封装宏(步骤)函数b.完成空宏的定义
18.Bootloader的作用:
引导操作系统启动、初始化硬件设备、建立内存空间映射表
19.条件编译语句的作用:
避免重复定义数据(造成重名、造成内存浪费、typedef多次定义)增强代码的可移植性,在跨平台编译过程中可以根据条件语句来执行
避免逻辑错误(死循环定义)
20.上拉、下拉、浮空、模拟:
上拉:IO内部上拉电阻输入下拉:IO内部下拉电阻输入
浮空:读取的IO不确定,等待key内容
模拟:应用ADC模拟输入