结合工作经验做一点总结
目录
一、工程结构\软件分层\架构设计\提高可读性和便于维护
一个完整的产品会有多个部分构成,各部分独立控制、协同运行。在代码上如何体现呢?
1、硬件属性描述
比如按键属性,创建一个结构体描述出按键所有的特性,初始化时按照定义的按键属性进行操作。如果有很多按键那么就可以定义一个按键结构体数组,初始化时或遍历扫描按键时会比较容易操作。
struct key
{
长按触发事件 //长按的时间
有效电平 //高或低
按键引脚 //例如GPIOA_10
...
按键产生的事件:点击 双击 长按
}
例如:一个SPI驱动的LCD
typedef struct
{
水平像素
垂直像素
亮度值
显示方向
使用到的GPIO(结构体)
SPI设备(结构体)
}dev_lcd;
typedef struct
{
SPIx //使用的SPI端口
速度
是否繁忙
使用到的GPIO(结构体)
}dev_spi;
typedef struct
{
GPIO端口 PA PB
GPIO引脚 PA0 PB10
}dev_GPIO;
2、硬件驱动(方法)
有了硬件的描述数据,我们围绕这些数据可以定义一些列的接口和操作函数。
比如针对这个LCD做几个查询函数,获取宽度、高度、显示方向,当前亮度等。操作函数,写入数据时就引用包含的SPI作为形参
二、较高的可移植性
数据类型:使用自定义的类型符号替代标准类型符号。比如UC8 替代unsigned char来表示8bit无符号数据。
单向依赖:a.c b.c两个文件在b中调用a的函数,a不能调用b的函数。在文件注释中标注依赖关系,这样文件之间的关系更清晰。
三、扩展性
多语言种类扩展:不把显示的词条写到程序里,而是使用数字表示。定义词条数组,显示时替换字体地址
四、硬件兼容性
硬件的改动有以下几种情况:
1、更换主控单片机:程序是否能兼容?
2、更换某些集成电路驱动:比如换掉步进电机驱动。8M、16M晶振混用。
3、和程序无关的硬件改动:改变外围电阻值等。
五、写代码要做的事
①合理的版本管理
②完善的错误反馈
③统一编码风格
④模块化编程
⑤完善的注释
包括工程介绍、源码文件说明、函数说明、代码注释。