前言
模块化编程是将一个大型系统分解为更小、更易管理的模块或组件的过程。每个模块都有明确定义的接口和功能,可以独立开发、测试和维护。那么本篇文章将带大家学习模块化编程。
一、模块化编程概念
模块化编程是一种软件设计方法,其中将一个大型软件系统分解为多个相互独立、可重用的模块或组件。每个模块都负责执行特定的功能,并且与其他模块之间通过明确定义的接口进行通信。在模块化编程中,常常使用 .h 和 .c 文件来组织和管理模块的实现。
概念:
分解和抽象: 模块化编程通过将整个系统分解为小的、独立的模块,每个模块都有清晰的责任和功能。这种分解使得软件系统更易于理解、维护和扩展。
封装和接口定义: 每个模块都被封装在一个独立的单元中,并且与其他模块之间通过明确定义的接口进行通信。这种接口定义规定了模块之间允许的交互方式,提供了一种清晰的交互界面,使得模块之间的耦合度降低,增强了代码的灵活性和可重用性。
可重用性和扩展性: 模块化编程使得每个模块都可以独立开发、测试和维护,同时也可以被其他模块或项目所重用。这种重用性和扩展性使得开发人员可以更加高效地构建新的系统,同时也可以更容易地维护和升级现有系统。
为什么要有模块化编程?
提高可维护性: 将一个大型软件系统分解为多个模块可以降低系统的复杂度,使得每个模块都可以独立进行开发、测试和维护。这种分解可以提高代码的可读性和可维护性,使得系统更易于理解和修改。
增强可重用性: 模块化编程使得每个模块都可以独立地开发和测试,并且可以被其他模块或项目所重用。这种可重用性使得开发人员可以更加高效地构建新的系统,同时也可以减少重复开发的工作量。
提高开发效率: 模块化编程使得开发工作可以并行进行,不同的团队可以独立地开发不同的模块。这种并行开发可以提高开发效率,缩短项目的开发周期,更快地将产品推向市场。
增强系统的可扩展性和灵活性: 模块化编程使得系统的不同部分可以独立扩展和修改,而不会对整个系统造成影响。这种灵活性使得系统更易于适应需求变化和技术更新,保持系统的长期可用性和竞争力。总的来说,模块化编程通过将系统分解为相互独立、可重用的模块,提高了软件系统的可维护性、可重用性、开发效率和系统的可扩展性和灵活性,是一种常见且有效的软件设计和开发方法。
二、创建HardWare文件夹管理硬件模块文件
在工程根目录下创建HardWare文件夹用于存放硬件模块的文件。
在HardWare文件夹下创建led.c和led.h文件:
在keil中添加HardWare分组:
将led.c文件添加进入HardWare分组中:
添加HardWare到路径中:
三、编写led.c和led.h文件
led.c文件:
#include "led.h"
void LED_Init(void)
{
LED_GPIO_CLK_EN(); // 使能LED引脚所在的GPIO端口时钟
gpio_mode_set(LED_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, LED_PIN); // 配置LED引脚为输出模式,无上下拉
gpio_output_options_set(LED_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, LED_PIN); // 设置LED引脚为推挽输出,输出速度50MHz
}
void LED_ON(void)
{
gpio_bit_set(LED_PORT, LED_PIN); // 将LED引脚置高,点亮LED
}
void LED_OFF(void)
{
gpio_bit_reset(LED_PORT, LED_PIN); // 将LED引脚置低,关闭LED
}
led.h文件:
//防止头文件重复包含
#ifndef LED_H
#define LED_H
#include "gd32f4xx.h" // 包含了该系列芯片的寄存器定义、常量定义和函数声明等信息
#include "gd32f4xx_libopt.h" // GD32F4 系列芯片的外设库选项配置文件
#define LED_PORT GPIOB // LED所连接的GPIO端口
#define LED_PIN GPIO_PIN_4 // LED所连接的GPIO引脚
// 使能LED所连接的GPIO端口时钟
#define LED_GPIO_CLK_EN() rcu_periph_clock_enable(RCU_GPIOB)
/**
* @brief 初始化LED
* @note 调用此函数前需要确保已经使能LED所连接的GPIO端口时钟
*/
void LED_Init(void);
/**
* @brief 将LED打开
*/
void LED_ON(void);
/**
* @brief 将LED关闭
*/
void LED_OFF(void);
#endif
main函数中调用:
#include "gd32f4xx.h"//包含了该系列芯片的寄存器定义、常量定义和函数声明等信息
#include "gd32f4xx_libopt.h"//GD32F4 系列芯片的外设库选项配置文件
#include "systick.h"//配置和使用 SysTick 定时器的功能文件
#include "led.h"
int main(void)
{
systick_config();//配置系统主频168M,外部8M晶振,配置在#define __SYSTEM_CLOCK_168M_PLL_8M_HXTAL (uint32_t)(168000000)
LED_Init();//初始化LED灯模块
while(1)
{
LED_ON();//PB4输出高电平
delay_1ms(100);//等待100ms
LED_OFF();//PB4输出低电平
delay_1ms(100);
}
}
总结
本篇文章就讲解到这里,希望大家可以下去自己实践一下这个代码,体验模块化编程的好处和强大。
源码:链接:https://pan.baidu.com/s/1U-ZzqTMN3Nvi8WBfpLU7Pw
提取码:xtt5