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