10

我是一名嵌入式软件工程师,拥有不到 3 年的经验。我的目标是不断地“磨刀”。我想知道是否有 C/C++ 编码人员应该精通的特定于低级编程的东西。

我想到的是熟悉硬件的架构和指令集。知道如何摆弄比特也很重要,资源管理和性能一直是我工作的一部分,还有别的吗?

编辑:我使用的是内部定制的 RTOS,而不是嵌入式 Linux。

4

9 回答 9

13

我在这里看到很多高级操作系统的答案,但是您具体说的是低级。

一些零散的想法:

  • 为测试而设计。当你解决一个问题时,每次测试一次只改变一件事。
  • 您需要了解总线和接口、spi、i2c、usb、以太网等。第一接口,今天、昨天和明天,uart,串行。
  • 编程闪存所涉及的步骤。
  • 避免使产品容易变砖的技巧。
  • 引导加载程序一般。
  • 上述各种部件系列的接口(不同的芯片供应商对 io 引脚、上拉、方向控制等有不同的想法)。
  • 板子和芯片启动,你肯定不想在第一次上电时启动数万行代码程序(想想 led on,led off)。
  • 如何在不使用太多测试设备(逻辑分析仪和示波器)的情况下调试产品,同时您必须学会使用示波器进行调试,如果您不需要技术或工程师,您将更有价值和你一起在实验室。
  • 您将如何在现场重新编程该单元?当允许用户对设备进行现场升级时,您将如何最大限度地减少人为错误?还要记住现场降级。
  • 你会做什么来阻止黑客攻击(二进制文件等)。
  • 有效使用闪存/ROM(不要磨损一个银行或部分,分散磨损,或者看看闪存是否在为你做这件事)。
  • 如何以及何时使用看门狗定时器。
  • 状态机,对于字节流(串行和以太网)非常有用,它设计的数据包结构可以很好地传输并为状态机量身定制,并且具有标头和校验和或其他结构,可确保您不会将部分数据包或随机数据解释为好包。
于 2009-07-07T22:14:22.167 回答
11

具体的概念,例如,

  1. 字节顺序(此链接指向一篇旧但很好的 linuxjournal 文章)
  2. 有效使用多线程架构(嵌入式站点总体上不错)
  3. 调试嵌入式多线程系统
  4. 理解、学习和遵循良好的编程技术(链接很老,观点很笼统和主观,但想想看)
  5. 其他事情(这个关于嵌入式 linux 的 IBM 页面总结了我想要提出的大部分其他观点)
  6. 还有一件事——永远不要低估测试!或者,计划测试用例!

使用我提供的参考链接作为概念,
请进一步跟进以获得更深入的知识。

于 2009-07-07T12:11:03.343 回答
9

我会研究实际芯片的电子学。了解它们如何在内部工作(例如架构)、与外围设备的接口、电气和时序特性等。

基本上,从头到尾阅读数据表几次,然后深入了解您以前未见过/未使用过的任何内容。

顺便问一下,你使用什么芯片?

于 2009-07-07T12:06:51.840 回答
7

Brian 所说的类似,学习如何创建单元测试自动化构建

这些技能对于所有级别的软件工程师都非常有用。它们将有助于提高代码的质量,同时也使重构和改进代码库变得更加容易。

于 2009-07-07T12:17:46.480 回答
4

如果您还没有,我认为每个软件工程师都应该阅读 The Pragmatic Programmer 和 Code Complete。我知道这些并不特定于低级编程,但其中包含适用于所有子学科的大量知识。

于 2009-07-07T12:09:55.967 回答
3

对指针非常熟悉,这些语言的检查并没有做太多(如缓冲区溢出之类的),数字电子学。操作系统内部也可能有所帮助。

了解东西是如何在内部表示的,特别是现成的数据结构(假设您不会构建自己的数据结构)。

最重要的是,多练习。这样做给你带来的不仅仅是阅读它;)

于 2009-07-07T12:09:38.667 回答
2
  • 位操作
  • 处理器架构(缓存等)
  • wcet分析
  • 调度

编辑:我忘了提到的是基于模型的开发。今天,控制算法通常被实现为某种自动机,然后从中生成 C 代码。商业可用的工具有MATLAB/SimulinkASCETSCADE

于 2009-07-07T12:44:05.957 回答
1

给自己买一本 MISRA-C书。它最初是由汽车行业的成员编写的,并试图通过应用许多(相当多的!)规则和指南来使用 C 编写的软件更加健壮。

然后,购买PC-Lint(或其他静态分析工具)来检查您的代码是否符合 MISRA 和其他规则。

这些与低级和嵌入式 C 尤其相关,因为它们之间处理此类软件中许多错误的原因,例如与指针、内存泄漏、整数提升有关的问题(在MISRA 书)、字节顺序和未定义的行为。

于 2009-07-07T20:20:24.223 回答
1

好问题。一些没有提到的...

了解实现低级多任务处理的各种选项。从基本的循环(非抢占式)调度程序,从硬件计时器计时,到抢占式 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.

于 2009-07-08T11:52:31.697 回答