1.硬件 / 软件深度融合

嵌入式系统的核心特点之一是软硬件的紧密结合。嵌入式程序员不仅需要编写软件代码,还必须深入理解硬件的工作原理,确保软件能够与硬件协同工作。
2.内存/CPU资源受限

嵌入式系统通常运行在资源受限的环境中,如微小的内存空间、有限的处理器能力和严格的功耗要求。嵌入式程序员需要在这些限制条件下进行高效的代码编写和资源管理。以智能手表为例,为了延长电池续航时间,需要精心优化软件算法,减少不必要的计算和数据传输,同时确保手表的各项功能正常运行。这种在有限资源下追求性能最优化的挑战,是非嵌入式程序员较少考虑的。
3.实时性和可靠性
嵌入式系统往往要求具备高度的实时性和可靠性。在许多应用场景中,如工业自动化、航空航天等,嵌入式系统需要在毫秒级甚至微秒级的时间内做出响应。同时,这些系统的故障可能导致严重的后果,因此对可靠性有着极高的要求。嵌入式程序员需要精心设计软件架构,确保系统能够在规定的时间内做出准确响应,并在遇到异常情况时能够及时恢复或采取安全措施。
4.跨硬件/操作系统平台
嵌入式系统可能涉及多种不同的硬件平台和操作系统。因此,嵌入式程序员需要具备跨平台开发的能力,确保软件能够在不同的设备和环境中稳定运行。嵌入式程序员需要了解并掌握各种通信协议和标准,以实现设备间的无缝对接。
5.代码调试环境
嵌入式系统的调试环境通常比非嵌入式系统更为复杂。由于嵌入式系统涉及硬件与软件的紧密集成,调试过程中可能需要同时监控硬件状态和软件执行流程。这就要求嵌入式程序员不仅要有深厚的软件调试经验,还需要对硬件调试有所了解。
在调试过程中可能需要使用多种调试工具和设备。例如,需要使用JTAG调试器、逻辑分析仪、示波器等硬件设备来监测和诊断系统问题。同时,还需要熟悉各种软件调试工具,如GDB等调试器,以便在软件层面进行断点设置、变量监视和代码单步执行等操作。
在嵌入式系统调试中,设备之间的连接和通信也是一个重要的挑战。由于嵌入式设备可能分布在不同的物理位置,且可能采用不同的通信协议,另外,嵌入式程序员还需要考虑如何在不影响系统正常运行的情况下进行调试数据的传输和分析。
之前就遇到过,I2C数据通信异常,打算接上示波器的量测一下通信的波形,发现接上示波器后通信就正常了,拿下示波器后通信就异常了,这就变成了测不准”玄学了”。
6.BUG测不准
难以重现的Bug:在嵌入式系统中,有些Bug可能只在特定条件下出现,这些条件可能涉及特定的硬件配置、外部环境或是一系列复杂的用户操作。重现这些Bug以进行调试和修复往往非常困难。例如,一个车载导航系统在特定路况和天气条件下可能出现定位错误,但在实验室环境下模拟这些条件并不复现。
比如,设备做高低温 (高温80多度,低温-40度),就出现问题,常温的时候就正常。
7.远程固件更新
一旦嵌入式设备部署到现场,修复Bug可能涉及固件更新。然而,由于嵌入式设备的硬件限制(如存储空间不足)或网络环境(如低功耗广域网中的设备可能长时间处于离线状态),固件更新变得复杂和困难。