1. **volatile是否可以修饰const**
- 可以,`volatile const`用于描述那些在程序运行过程中其值可能被外部因素(如硬件或并发线程)改变,但又不允许程序修改的变量。
2. **如何快速一行代码操作硬件寄存器**
- 使用位带操作或直接对寄存器地址进行读写,例如:`*(volatile uint32_t *)(0x40021000 + 0x04) |= (1 << 3);`
3. **如何最快比较两组寄存器里有多少位不同**
- 使用异或运算,然后计算结果中的1的个数,可以使用位计数指令如`popcnt`。
4. **如何降低功耗**
- 关闭未使用的外设,使用低功耗模式,优化代码减少处理器空闲等待。
5. **什么时候会用到do{}while(0)**
- 构造宏时确保代码块的正确性,防止意外的分号导致宏展开错误。
6. **GPIO有几种状态**
- 输入、输出、高阻态、上拉、下拉等。
7. **如何用软件处理硬件管脚抖动**
- 使用软件延时滤波或状态机检测稳定状态。
8. **如何高效处理中断**
- 设置中断优先级,避免中断嵌套,最小化中断服务例程的执行时间。
9. **delay和sleep的区别**
- `delay`通常阻塞当前执行流,`sleep`可能涉及系统调用,让出CPU。
10. **中断时可否睡眠**
- 不推荐,中断应尽快返回,不应做长时间操作。
11. **如何设计RAM和flash的验证工具**
- 使用CRC校验和、MD5哈希或其他完整性检查算法。
12. **如何合理高效静态分配内存**
- 根据最大需求预分配,使用内存池减少碎片。
13. **如何跟踪内存泄漏**
- 使用动态内存管理库提供的统计功能或专门的内存泄漏检测工具。
14. **如何实现一个ring buffer以及用途**
- 实现循环指针和头尾指针,用于缓冲区,用于数据流处理和通信。
15. **DMA和FIFO的区别**
- DMA用于数据传输,FIFO是一种存储结构,DMA可以利用FIFO作为缓冲。
16. **如何做到统一API对接不同外设驱动**
- 设计抽象层,提供通用接口。
17. **如何合理设计flash分区表**
- 考虑应用需求、更新策略、磨损均衡和冗余。
18. **正常非掉电重启是否要释放内存**
- 重启前释放资源有助于系统的稳定性和初始化。
19. **正常掉电关机流程是否要释放内存**
- 同上,但要考虑持久性数据的保存。
20. **非掉电异常如何处理**
- 异常处理程序捕获异常,记录错误,尝试恢复或重启。
21. **如何实现异常后的dump**
- 记录关键寄存器和内存状态,保存在非易失存储中。
22. **非正常掉电如何保护**
- 使用UPS或电池备份,存储关键数据到非易失存储。
23. **如何设计一个简单的profiling工具**
- 记录函数调用时间和次数,分析性能瓶颈。
24. **低功耗深睡眠如何唤醒后继续之前工作**
- 保存状态到非易失存储,唤醒后恢复状态。
25. **RTOS不能断点和打印的时候如何调试**
- 使用硬件调试器或日志记录和故障注入测试。
26. **什么是交叉编译**
- 在一个平台上生成另一个平台可执行代码的编译过程。
27. **如何保证makefile的增量编译**
- 使用依赖关系和文件时间戳。
28. **如何用一套代码支持不同硬件**
- 使用抽象层和条件编译。
29. **如何用一版软件支持不同硬件**
- 设计模块化架构,硬件无关接口。
30. **不同代码编译后的存放区域有何不同**
- 代码段、数据段、BSS段,根据类型和属性存放。
31. **release和debug编译的区别**
- Release优化代码,Debug包含调试信息和符号。
32. **ARM多核之间有多少通讯机制及优缺点**
- 共享内存、消息传递、中断,各有适用场景和效率差异。
33. **两个线程之间不同锁的区别是什么**
- 互斥锁、读写锁、自旋锁,适用于不同同步需求。
34. **如何理解收益边界**
- 性能提升与成本、复杂度之间的权衡点。
35. **介绍一下自己关于代码优化的经验**
- 分析热点,先考虑算法和数据结构,再进行微调。
36. **关于代码移植有什么经验分享**
- 尽早识别硬件特异性代码,使用标准库和接口,保持良好的编码规范。