number headings: auto, first-level 2, max 6, 1.1
2 通用嵌入式基础
2.2 单片机基础
2.2.3 讲一下BSS段
- BSS段指的是C语言程序内存布局中的数据段中的未初始化数据段。
- 这段由系统进行分配并清零,因此每个程序开始时BSS段中的数据都是0。
- 而数据段主要存放全局变量和静态变量,其中程序定义了初始值的变量会存放进已初始化的数据段,这部分数据被编译在可执行文件中,并在加载时由系统拷贝。而未定义初始值的变量会存放到BSS段,由于BSS段初始数据为0,因此未设置初值的全局变量和静态变量的值均为0。
2.2.4 在没有连接调试器的情况下,单片机发生死机,如何进行异常分析
- 通常单片机死机时只有两种情况:进入硬件异常,或程序进入错误的循环。此时只需要加入硬件看门狗就可以将"单片机进入错误的循环"的情况转化为"硬件异常"情况。然后在所有的异常处理函数中加入栈回溯和寄存器信息保存输出功能即可得到单片机死机时的异常信息。
- 使用调试器,在调试时注意选择不重启单片机。
2.4 常用软件层技术
2.4.1 通用软件层技术
2.4.1.1 如果考虑让你实现一个上位机,你将如何考虑通信协议
通信协议的设计应当以实际需求为准,从硬件协议到软件协议的顺序进行设计。
首先是需求层面:
- 确定数据传输的数据量要求。
- 数据传输对数据完整性的要求:
- 例如实时音视频流传输,对实时性要求很高,但是对少量数据差错不敏感。
- 而在处理OTA升级等需求时,对完整性要求极高,因此其需要额外增加CRC校验等功能。
- 下位机的使用场景:
- 工业自动化场景中通常使用Modbus进行设计
- 汽车领域通常使用CAN等协议完成
- 物联网通常使用TCP、UDP、MQTT、BLE等进行传输
- 安全性需求:
- 对于网络传输或需要做硬件层面加密的需要加入加密算法
然后需要考虑硬件协议,这一点主要从开发资源、硬件限制等层面进行考虑:
- 在传输数据量要求不大,且可以进行有线连接时,串口是最常用的硬件协议。
- 在传输数据量高,且可以进行有线连接时,可以考虑使用以太网或USB进行传输。
- 在硬件层面使用以太网、LTE、Wi-Fi等网络传输的设备,可以考虑使用TCP、UDP、MQTT等会话层、应用层协议。而在在数据包的编码上:
- 普通文本和少量二进制数据可以考虑使用Json协议
- 工业控制场景可以使用Modbus协议
- 高频大流量场景可以使用Protobuf等协议
- 如果使用串口,或使用SPI/I2C协议等的基础LoRa无线传输时,则通常需要考虑增加CRC校验功能。
3 基础操作系统类(RTOS、Linux)
3.1 综述类
3.1.1 FreeRTOS和Linux的区别与相同点
- 首先FreeRTOS和Linux都是常用的嵌入式操作系统。相比于裸机,他们所解决的问题集中于多任务处理、开发生态环境等问题上,例如如果需要网络开发,则通常需要LwIP配合多任务调度等,如果需要ROS环境开发则无法离开Linux的支持。并且通常在引入操作系统之后,就可以利用操作系统的一些内存管理或者任务管理等裸机无法实现或难以实现的特性。
- 而在区别点上,Linux和FreeRTOS主要在于任务需求或硬件资源上进行选择或区分:
- 通常来说,FreeRTOS只需要几KB到几十KB的运行内存或储存,但是Linux则需要至少若干兆字节的运储存才能很好的运行。此外,Linux通常需要内存管理器MMU的支持,不然难以解决内存碎片问题。
- 在操作系统的特性上,FreeRTOS可以严格地保证任务调度的实时性,但是Linux需要打上实时性内核补丁才能保证较低实时性的任务。
- 在操作系统特性上,Linux提供了更多的现代操作系统的特性,例如多用户管理、虚拟内存、网络协议栈、加载内核模块、GUI界面、Shell终端等。
3.1.4 嵌入式系统的实时性是什么,如何评估实时性
3.1.5 嵌入式系统中的信号量和消息队列是什么?有什么区别?
4 CPU架构相关
4.1 ARM
4.1.1 ARM架构编程时,函数传参数量最好小于几个?为什么?
- ARM架构在函数传参时,其参数传递主要有两种方式:寄存器传递和栈传递。其中:
- AArch32架构传参依靠
R0
~ R3
四个寄存器进行传递,超过四个的参数会使用栈传递。
- AArch64架构传参依靠
X0
~ X7
八个寄存器进行传递,超过八个的部分会使用栈传递。
- 上述特性与编译器几乎无关,是由ARM调用约定规定的。