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

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

3天内不再提示

C编程如何做到完美库化?

GReq_mcu168 来源:未知 作者:佚名 2017-12-01 09:19 次阅读

一个的设备程序如果完美库化,它意味着:

1.所有工程师在移植或创建该设备驱动时,花费的代价超小。

2.随着使用者的增多,它饱经考验,不断趋于稳定,变为当之无愧的公共代码。

3.库对外的接口(函数名及其参数声明)是不变的,当所有常用设备都实现库化时,它带来另外一个好处,应用层的移植、创建、修改维护的时间耗费也会剧烈减少。应用层的跨平台无缝移植不是传说,当它所依赖的所有外围设备通通在不同平台库化的时候,应用层的实现,就像在写java代码一样。

4.库意味这公司核心代码的安全,库代码只掌握在核心工程师手里,应用层的程序即使丢失也是无碍。

5.新人对于这些基于库案子更快上手,一来有库帮助文档的说明,二来不必也无法关心底层细节,专注于应用开发。

6.提供给客户二次开发,你可以把硬件和外设驱动的库交给客户,让其二次开发。

7.通信协议的库化,将使通信系统类的产品更加安全,至少不会被离职的工程师破坏,比如RFID的扣款充值。

8. ......

怎么样,它使老板心动,工程师百味杂陈。

当然,有些工程师会想到,库可以使他脱离繁琐的底层驱动工作,进行更高层次的工作。

库的创建要想搞得好,有以下几个条件

1.提供给客户的只有.h档和.lib档。

2.所有.h档中没有define,编译条件对于.lib档来说只是一个笑话。

3.所有.h档中没有extern变量,如果有,这意味着系统只能创建一个这种设备。比如蜂鸣器驱动,如果extern变量,就意味着整个系统只允许一个蜂鸣器。

4.完善而详细的使用帮助文档。可参考keil的hlp文档格式。

5.简单的使用该.h档的demo程序让人参考。

6.“动态链接”库代码,简言之,没用到的接口函数代码不会被链接器搞到最终的二进制档中。

7.还有一点,尽量的平台无关性,它不依赖于任何寄存器或者其他和平台相关的东西。

要达到上述的目的,通常会使库有如下特点

1.结构体指针

2.大量的回调函数指针。

3.丰富的接口。

4.库源码的.c档将按接口函数拆分成更多的.c档,这为了实现链接时代码空间最小化。

库的缺点也是有的

1.它会使设备速度变慢一些,多了几层间接取址的消耗。但对于32位机,对于它带来的便利,还是可接受的。

2.它会使code空间消耗相对更大一些,但请相信我,对于一整个中大型系统而言,它会使代码量不升反降,因为大系统中有非常多的重复冗余代码。这方面我个人的经验,降的不是一般的多,简直到了一个难以置信的程度。

早期的8位机,51平台上其实不能很好地实现完美的库,至少是不能实现一个跨机型的底层设备驱动库。近年来随着32位机的兴起,库渐渐地受到越来越多工程师的青睐。这里面最本质的原因在于,51架构的栈是静态编译的,局部变量和传参的栈也是静态的,函数无法重入。而多数的32位机都是压栈传参的方式。当然,51速度慢也是重要的原因之一。

如果有熟悉面向对象语言或者linux驱动的朋友,你大概就明白一个好的库是什么样子的了。库就像是面向对象中的类,至于linux底层驱动的代码,那就是函数指针和结构体指针的世界。C的精华在指针,在里面得到完美的诠释。

当然,库的代价也是有的

1.它会使设备速度变慢一些,多了几层取地址的消耗。但对于32位机,对于它带来的便利,还是可接受的。

2.它会使code消耗便大一些,但请相信我,对于一个中大型系统而言,它会使代码不升反降,因为大系统中有非常多的重复冗余代码。


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

    关注

    18

    文章

    976

    浏览量

    46956

原文标题:嵌入式C编程经验细谈: 你库了吗?

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    请问STM32F103C8如何做成USB转SPI的接口芯片?

    STM32F103C8如何做成USB转SPI的接口芯片?
    发表于 04-23 08:01

    光伏户用如何做到低成本获客?

    光伏户用如何做到低成本获客? 随着可再生能源的日益普及和技术的不断进步,光伏系统正逐渐走进千家万户。然而,对于光伏企业来说,如何在激烈的市场竞争中低成本地获取客户,成为了他们面临的一大挑战。本文将
    发表于 02-27 10:33

    “其貌不扬”的共模电感究竟是如何做到抗干扰的呢?

    “其貌不扬”的共模电感究竟是如何做到抗干扰的呢? 共模电感是一种用于滤除电子设备中的共模噪声的重要元件,其主要作用是提供阻抗来滤除共模干扰信号。尽管外观看起来“其貌不扬”,但共模电感通过其特殊
    的头像 发表于 01-11 16:27 212次阅读

    RF模组sleep状态下如何做到最低功耗?

    的。那么如何解决呢?本文将对RF模组在Sleep状态下如何做到最低功耗进行说明。RF模组sleep时RF模组的IO状态先要获知RF模组Sleep时,RF模组的IO
    的头像 发表于 01-06 08:13 169次阅读
    RF模组sleep状态下<b class='flag-5'>如何做到</b>最低功耗?

    工业级连接器如何做到高抗冲击性?选款一定要了解这几点

    连接器知识分享工业级连接器多用在工厂、车载、户外等复杂场景下,因而面临冲击等应力影响的概率极高。工业级连接器如何做到高抗冲击性,确保高可靠连接呢?这篇文章讲清楚。工业级连接器如何做到高抗冲击性?LP
    的头像 发表于 01-06 08:13 131次阅读
    工业级连接器<b class='flag-5'>如何做到</b>高抗冲击性?选款一定要了解这几点

    AD6688如何做到多板间的AD采样同步?

    大家好,JESD204B协议已让单板多片AD采样同步变得更容易了,想请教下,如何做到多板间的AD采样同步啊,有没有什么好的思路啊。 还有AD6688的采样时钟频率范围为2.5G~3.1G,芯片支持
    发表于 12-12 08:27

    编程如何做到高内聚低耦合呢?

    低耦合,是指模块之间尽可能的使其独立存在,模块之间不产生联系不可能,但模块与模块之间的接口应该尽量少而简单。
    的头像 发表于 12-06 09:20 409次阅读

    防物理攻击,芯片是如何做到的?

    防物理攻击,芯片是如何做到的? 芯片是现代电子设备的核心组件,负责存储和处理数据。为了确保芯片的安全性,需要采取一系列防护措施来防范物理攻击,包括防止物理侵入、防御侧信道攻击以及防范反向工程等。下面
    的头像 发表于 11-07 10:18 357次阅读

    请问STM8L低功耗如何做串口接收2s一次的数据?

    STM8L现在用他接收外部2s一次的串口数据,如何做到低功耗接收
    发表于 11-06 06:05

    单片机如何做到一段时间没有操作机器自动进入待机状态,按任意键退出待机?

    单片机如何做到一段时间没有操作机器自动进入待机状态,按任意键退出待机
    发表于 10-07 08:49

    应用笔记:ARM编译器C启动与初始

    在用户定义的main()函数启动之前,嵌入式应用程序需要初始序列。 这称为启动代码或引导代码。 ARM C包含启动应用程序所需的预编译和预汇编代码段。 链接应用程序时,链接器根据应用程序包括
    发表于 08-29 08:08

    NUC220VE3AN如何做到USB HOST?

      现时我使用NUC220VE3AN并想储存它的AD数据在USB随身碟,但我不知道如何修改,使它可以做到USB HOST的功能,令我可以读写USB随身碟。请各位多多指教。
    发表于 08-21 08:07

    新唐无感FOC方案: 如何做到轻重载都平稳启转?

    如果启转电流比较小,轻载启转平稳,重载时就托不动。若启转电流大,重载能转动,轻载转速就容易上冲。 新唐方案是大电流定位后,开始托动,所以轻重载都能转动。如何做到轻载转速不上冲呢?
    发表于 06-19 12:48

    水族智能补水器是如何做到缺水加水满水即停的

    水族智能补水器是一种智能化的水族箱补水设备,它可以自动检测水族箱中的水位,当水位低于设定值时,自动加水,直到水位达到设定值后停止加水。那么,水族智能补水器是如何做到缺水加水满水即停的呢?下面我们
    的头像 发表于 06-17 15:17 432次阅读
    水族智能补水器是<b class='flag-5'>如何做到</b>缺水加水满水即停的

    如何做到一个USB仿真两个CPU的?

    请问一下是如何做到一个USB仿真两个CPU的? 编译从核的工程, 它的固件怎么就能直接写入到主核的工程里去的?
    发表于 05-26 06:10