如何组织嵌入式项目中的代码?

2024-01-09

高度嵌入式(有限的代码和 RAM 大小)项目给代码组织带来了独特的挑战。

我见过很多完全没有组织的项目。 (主要是由硬件工程师完成的,根据我的经验,他们通常不关心代码的非功能方面。)

但是,我一直在尝试相应地组织我的代码:

  1. 硬件特定(驱动程序、初始化)
  2. 特定于应用程序(不太可能被重用)
  3. 可重复使用,独立于硬件

对于每个模块,我尝试将其目的保留为这三种类型之一。

由于嵌入式项目规模有限且注重性能,因此常常保留这种组织方式。

对于某些情况,我当前的项目是具有 8k 闪存和 256 字节 RAM 的 MSP430 上的有限 DSP 应用程序。


我在各种目标微控制器(包括 MSP430)上编写和维护了多个嵌入式产品(30 多个并且还在增加)。我最成功的“经验法则”是:

  • 尝试尽可能模块化通用概念(例如,将驱动程序代码与应用程序代码分开)。 -- 它使得将来更容易维护和重用/将项目移植到另一个目标微。
  • 不要从一开始就担心优化代码。首先尝试解决领域的问题,然后再优化。 -- 您的目标微控制器可以处理比您想象的更多的“东西”。
  • 努力确保可读性。尽管大多数嵌入式项目的开发周期似乎很短,但这些项目的生命周期通常比您预期的要长,并且毫无疑问,另一个开发人员必须使用您的代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何组织嵌入式项目中的代码? 的相关文章

  • 适用于嵌入式设备的良好串行通信协议/堆栈? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 在为各种项目编写了几个不同的自定义串行协议后 我开始对每次重新发明轮子感到沮丧 我一直在寻找更通用的解
  • 在 Visual Studio 中删除折叠区域和摘要周围的框

    我正在使用 VS2010 我想在压缩区域和 或摘要时更改它们的字体样式 主要是为了删除这些部分周围的边框 因为在滚动代码时它会变得分散注意力 我浏览了 字体和颜色 和其他选项 但找不到任何明显可以让我更改它的内容 这个字体可以自定义吗 如果
  • 避免循环后重复代码?

    使用循环时 我经常会编写两次代码 例如 在复习 Udacity 计算机科学课程时 我编写了代码 用于查找最连续重复的元素的函数 def longest repetition l if not l return None most reps
  • 什么是 Qt 裸机?

    QtCreator 有一个名为 Bare Metal 的插件 裸机是指没有操作系统的计算机 我还没有看到太多关于Qt Bare Metal开发的内容 这是为裸机系统开发 Qt 的一种方法吗 Qt 可以在没有操作系统的系统上运行吗 如果是 这
  • Objective-C 类别性能

    如果我使用类别将 Objective C 类的实现分解为多个 implementation块 这会使我的 iOS 应用程序生成的二进制文件更大或根本影响性能吗 显然 你不能在运行时获取类的类别详细信息 https stackoverflow
  • 浮点线性插值

    在两个变量之间进行线性插值a and b给定一个分数f 我目前正在使用这段代码 float lerp float a float b float f return a 1 0 f b f 我认为可能有一种更有效的方法 我使用的是没有 FPU
  • 如何查找 C++ 中的内存泄漏

    在嵌入式环境中检测 C 内存泄漏的好方法是什么 我尝试重载 new 运算符来记录每个数据分配 但我一定做错了什么 这种方法不起作用 还有其他人遇到过类似的情况吗 这是 new 和 delete 运算符重载的代码 EDIT 完全披露 我正在寻
  • 我可以从哪里开始使用可编程硬件?

    一段时间以来 我一直渴望至少学习一点有关硬件编程的知识 并想在这里提出要求以获得一些起点 我是一位相当有成就的程序员 具有 Delphi 和 Objective c 经验 但从未听过设备端口 中断 我什至不知道术语 更不用说对硬件进行编程了
  • 典型的按键持续时间是多少

    我正在固件项目中做一些关于按键处理的工作 我一直在谷歌上搜索 试图找出按键的典型持续时间是多少 特别是快速打字员的最短持续时间 令人惊讶的是我在任何地方都找不到任何相关数据 最近有一些关于按键时序的研究已经发表 这里有两个 http www
  • 创建 32 位计数器时出现全局变量问题

    我正在尝试做正交解码 using 爱特梅尔 Xmega AVR微控制器 Xmega只有16 bit柜台 另外 我已经用完了所有可用的计时器 现在要做32 bit柜台我用过一个16 bit柜台并在其over under flow interr
  • 在链接时合并全局数组/从多个编译单元填充全局数组

    我想定义一系列的东西 比如事件处理程序 的内容 该数组在编译时是完全已知的 但定义在 多个编译单元 分布在多个库中 至少在最终 静态 链接之前是相当解耦的 我想要 也保持这种方式 因此添加或删除编译单元将 还可以自动管理事件处理程序 而无需
  • 如何随时暂停 pthread?

    最近我开始将 ucos ii 移植到 Ubuntu PC 上 我们知道 在pthread的回调函数中的 while 循环中简单地添加一个标志来执行暂停和恢复是不可能模拟ucos ii中的 进程 的 如下解决方案 因为ucos ii中的 进程
  • 工作站和嵌入式程序员之间的心态差异[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • MISRA C++(规则 18-4-1)和动态内存分配 - 是否允许 std::string?

    MISRA C 规则 18 4 1 说 不得使用动态堆内存分配 See http dist sonarsource com reports coverage misra c 2008 html http dist sonarsource c
  • Windows CE 与嵌入式 Linux [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 现在我确信我们都清楚 Linux 与 Windows 桌面的相对优点 然而 我对嵌入式开发世界的了解却少得多 我主要对行业解决方案感兴
  • 用于嵌入式系统的简约人类可读序列化格式解析器

    By 人类可读的序列化格式 I mean YAML JSON INI或喜欢 请注意 XML对于我的目的来说太冗长而且太不方便 所以让我们把它作为最后的手段 格式应将数据存储为 命名键 值 配对并允许嵌套和数组 不过 缺少数组并不重要 此外
  • ARM Cortex-M3 启动代码

    我试图了解 STM32 微控制器的 Keil realview v4 附带的初始化代码是如何工作的 具体来说 我试图了解堆栈是如何初始化的 In the 文档 http infocenter arm com help index jsp t
  • 嵌入式开发系统中JTAG的一般工作流程?

    在我的嵌入式项目中 我使用 JTAG 接口下载代码并调试下载的应用程序 但我不知道 JTAG 设置内部发生了什么 任何人都可以给我 JTAG 设置的基本想法 流程 高级视图 这将真正帮助我更好地理解我的开发系统 为了添加克利福德的答案 这里
  • GDB 脚本编写为 MOCK

    我正在尝试使用 GDB 模拟一个函数 用于单元测试父函数 一种方法是在您想要模拟和使用 GDB 的函数中设置一个断点return命令 但是当 GDB 时我无法做同样的事情call使用命令 gdb b secret check Breakpo
  • ARM C++ - 如何将 const 成员放入闪存?

    我有这个代码 class IO public IO LPC GPIO TypeDef port int pin pin pin port port const int pin LPC GPIO TypeDef const port void

随机推荐

  • 如何使用 javascript、jquery 等创建打印模式

    假设我在几页上有一个打印按钮 每当用户单击时 它将在模式中弹出内容并可以从那里打印 任何想法将不胜感激 我有几页带有打印按钮 当用户单击它时 需要将该内容拉入模式中 然后从该模式中打印 我现在无法为您编写代码 但我可以让您走上正轨 你需要使
  • 为什么我的实体不能与 SpringBoot 一起工作,尽管它可以在没有 SpringBoot 的情况下工作

    请注意 在调查时这个问题 https stackoverflow com questions 52799706 springboot not an entity noredirect 1 comment92527948 52799706我更
  • JavaFX 在多个页面上打印表格视图

    所以 我的问题是我需要打印 tableview 的内容 但其中有太多项目 它只打印其中的前 23 个 我已经在这里找到了一些解决方案 不幸的是它们没有多大帮助 这是我的打印方法 FXML private void printIt Print
  • 如何检测何时发生全屏事件(按 f11 键)[重复]

    这个问题在这里已经有答案了 如何在按下 f11 键时检测全屏事件何时发生 如果发生这种情况 则意味着屏幕处于全屏模式 然后显示警报 不使用键码比较 请给我一种不同的方法来执行此操作 mozilla proposal element requ
  • PyQt QtWebChannel:从 JavaScript 调用 Python 函数

    我正在尝试 使用 Qt 类QWebEngineView and QWebChannel在 HTML 页面和 Python 脚本之间建立简单的连接 目标只是执行foo 当标题 h2 被点击 import sys from PyQt5 QtCo
  • 项目中尚未使用旧版 People API

    我在调用 google 登录 API 时遇到错误 错误是 旧版 People API 之前未在项目 中使用过或已被禁用 但人员 API 已启用 如何解决这个错误 这是我的 google api url 这足以解决我的问题 if empty
  • 如何在 ruby​​ 中清理格式错误的 xml

    我在整理从以下网站返回的格式错误的 XML 代码时遇到问题SEC 的 edgar 数据库 http www sec gov edgar shtml 由于某种原因 他们形成了可怕的 xml 包含任何类型字符串的标签都不是封闭的 它实际上可以在
  • Qt 5 无法部署在 SnowLeopard 上

    我遇到的问题是我的应用程序无法在 10 6 Snow Leopard 上运行 我使用这些参数进行编译 qmake LSPRO pro r spec macx clang CONFIG release CONFIG x86 64 在我的 Pr
  • WatiN:CurrentThread 需要将其 ApartmentState 设置为 ApartmentState.STA 才能自动化 Internet Explorer

    我正在从 C Windows 服务调用 WatiN 当我调用 WatiN 时 它抛出以下异常 CurrentThread 需要将其 ApartmentState 设置为 ApartmentState STA 才能自动化 Internet E
  • 同一线程上的 WebView 方法错误

    我有一个 android 程序 Webview 中的 Java html 我可以从 javascript 调用 Java 代码 但相反的方式停止工作 在 Eclipse 中更新后 这就是我想做的 制作一个网络视图 有效 在 javascri
  • SimpleXML 如何在节点中添加子节点?

    当我打电话时 addChild actor John Doe 这个孩子是最后添加的 有没有办法让这个新孩子成为第一个孩子 正如前面提到的 SimpleXML 不支持这一点 因此您必须使用 DOM 我的建议如下 使用您需要在程序中使用的任何内
  • ios - 从手指移动画笔

    我想在我的 iPad 应用程序中画画 如下图所示 in my app i have placed a image and while moving the finger touch movement i am repeating the i
  • 如何从列表中获取特定项目?

    我有一个案例类别的列表 我想从列表中获取特定项目 I do myList filter id myobject id 0 当filter实际上返回一些东西 但是 当过滤器不返回任何内容时 我会得到索引越界异常 scala gt case c
  • 为什么需要使用 EntryPoint 属性定义 DLLImport

    在经历的同时SWig http www swig org 生成的包装器中 我发现 PInvoke 没有定义任何入口点 但有些地方确实有入口点 那么它们之间有什么区别呢 什么时候需要定义 EntryPoint 什么时候不需要 定义无Entry
  • 按钮图像距离按钮顶部太远;太靠近按钮底部

    我正在 VB NET 2005 中开发 Windows 窗体 我想要一些带有图像的按钮 我说的是普通的 普通的 System Windows Forms Button 我已按照我想要的方式设置了所有内容 但图像在按钮上显示得太低 因此图标的
  • 如何打包不是使用 vagrant up 命令创建的现有虚拟机?

    我安装了 VirtualBox 然后在其中安装了 Ubuntu 12 10 Server Base OS 我在里面安装了各种php包和其他包 我的朋友推荐我使用 Vagrant 这样我就可以轻松地与我的队友分享我的设置 因为我当前的 Vir
  • pygame全屏模式退出

    我正在运行这个小程序 它以全屏模式将图像加载到屏幕上 但是一旦加载 程序将不会通过任何组合键退出 我最终不得不重置计算机才能完成我正在做的任何其他事情 import pygame pygame init WIDTH 1366 HEIGHT
  • 获取由 css column-width 创建的列数[重复]

    这个问题在这里已经有答案了 可能的重复 如何在 Javascript 中获取 css3 多列计数 https stackoverflow com questions 6989306 how to get css3 multi column
  • 为什么ArrayList类的removeRange方法不起作用? [复制]

    这个问题在这里已经有答案了 我正在尝试使用removeRange从中删除某些元素的方法ArrayList 我从这里开始了解这个方法 http docs oracle com javase 7 docs api java util Array
  • 如何组织嵌入式项目中的代码?

    高度嵌入式 有限的代码和 RAM 大小 项目给代码组织带来了独特的挑战 我见过很多完全没有组织的项目 主要是由硬件工程师完成的 根据我的经验 他们通常不关心代码的非功能方面 但是 我一直在尝试相应地组织我的代码 硬件特定 驱动程序 初始化