0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

代码的可重用性是代码开发和确保可维护性的关键

星星科技指导员 来源:嵌入式计算设计 作者:Colin Walls 2022-06-30 14:58 次阅读

实现嵌入式应用程序的过程很好理解:

代码(用 C/C++/汇编或其他语言)编写并放置在许多文件(模块)中。

每个模块都经过编译/组装以创建可重定位的目标文件。该文件包含目标处理器的机器指令,但地址信息尚未提交。

所有模块都使用链接器(有时称为链接器/定位器)集成在一起。此过程解析所有内存引用并生成一个绝对目标文件:最终系统内存的图像。

这种观点有些简单化,因为还有许多其他细微差别:

增量链接可用于将一个或多个可重定位对象连接在一起以形成单个可重定位对象。

可以调整链接/定位过程,以便代码存储在一个地方,但地址解析为在另一个地址执行,已被引导加载程序复制到那里。

可以将可重定位的目标文件链接在一起是产生目标模块库的一种特殊方式。

“图书馆”一词在各种情况下被使用和滥用。它的含义在这里定义明确。可以将库文件连同可重定位的目标文件一起提供给链接器。它的功能是解析可重定位目标文件未提供的符号(通常是函数名)。例如,如果您在一个模块中的代码调用了函数MyFun()并且在另一个模块中有此函数的定义,那么一切都很好。如果链接器没有找到这个函数,就会产生错误。但是,如果包含一个库(或多个库),则链接器将首先查找那里以解析符号。如果库包含MyFun()函数,则提取代码并在最终的绝对文件中使用。

图书馆的意义可能并不明显。你可以用一种简单的方式将所有的可重定位文件链接在一起——为什么还要麻烦图书馆呢?这个想法是该库包含大量函数,但链接器仅提取当前应用程序所需的函数。未使用的永远不会从库中提取,因此它们不会耗尽(即浪费)目标内存。

库的主要目的是作为大量可重用代码的存储库。在大型开发团队的项目中,这可能是一种很好的工作方式,在这种情况下共享代码非常有益,“重新发明轮子”是不可取的,但很常见。应仔细规划和记录项目库。设计函数时必须考虑重用:不使用全局数据、干净、定义良好的接口、可重入性等。

开发工具供应商通常会提供针对 C/C++ 标准化的库。它们包含两种类型的功能。显而易见的是开发人员在需要时调用的显式函数——比如printf()。其他库函数是隐式的;它们由编译器生成的代码调用,并提供常用的功能,方便共享。

软件 IP 供应商也可能以库的形式提供他们的产品。实时操作系统 (RTOS) 通常以这种方式分布。这使得 RTOS 可以直接扩展;应用程序中仅包含所需的 RTOS 功能。

库分布的一个问题是它们的“粒度”;可以提取多小的代码?一些库是由大块构建的。这意味着库中的模块可能包含属于特定 RTOS 设施的所有服务功能。因此,例如,使用一个 RTOS 调用对信号量进行操作将导致所有与信号量相关的服务调用函数都包含在应用程序中。一个非常细粒度的库可以与较小的单元一起使用。因此,使用单个服务调用将导致仅包含其代码而不是相关函数的代码。有一个权衡。一个非常细粒度的库会延长链接时间,但目标内存不会浪费在未使用的服务调用函数上。

所有嵌入式软件开发人员都应该了解库的工作方式及其提供的好处。代码的可重用性是高效、高效的代码开发和确保可维护性的关键。

审核编辑:郭婷

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    4981

    文章

    18274

    浏览量

    288362
  • RTOS
    +关注

    关注

    20

    文章

    775

    浏览量

    118783
  • C++
    C++
    +关注

    关注

    21

    文章

    2066

    浏览量

    72899
收藏 人收藏

    评论

    相关推荐

    CPCI设计与制造:提高制造关键要素

    。 华秋DFM软件是国内首款免费PCB制造和装配分析软件,拥有 500万+元件库 ,轻松高效完成装配分析。其PCB裸板的分析功能,开发了 19大项,52+细项检查规则 ,PCBA
    发表于 03-26 18:34

    【华秋干货铺】4点搞定Type-C接口的PCB制造设计优化!

    确保信号同步和完整。 CC1/CC2关键引脚的布局 :CC1/CC2是两个关键引脚,它们的作用包括:探测连接,区分正反面,区分DFP(下行端口)和UFP(上行端口),以及主从配置Vb
    发表于 12-08 10:18

    4点搞定Type-C接口的PCB制造设计优化!

    确保信号同步和完整。 CC1/CC2关键引脚的布局 :CC1/CC2是两个关键引脚,它们的作用包括:探测连接,区分正反面,区分DFP(下行端口)和UFP(上行端口),以及主从配置Vb
    发表于 12-08 10:15

    4点搞定Type-C接口的PCB制造设计优化!

    来增加短线长度,以确保信号同步和完整。 CC1/CC2关键引脚的布局 : CC1/CC2是两个关键引脚,它们的作用包括:探测连接,区分正反面,区分DFP(下行端口)和UFP(上行端口
    发表于 12-05 15:06

    python如何换行而不运行代码

    Python程序中的换行是指在代码中使用特定的语法来表示换行,以使代码更易读。换行的目的是为了让程序更具可读性并提高代码可维护性。然而,换行不会对程序的执行产生任何影响,它只是改善了
    的头像 发表于 11-24 09:50 1341次阅读

    USB接口的PCB制造设计要点

    USB连接器的PCB是否存在制造性问题等。 华秋DFM软件是国内首款免费PCB制造和装配分析软件,拥有 300万+元件库 ,轻松高效完成装配分析。其PCB裸板的分析功能,
    发表于 11-21 17:54

    优化重复冗余代码的8种方式

    日常开发中,我们经常会遇到一些重复冗余的代码 。大家都知道重复代码不好 ,它主要有这些缺点:可维护性差、可读性差、增加错误风险 等等。最近呢,我优化了一些系统中的重复
    的头像 发表于 09-11 09:47 358次阅读

    如何使用NUC1262 CRC对代码完整进行验证

    : NuMaker-NUC1262SE V1.0 本示例代码使用 NUC1262 CRC 对代码完整进行自我验证。 确保执行守则的完整
    发表于 08-29 06:49

    如何写出易维护的嵌入式代码怎么写?

    面向对象的语言更接近人的思维方式,而且在很大程度上降低了代码的复杂性,同时提高了代码的可读性和可维护性,传统的 C 代码同样可以设计出比较易读,易
    发表于 08-23 09:42 146次阅读
    如何写出易<b class='flag-5'>维护</b>的嵌入式<b class='flag-5'>代码</b>怎么写?

    Arm事务内存扩展概述

    本指南介绍事务内存,它允许自动执行代码,而无需始终实现限制性能的同步方法。 ARM事务内存扩展(TME)是事务内存的ARM实现。 现代复杂系统在不止一个处理器上执行。 对存储器访问的管理确保了当
    发表于 08-17 07:57

    使用GNU和ARM RealView®编译工具生成NEON代码的不同方法

    的软件开发都是在C或C++中进行的,以提高可维护性和可移植,缩短开发周期。本文描述了如何充分利用可用的编译工具来创建优化的软件。
    发表于 08-02 16:00

    代码应用开发的五大好处

    本文将进一步介绍低代码平台的关键功能、与业内其他开发方式对比之下的优势,以及市场对于低代码需求激增的理由。
    的头像 发表于 07-13 16:47 502次阅读

    Linux内核中的设计模式

    在软件开发中,设计模式是一种被广泛应用的解决问题的方法。设计模式可以帮助开发人员有效地解决软件设计中的问题,提高软件的可维护性和可扩展性,同时也能提高代码的可读性和可
    发表于 06-26 15:47 405次阅读

    如何使用参数化编写可重用的verilog代码

    我们将介绍如何使用verilog参数和generate语句来编写可重用的verilog 代码。 与大多数编程语言一样,我们应该尝试使尽可能多的代码重用。这使我们能够减少未来项目
    的头像 发表于 05-11 15:59 703次阅读

    如何使用verilog参数和generate语句来编写可重用的verilog代码

    与大多数编程语言一样,我们应该尝试使尽可能多的代码重用。这使我们能够减少未来项目的开发时间,因为我们可以更轻松地将代码从一个设计移植到另一个设计。
    的头像 发表于 05-08 16:59 986次阅读