【发布时间】:2010-08-04 15:18:55
【问题描述】:
我想查找有关“嵌入式平台中的 C++ 编程”的信息。 我用谷歌搜索了它,但我无法找到关于该主题的足够信息。我到底想找到的是 C++ 在嵌入式环境中究竟是如何有用的,并附有详细的描述和示例(如果有的话)
如果可以的话,谁能推荐任何链接或任何免费的电子书下载?
【问题讨论】:
我想查找有关“嵌入式平台中的 C++ 编程”的信息。 我用谷歌搜索了它,但我无法找到关于该主题的足够信息。我到底想找到的是 C++ 在嵌入式环境中究竟是如何有用的,并附有详细的描述和示例(如果有的话)
如果可以的话,谁能推荐任何链接或任何免费的电子书下载?
【问题讨论】:
我还可以推荐 Michael J.Pont 的Embedded C一书。和 Programming Embedded Systems,作者 Michael Barr。
在我作为嵌入式开发人员的 14 年中,我了解到“实践”通常不适用于嵌入式系统。当书上说使用这种或那种模式时,如果你有无限的内存和 CPU 能力,那就是真的。
去年我为一家大公司设计新的固件平台时,我不得不打破几乎所有的设计规则。您需要问自己,以代码大小或速度为代价,一个众所周知且被接受的解决方案是否最适合您的项目?要记住的事情。
在声明变量之前请三思。局部变量在运行时在栈上创建,而全局变量在系统启动时创建一次。
Const 存储在闪存中,占用空间并且与索引数组具有相同的访问时间。如果您不需要用指针引用它们,最好使用类型转换定义:
#define kState_Idle (unsigned char)4
这将在汇编代码中的 4 中编译,而不是从闪存中获取它作为只读变量。
不要使用 double 或 float,它们非常慢。请改用整数数学。不惜一切代价避免使用数学库:)
在循环中访问的局部变量(例如 for、while 等)正在减慢速度,将它们声明为寄存器变量以加快速度。
C/C++ 框架正在将所有变量(包括常量)复制到 RAM。如果是只读变量,空间浪费很大。字符串也属于这一类,例如“Hello world”。
当谈到 C++ 时,模板是不重要的,RTTI 和异常也是如此。避免它!
重载和变形将使您通过良好的计划走得更远,您的代码将紧凑而快速。
根据微控制器的大小,您可能会避免包含任何 STL。我们制作了自己的 get()、put() printf() 等版本,以减少代码大小。
不要忘记研究您的微控制器/CPU 以 100% 使用硬件。例如,不要使用 memset 或 memcpy 填充内存,如果有的话,请使用 DMA。
也要研究组装。控制器通常有专门的指令,需要几行 C/C++ 代码才能完成。您可以在汇编中编写自己的 C 函数,以将它们连接到您的 C/C++ 代码中。很好的例子是位设置/清除指令或块操作指令。
检查控制器使用的数据大小。例如,如果它是一个 16 位系统,它可能一直读取 16 位,即使您声明了一个字符。在这种情况下,读取 char 比读取 short 需要更长的时间,因为它必须进行额外的屏蔽。
请记住,内部 RAM 比外部 RAM 快得多。您可以将变量甚至代码放在内部 RAM 中以加快速度。
闪存通常比 RAM 慢,尤其是写入速度。然而,放置经常访问的只读变量通常是没有后退的。编译器通常会检测一个经常使用的变量并分配一个内部寄存器。
通常不可能在不影响性能的情况下足够快地将调试信息发送到主机系统。在这些情况下,请创建一个内部调试缓冲区来存储您的信息并在之后进行分析。
通过切换硬件引脚来测量执行时间,它需要一条汇编指令,并且对执行速度几乎没有影响。使用逻辑分析仪或示波器监控引脚。我们在常用函数中寻找 ns 以提高整体性能。
自动生成的代码文档也是寻找“奇怪”设计或解决方案的好方法。我们使用 Doxygen 和 Graphviz 来生成类图和关系。在这里,我们得到了一个很好的概述,可以轻松地发现“过时的”类或未更新的子系统(我们使用了敏捷开发方法)
嗯..我可以永远写一整本书:)
我们使用上述 C++ 建议,在 20k RAM(RTOS、变量、通信缓冲区和堆)和 64k 闪存(引导块、应用程序代码和 2 个闪存盘)上制作了一台打印机,速度为 150mm/s。
祝你好运!
【讨论】:
我建议阅读与嵌入式 C 相关的书籍,例如 Michael J.Pont 于 2002 年出版的 Embedded C 或 Programming Embedded Systems in C和 C++,Michael Barr,1999 (http://book.opensourceproject.org.cn/embedded/embeddedc/)。
简而言之,所有嵌入式系统都是用 C/汇编程序启动的。 C++ 也可以使用,但用法与“非嵌入式 C++”相去甚远(唯一的区别通常是许多重要功能,如 RTTI、异常等已弃用)。
顺便说一句,查看与嵌入式平台/操作系统相关的书籍/指南/示例可能会更有用。
【讨论】:
不是一个真正有效的问题。
嵌入式可以指任何东西,从运行 Windows7 并带有完整的 Windows C++ 应用程序的微型 ATX 板到可能支持带有“//”cmets 的 C 的单芯片 uC。
有时嵌入式平台缺少异常,可能还有 RTTI - 否则几乎是标准 C++。
【讨论】: