在哪里可以找到有关嵌入式 C++ 的信息?

2024-06-02

我想查找有关“嵌入式平台中的 C++ 编程”的信息。 我用谷歌搜索,但无法找到有关该主题的足够信息。我到底想找到的是 C++ 在嵌入式环境中到底如何有用,并带有详细的描述和示例(如果可用)

如果我能得到,任何人都可以建议任何链接或任何免费电子书下载吗?


我也可以推荐这本书嵌入式C作者:迈克尔·J·庞特和嵌入式系统编程作者:迈克尔·巴尔。

在我作为嵌入式开发人员 14 年的经验中,我了解到“实践”通常不适用于嵌入式系统。当书上说使用这种或那种模式时,如果您有无限的内存和 CPU 能力,那就是真的。

去年,当我为一家大公司设计新的固件平台时,我不得不打破几乎所有设计规则。您需要问自己,一个众所周知且被接受的解决方案是否最适合您的项目,但会牺牲代码大小或速度?要记住的事情。

本地还是全球?

声明变量之前请三思。局部变量是在运行时在堆栈上创建的,而全局变量是在系统启动时创建的。

const存储在flash中,占用空间并且与索引数组具有相同的访问时间。如果不需要用指针引用它们,最好使用类型转换定义:

#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 位系统,则即使您声明了 char,它也可能始终读取 16 位。在这种情况下,读取 char 比读取 Short 需要更长的时间,因为它必须进行额外的屏蔽。

Memory

请记住,内部 RAM 比外部 RAM 快得多。您可以将变量甚至代码放入内部 RAM 中以加快速度。

闪存通常比 RAM 慢,尤其是写入。然而,放置经常访问的只读变量通常不会造成任何影响。编译器通常会检测经常使用的变量并分配一个内部寄存器。

testing

通常不可能在不影响性能的情况下足够快地将调试信息发送到主机系统。在这些情况下,创建一个内部调试缓冲区来存储您的信息并在事后对其进行分析。

通过切换硬件引脚来测量执行时间,它需要一条汇编指令,并且对执行速度几乎没有影响。使用逻辑分析仪或示波器监视引脚。我们在常用函数中寻找 ns 以提高整体性能。

自动生成的代码文档也是查找“奇怪”设计或解决方案的好方法。我们使用 Doxygen 和 Graphviz 来生成类图和关系。在这里我们得到了一个很好的概述,并且可以很容易地发现“过时的”类或未更新的子系统(我们使用了敏捷开发方法)

嗯..我可以永远继续下去,写一本关于这个的书:)

我们使用 C++ 中的上述建议,在 20k RAM(RTOS、变量、通信缓冲区和堆)和 64k Flash(引导块、应用程序代码和 2 个闪存盘)上制作了一台打印机,打印速度为 150mm/s。

祝你好运!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在哪里可以找到有关嵌入式 C++ 的信息? 的相关文章

随机推荐

  • 内存转储格式类似于 gdb 中的 xxd

    我正在尝试检查一个缓冲区 其中包含二进制格式的消息 但也包含字符串数据 作为示例 我正在使用以下 C 代码 int main void char buf 100 x01 x02 x03 x04String Data xAA xBB xCC
  • 如何使用 Visual Studio 2013 和实体框架将控制器添加到 ASP.NET MVC?

    当我使用 ASP NET MVC 5 0 和 Entity Framework 6 0 在 Visual Studio 2013 中添加控制器时 出现错误 我已经添加了一些控制器并生成了视图 但是在添加数据表包之后 我收到了此类错误 Err
  • 字符串的外部文件,而不是对它们进行硬编码

    我有开发一些 Android 应用程序的经验 这些应用程序可以轻松地拥有可以存储字符串的 XML 字符串文件 上次我开发桌面 Java 应用程序时 我对字符串进行了硬编码 例如按钮标题 标签等 我后来了解到这是不好的做法 我应该将字符串存储
  • 如何检查浏览器的JavaScript是否启用

    我的应用程序依赖于 JavaScript 我想检查客户端浏览器的 JavaScript 是否启用 如果关闭则发出警报消息 其实有一个
  • 实体框架未正确修改或删除子项

    我正在尝试保存Firm包含地址和网站的对象 我开发了在 Angular 7 中使用反应式表单在 UI 中添加和删除地址控件的功能 Firm对象 它正在为地址和网站创建附加条目 而不是将其视为现有记录 因此 如果我从 UI 中删除网站和地址
  • 从 Symfony2 中的 http_basic auth 注销

    每当我去 admin logout 我已正确重定向到项目的根目录 但在访问时仍处于登录状态 admin 因为没有提示我输入凭据 这是我的配置 安全 yml security firewalls admin area pattern admi
  • javascript async/await 实际上是如何工作的?

    我有一些使用 javascript async await 的代码 function sleep ms return new Promise resolve gt setTimeout resolve ms async function f
  • 如何从 JSON 创建 Mongoose 模式

    我是 mongodb nodejs 和 mongooseJS 的新手 最近 我一直在尝试为我的 JSON 创建猫鼬模式 endpoints a z poi location name a latitude 10 1075702 longit
  • “内容值”和“内容对象”有什么区别

    我现在正在探索绑定 并且有一个 NSPopUpButton 它为我提供了 值选择 下的许多绑定选项 Content Content Objects Content Values 然后Selected Object Selected Valu
  • 需要 sudo 密码的 Bash 脚本

    我正在创建一个 Bash 安装程序脚本 它为 OSX 和 Linux 编译并安装一些库 因为我的脚本中的某些命令 make install apt get install port install 等 需要 sudo 所以我需要用户提供密码
  • 按需急切加载

    我提出一个查询 String query SELECT DISTINCT a FROM A a FETCH ALL PROPERTIES JOIN a Bs AS b JOIN b Cs AS c WHERE c c Query q DAO
  • php 中 php.ini 的 log_errors 和 error_log

    我正在尝试通过 php ini 更改 php ini 中的设置 我的问题是 当出现错误时 它不会放入文件 error log txt 中 那么我做错了什么 这是我的代码 Settings for php ini ini set sessio
  • 使用 SQL Server 2008 的 IIS 应用程序池身份帐户配置集成安全性

    我的网站有以下配置 两个 Web 前端 例如机器名称 WFE1 和 WFE2 1 SQ 1 个 SQL Server 数据库集群 例如机器名称 DBCluster 所有计算机都位于运行 Windows 2008 R2 Enterprise
  • “警告:mysql_query():提供的参数不是有效的 MySQL-Link” - 为什么?

    我的代码有什么问题吗 我不断收到此错误 Warning mysql query supplied argument is not a valid MySQL Link resource in functions php on line 4
  • jsFiddle 中的 jQuery 不显眼的自定义适配器和方法

    我无法使 jsFiddle 工作 但它可以在浏览器中工作 http jsfiddle net vtortola jYq2X http jsfiddle net vtortola jYq2X 我正在尝试添加新的自定义规则来比较两个字段 自定义
  • Sql 2008 文件流与 NHibernate

    我试图在 sql server 2008 中使用 Filestream 来存储用户上传的图像 我的问题是NHibernate不会出错 但它也不会将数据保存到数据库中 没有创建记录 下面的 Image 类是一个自定义类 不要与 System
  • Sqlalchemy 一对多关系加入?

    我正在尝试做一个像这样的简单连接查询 SELECT food id food food name food categories food categories FROM food JOIN food categories ON food
  • Hector (Cassandra) 删除异常

    当我尝试删除时使用 hector cassandra 客户端 它会删除列 但将行键留在后面 有谁知道为什么 以及如何删除该行键 使用 Cassandra 时这是预期的 由于它通过写入逻辑删除来删除 因此数据仍然存在 直到下一次压缩 最终它会
  • 访问iOS 7隐藏的UITableViewCellScrollView?

    苹果改变了UITableViewCelliOS 7 中的层次结构 使用iOS 6 1 SDK
  • 在哪里可以找到有关嵌入式 C++ 的信息?

    我想查找有关 嵌入式平台中的 C 编程 的信息 我用谷歌搜索 但无法找到有关该主题的足够信息 我到底想找到的是 C 在嵌入式环境中到底如何有用 并带有详细的描述和示例 如果可用 如果我能得到 任何人都可以建议任何链接或任何免费电子书下载吗