近期工作回顾
新项目红红火火的开展了,前一阵子也忙了一下,嗯,现在自己这部分的代码终于吭哧吭哧的完成的差不多了,其他同事的工作离完成还善待时日。可以抽出空来对这段时间的编程工作做个小小的回顾。
代码架构
项目还是基于老项目的代码开工的, 对旧的项目框架,总归是有一些感觉不合理的地方,抽时间梳理了一下,特别是这个代码架构。一个main.c文件包罗万象,各种代码参差在一起,总让人感觉到乱。对内对外的头文件没有区分,一股脑全部暴露出去。针对这个情况, 我采用了软件架构上的万金油 - 分层。 首先,根据业务把代码进行了分层, 理清楚各个模块之间的调用关系; 然后根据不同的层,把相关的代码分散到不同的文件。 第三, 把对内对外的接口分离开,分散到不同的文件中。具体实现如下:
分层
根据整理把代码分层不同的模块, 分别为 最上层进行逻辑组织的应用模块, 报文解析处理的报文模块, 业务相关的业务模块, 配置相关的配置模块,通用的工具模块,还有就是系统芯片的SDK模块。
文件
针对嵌入式系统,为了提高程序运行的效率, 减少不必要的函数出入栈操作,项目大部分的函数都是static inline类型的,整个模块除了一个main.c文件其他都是头文件。针对这种情况,从main.c文件剥离出来的各个模块的代码也都是以头文件的形式存在的。 如: packet.h, bus.h, common.h。 另外,由于配置模块一般都是在程序运行时进行调用处理的,性能要求不高,可以独立出一个config.c + config.h的文件。
然后根据调用关系, 在main.c文件中按顺序引用各个模块的头文件, 针对需要互相引用的地方, 使用函数声明的方式来保证调用的到。这样, 在预处理的时候,其实大部分模块的代码会直接展开到main.c文件, 可以正常使用。 为了保证模块间不互心依赖头文件, 我使用了宏判断,进行报错。
1 | #ifdef _PACKET_H_ |
头文件只要多次被引用了, 编译时就会报错。
同理,其他的内部头文件也进行同样的处理, 保证在main.c中唯一引用头文件即可。各个模块的文件不需要再引用任何头文件, 由main.c组织依赖关系。
这样逻辑就清晰多了, 代码也不会混杂在一起。
sizeof 宏替换
代码中充斥着许多对结构体进行sizeof求大小的代码,实际上这些都是可以节省下来的,使用宏进行统一定义与处理。
1 | #define UDP_HEADER_LEN (8) // udp头部长度为8 sizeof(udp_header_t) |
使用了UDP_HEADER_LEN替换了 sizeof(udp_header_t)
的地方, 同时在编译debug的程序时, 进行了assert断言。
还有一种使用宏的方法, 调试过程中, 我们把结构体大小以及对应的宏常量打印出来, 人工看一下大小对不对。
1 | #define SHOWSTRUCTSIZE(type) printf("%s, size %d\r\n", #type, (int)sizeof(type)) |
行动,才不会被动!
欢迎关注个人公众号 微信 -> 搜索 -> fishmwei,沟通交流。