我是一名嵌入式软件工程师,拥有不到 3 年的经验。我的目标是不断地“磨刀”。我想知道是否有 C/C++ 编码人员应该精通的特定于低级编程的东西。
我想到的是熟悉硬件的架构和指令集。知道如何摆弄比特也很重要,资源管理和性能一直是我工作的一部分,还有别的吗?
编辑:我使用的是内部定制的 RTOS,而不是嵌入式 Linux。
我在这里看到很多高级操作系统的答案,但是您具体说的是低级。
一些零散的想法:
我会研究实际芯片的电子学。了解它们如何在内部工作(例如架构)、与外围设备的接口、电气和时序特性等。
基本上,从头到尾阅读数据表几次,然后深入了解您以前未见过/未使用过的任何内容。
顺便问一下,你使用什么芯片?
与Brian 所说的类似,学习如何创建单元测试和自动化构建。
这些技能对于所有级别的软件工程师都非常有用。它们将有助于提高代码的质量,同时也使重构和改进代码库变得更加容易。
如果您还没有,我认为每个软件工程师都应该阅读 The Pragmatic Programmer 和 Code Complete。我知道这些并不特定于低级编程,但其中包含适用于所有子学科的大量知识。
对指针非常熟悉,这些语言的检查并没有做太多(如缓冲区溢出之类的),数字电子学。操作系统内部也可能有所帮助。
了解东西是如何在内部表示的,特别是现成的数据结构(假设您不会构建自己的数据结构)。
最重要的是,多练习。这样做给你带来的不仅仅是阅读它;)
编辑:我忘了提到的是基于模型的开发。今天,控制算法通常被实现为某种自动机,然后从中生成 C 代码。商业可用的工具有MATLAB/Simulink、ASCET或SCADE。
给自己买一本 MISRA-C书。它最初是由汽车行业的成员编写的,并试图通过应用许多(相当多的!)规则和指南来使用 C 编写的软件更加健壮。
然后,购买PC-Lint(或其他静态分析工具)来检查您的代码是否符合 MISRA 和其他规则。
这些与低级和嵌入式 C 尤其相关,因为它们之间处理此类软件中许多错误的原因,例如与指针、内存泄漏、整数提升有关的问题(在MISRA 书)、字节顺序和未定义的行为。
好问题。一些没有提到的...
了解实现低级多任务处理的各种选项。从基本的循环(非抢占式)调度程序,从硬件计时器计时,到抢占式 RTOS。了解您可能需要 RTOS 以及可能不需要的原因。如果您使用 RTOS,请了解具有 PC 背景的初学者可能倾向于创建太多任务。
Getting visibility into the internals for debugging can be a challenge. There's no screen typically, so no throwing in "printf" calls wherever you want. An emulator or JTAG interface is ideal--you can set breakpoints and step through your program (as long as halting the micro doesn't make hardware go crazy, like swinging a robot arm around at full speed!). If emulator/JTAG is not available, learn how to use a spare serial port (or maybe even bit-bash a pin to make a serial port) for a debug channel, with some simple memory peek/poke commands.