平台化程序设计

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

对于与日俱增电子产品项目,项目开发周期、产品的稳定性、设计的合理性、都为公司重中之重的要素,为此公司的研发部,都寻求各种应对方案,探讨如何使产品的生命周期更长,如何使产品的各项维护更加简单,如何使产品设计可高效移植到下一个项目开发中来,如何应对客户的需求变更等等,这些都是需要有智慧的抉择。

1、什么是平台化设计

在现实中的项目开发中,现状是复杂多变、需求不清晰、深度不够。今天一个需求,明天变成另外一个需求;今天升级一个版本,明天又要升级一个版本;今天修改的都还来得及测试,明天的需求又挤进来。所以这样多变动程序设计,往往不知隐藏多少个BUG。等到生产后BUG就一个个出现。软件工程师要为此买单,会打击到自己的自信心。而在产品的迭代性、软件维护、软件升级,不管是硬件开发或者软件开发,平台化发越来越受公司的欢迎。软件平台化开发具有以下特点:
1,稳定性良好;
2,不需要修改代码只需修改配置项;
3,若是要修改代码,修改量很小;
4,程序的思路清晰、可读性强、容易维护;

平台化工作,我们将它化繁为简,分为两大部分工作,一是程序模块化编程;二是功能项参数可配置。模块化编程稳定性高,不用经常修改内部程序;功能项参数可配置功能可供用户选择,省去修改程序,程序版本管理,编辑编译等操作出错的概率。

1.1、功能配置项的实现

功能配置项,可以根据客户提供需配置的项列表来实现,经常见得的配置项,如功能开启与否、功能模式却换、产品信息参数修改、功能参数修改等等。功能配置项是一般是存储在EEPROM里面的,现在芯片都自带可擦写的Flash,配置存放在芯片内部,节省外挂EEPROM成本。配置项存储的结构可以一个配置一个存储区域,也可以一起擦除一起存储,看存储空间和区块结构来决定。配置项的做法,在程序上电或者软复杂初始化时,读取EEPROM数据,用结构体指针的方式解析配置项的内容,若读到结构体的有内容且检验和正确,则使用该配置参数。若读到无数据,或者检验和错误,则使用默认的配置。
配置项配置方法,配置项配置方法可以有以下几种,一个就是在烧录程序的时候,将配置项一起烧录,即将烧录的hex文件和配置的hex合并。另外主程序要留接口来升级配置项,在可以通过外部OTA方式,或者Bootloader方式。如蓝牙设备的操作,可以在手机APP上面设置好配置项参数,开启设置时,设备通过蓝牙服务命令将配置项参数写入EEPROM中,主机重启后参数配置完成。

1.2、模块化编程

模块化程序设计,要做到程序相对独立、高移植性、高可读性等目标。一般项目可抽象分为技术层和业务层(应用层)。模块有技术层模块和应用层模块,技术层模块如IO输出、PWM驱动、串口驱动、ADC采样、flash存储、外围驱动等等。业务模块如定时情景、显示时钟、开关控制、菜单功能等等。怎样实现模块化编程,详见下一章节。

2、功能模块化

怎样编写模块化程序?这是一个无规范标准的。每个软降工程师都力争模块化,而每个工程师写出来的代码也个不相同,我个人喜欢用模板,精益求精的做好每一个细节,接下来看下模块化的结构。模块化程序一般分为.C和.H文件来体现功能模块。.C文件的程序是实现该功能的母体,.H文件是定义模块与外部沟通的桥梁。

.C文件内部结构可将其分块为:
1.调用外部.h文件
2.定义宏
3.定义结构体
4.定义内部静态变量
5.定义全局变量
6.定义内部静态函数
7.定义外部函数
8.定义函数

内部函数实现其模块功能。

2.1调用外部.h文件

这个肯定是存在的,一个模块不可以独立存在,跟外部无任何关联。如需调用#include <reg52.H>、#include <intrins.h>、#include <string.h>、#include <stdio.h>、#include "IoScan.h"等等。而案例中使用一个#include "include.h"就可以。这是因为#include "include.h"里面已经包含以上哪些文件了。这种方法是在调用.H文件集中一起调用,写程序代码比较快,不需求知道本模块需要调用哪些模块。
在这里插入图片描述

2.2定义宏

#define的定义是多变的,可以是常数、变量、函数、算法等等,模块内部需要用到的就在这定义,在.C文件定义的宏只能值.C内部使用,不能被外部使用,若要在外部和内部都能使用,就需在.H文件内部定义。
在这里插入图片描述

2.3定义结构体

结构体有enum、union和struct,模块内部需要用到的就在这定义,在.C文件定义的结构体只能值.C内部使用,不能被外部使用,若要在外部和内部都能使用,就需在.H文件内部定义。
在这里插入图片描述

2.4定义静态变量和全局变量。

定义静态变量,一般加static修饰的为静态变量,只能在模块内部使用;若未加static修饰,也为静态变量,也只能模块内部使用。若在未加static修饰,且在.H文件内部申明定义的,才为全局变量,外部才可以调用。
如,定义全局变量:IoScan_Status;
.C定义
/****************************************************************
定义全局变量
****************************************************************/
uint08 IoScan_Status[INPUT_NUM_MAX];

.H定义
/****************************************************************
定义全局变量
****************************************************************/
extern uint08 IoScan_Status[INPUT_NUM_MAX];
在这里插入图片描述

2.5定义静态函数和外部函数

定义静态函数,一般加static修饰的为静态函数,只能在模块内部使用;若未加static修饰,也为静态函数,也只能模块内部使用。若在未加static修饰,且在.H文件内部申明定义的,才为外部函数,外部才可以调用。
如,定义外部调用函数:IoScan_Init;
.C定义
/****************************************************************
IO检测模块 初始化函数
****************************************************************/
void IoScan_Init(void)
{
···
}

.H定义
/****************************************************************
定义函数
****************************************************************/
extern void IoScan_Init(void);
在这里插入图片描述

3.总结:

C文件的结构,定义或者申明的变量,函数若只有在内部使用的,一般就定义在.C文件里面,并且加static来修饰。全局变量和外部调用函数,不加static修饰,且需要在.H文件里面,增加此变量和函数申明,且用extern修饰变量和函数。而整个.C结构把它的块一一排列出来,需要增加找到相应位置去增加。这样形成一个通用的模板,等做下一个模块化时,直接可以使用该模板。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小武编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值