发 帖  
原厂入驻New

[经验] 如何将功能整合到嵌入式固件中

2020-9-9 15:30:19  329 c语言 固件
分享
1
像各种其他形式的组织一样,职能最初需要付出额外的努力和深谋远虑。但是,从长远来看,如果我们养成编写包括大量使用函数的代码的习惯,那么我们将节省时间和精力,更不用说增加压力了。

毫无疑问,拿走我收到的每份文件并将其放在散落在我办公桌上的几堆纸中的其中一堆上,感觉很“容易”。最终,尽管堆砌得很整齐并用便签贴了标签,但这种简单的组织方案最终会带来各种困难。同样,当我考虑固件项目时,似乎到工作原型的最直接,最轻松的途径是一个相对“无功能”的源文件,它完全可以满足我的需要,而没有其他任何作用。有时,这种方法很有意义,但总的来说,我认为这是一种短视的解决方案。

功能的好处模块化
如果代码主要由执行明确定义的任务并且彼此独立运行的代码块(或“模块”)组成,则它是模块化的。模块化可帮助您保持代码的组织性,反复调整实现细节,并将相同的功能合并到项目的各个部分中。
以我在嵌入式固件开发中的经验,适度(而非强迫)使用C函数可提供适量的模块化。如果您按照“黑匣子”思路设计函数,那么它就是一个好的模块:您想假设代码的其他部分不知道函数内部正在发生什么。他们所知道的只是该功能执行的任务以及(如果适用)该功能的界面,即输入和输出。



这里的想法是,如果代码调用正确的函数并提供有效输入,则将正确执行所需的任务,并且代码将接收有效输出。模块化还涉及处理相反的情况-如果调用了错误的函数,则程序不应崩溃,并且如果提供了无效的输入,则函数应识别出这种情况并适当地处理错误。

可读性
我不能过分强调编写易于阅读和解释的代码的重要性。的确,处理器不会在乎您的直观标识符,吸引人的大写字母,解释性注释,缩进,颜色编码等。但是,编写代码的人是人,而不是计算机,这确实是事实,而且可读的代码使固件开发更快,更准确,更灵活且更令人愉悦。
函数是使代码更具可读性的好方法,因为它们在一个直观的函数调用中封装了潜在的大量复杂语句。这在嵌入式开发中尤其重要,在嵌入式开发中,C语句可能特别难以理解,因为C语句用于修改粗略命名的特殊功能寄存器中看似随机的位。

可重用性

这与模块化有关,尽管在本节中,我想强调将代码从一个项目合并到一个完全独立的项目中的能力。
如果您倾向于重复使用同一制造商的微控制器(如果您想提高生产率并减轻压力,我建议您这样做),那么您几乎肯定会发现自己定期实现的功能与过去使用的功能几乎相同。



如果您始终将固件组织成独立的功能,则将积累大量可用于新项目的经过验证的代码。复制和粘贴整个功能,尤其是根据黑盒模型设计的功能,比复制和粘贴可能散布在与您所使用的功能无关的语句中的各行代码更容易且更不易出错试图重复。另外,如果原始代码没有明确指出给定操作所需的指令,则可能会省略必要的语句,从而造成严重的故障甚至是更难以捉摸的错误。

合作
这也与模块化紧密相关。如果您将固件设计为独立模块的集合,那么另一位工程师可以更轻松地修改或扩展代码的功能。
再次提及黑匣子的心态,我们可以看到,如果其他人产生的代码被编写为执行所需任务,正确处理输入并正确生成输出的函数,则它们将很容易集成到项目的其余部分。

在嵌入式C中使用函数的提示
  • 拥有可移植的,经过验证的代码块来进行简单的操作(在各种应用程序中可能需要这样)非常方便。我将这些功能称为“实用程序”功能,在这一类别中,我包括诸如计时器(提供固定延迟或接受微秒或毫秒的输入参数)之类的东西,以及可以找到一系列最大值或最小值的函数,计算序列的平均值,清除数组(即,将所有元素的值设置为零),或确定值是否在下限和上限所定义的范围内。
  • 函数是进行复杂数学运算的好地方。一旦确定正确执行了特定的计算,最好通过将所有这些数学细节隐藏在函数调用中来提高可读性。
  • 为固件中的每个操作类别定义一个功能很有帮助(这些功能中通常会有一些功能)。这使您可以轻松地设置基本的实时操作系统,该操作系统通过检查状态标志并调用相应的函数来响应事件。下图传达了总体思路,并在代码片段中显示了一个特定示例。


  1. while(1)
  2. {
  3.         IF(RxData_FLAG)
  4.         {
  5.                 RxDATA_FLAG = FALSE;
  6.                 ProcessRxData();
  7.         }

  8.         if(ADCReady_FLAG)
  9.         {
  10.                 ADCReady_FLAG = FALSE;
  11.                 ProcessADCData();
  12.         }

  13.         if(LCDtimerDone_FLAG)
  14.         {
  15.                 LCDTimerDone_FLAG = FALSE;
  16.                 UpdateLCD();
  17.         }
  18. }
复制代码
结论

我希望我已经证明“无功能”代码不像最初出现的那样快速便捷,并且大量使用C语言的功能使嵌入式固件开发不仅效率更高,而且更令人愉悦。如果您希望在以后的文章中看到任何固件主题,请随时在下面的评论部分中告诉我们。




相关经验

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
发经验
关闭

站长推荐 上一条 /8 下一条

快速回复 返回顶部 返回列表