C语言模块化程序设计(好)
- 格式:doc
- 大小:32.50 KB
- 文档页数:5
C语言模块化编程的优势和方法近年来,随着软件开发行业的迅猛发展,模块化编程成为了一种重要的编程范式,而C语言作为一种广泛应用的编程语言,也逐渐引入了模块化编程的概念。
本文将探讨C语言模块化编程的优势和方法。
一、模块化编程的优势1. 代码复用性:模块化编程将程序划分为若干独立的模块,每个模块都具有特定的功能。
通过模块化编程,我们可以将常用的功能封装为独立的模块,以便在不同的项目中进行复用,提高代码的可维护性和开发效率。
2. 可读性和可维护性:模块化编程使得代码结构更加清晰,每个模块都有明确的功能和责任。
这样一来,当我们需要修改或调试某个功能时,只需要关注特定的模块,而不需要深入整个代码库。
这大大提高了代码的可读性和可维护性。
3. 并行开发:模块化编程使得多人协同开发更加容易。
不同的开发人员可以独立地开发不同的模块,通过接口规范的定义,各个模块可以无缝地集成到一个完整的程序中。
这种并行开发的方式大大提高了开发效率。
二、模块化编程的方法1. 接口定义:在模块化编程中,接口的定义非常重要。
接口定义了模块对外提供的功能和数据结构,同时也规定了模块之间的通信方式。
在C语言中,我们可以通过头文件来定义接口,将函数原型、结构体定义等放在头文件中,并在模块的源文件中包含该头文件。
2. 模块划分:合理的模块划分是模块化编程的关键。
我们可以根据功能的不同将程序划分为多个模块,每个模块负责一个特定的功能。
模块之间应该尽量保持独立性,避免相互依赖和耦合。
3. 模块间通信:模块之间的通信可以通过接口函数、全局变量和消息传递等方式实现。
在C语言中,我们可以通过函数参数和返回值来传递数据,通过全局变量来共享数据,通过消息传递来实现模块之间的通信。
4. 模块测试:在模块化编程中,模块的测试非常重要。
我们可以通过单元测试的方式对每个模块进行测试,确保每个模块的功能和接口都能正常工作。
同时,模块的测试也有助于发现和修复潜在的问题,提高代码的质量。
C语言模块化程序设计模块化程序设计是一种将程序分解为独立模块的方法,每个模块具有明确定义和特定功能。
使用模块化程序设计可以提高程序的可维护性、可扩展性和可重用性。
本文将介绍C语言中的模块化程序设计的原则、方法和优势。
首先,要进行模块化程序设计,需要遵循以下原则:1.单一职责原则:每个模块应该只负责一个具体的功能或任务。
这样可以使模块的功能更加明确和独立,并且方便后续的维护和测试。
2.高内聚,低耦合:模块内部的各个部分应该紧密地关联在一起,形成一个功能完整的整体,同时与其他模块的耦合度应该尽量降低,以减少模块间的相互影响和依赖性。
接下来,我们将介绍几种常见的模块化程序设计的方法:1.函数模块化:将功能相似的代码封装在一个函数中,便于重复使用和集中管理。
函数模块化可以提高程序的可读性和可维护性。
2.文件模块化:将具有相关功能的函数、常量和数据结构定义放在同一个文件中,并通过头文件进行声明和引用。
文件模块化可以使代码结构清晰,提高代码的复用性。
3.类模块化:将相关的函数和数据结构封装在一个类中,并通过类的接口来访问和操作。
类模块化可以提供更高级别的封装和抽象,方便程序的组织和管理。
4.动态链接库和静态链接库:将功能模块封装为独立的动态链接库或静态链接库,以供其他程序调用和使用。
链接库模块化可以提高代码的复用性和可移植性。
以上是常见的模块化程序设计方法,可以根据具体的需求和场景选择适合的方法。
无论使用哪种方法,模块化程序设计都可以带来以下几个优势:1.可维护性:模块化的程序结构使程序的各个部分相互独立,修改和维护一个模块时,不会对其他模块造成影响,降低了维护的难度。
2.可重用性:模块化的程序结构使得代码片段可以在多个地方反复使用,提高了代码的复用性,减少了重复编写代码的工作量。
3.可扩展性:由于模块之间的低耦合性,当需要添加新的功能时,可以通过增加新的模块来实现,而不需要修改已有的模块,降低了扩展的成本和风险。
C语言模块化编程模块设计和代码复用编程中的模块化设计和代码复用是提高程序可读性、可维护性和开发效率的重要手段。
在C语言中,模块化编程可以通过使用函数库和头文件来实现。
本文将详细介绍C语言中的模块化编程模块设计和代码复用的方法和技巧。
一、模块化编程的概念模块化编程是将程序划分成多个互相依赖的模块,每个模块负责完成特定的功能,并且能够与其他模块独立工作。
模块间通过定义接口(函数和数据结构)来实现数据和控制的传递。
二、模块设计的原则1. 单一职责原则:每个模块只负责一个具体的功能。
2. 高内聚、低耦合原则:模块内部各个部分之间紧密相关,但与外部模块之间的联系尽量减少。
3. 接口定义清晰简洁:模块之间的接口定义要尽可能的清晰、简洁,以方便调用和使用。
三、代码复用的方法1. 函数库:将一些经常使用的功能封装成函数库,通过调用函数库中的函数来实现代码的复用。
例如,可以将常用的数学计算函数封装成函数库,供不同的项目使用。
2. 头文件:使用头文件将常用的宏定义、结构体定义、函数原型等代码片段提前定义好,并在需要使用的地方引入。
通过使用头文件可以减少代码重复,提高开发效率。
3. 模块化编程:将程序划分成多个模块,每个模块负责不同的功能。
模块之间通过调用接口来实现数据的交互和控制的传递。
模块化编程可以提高代码的可读性和可维护性。
四、模块化编程的步骤1. 确定模块边界:根据程序的功能和需求,将程序划分为多个模块。
每个模块负责具体的功能或任务。
2. 定义接口:为每个模块定义接口,包括输入参数、输出结果和调用方式等信息。
接口定义要足够清晰简洁,以方便其他模块的调用。
3. 实现模块功能:根据模块的功能需求,编写相应的代码实现模块内部的功能。
在实现过程中,要注意保持模块内部的高内聚。
4. 进行模块间的连接和测试:将各个模块相互连接,并进行功能测试和调试。
如果发现问题,及时修改和优化模块的实现代码。
五、总结通过模块化编程和代码复用,可以提高C语言程序的开发效率和代码质量。
C语言模块化设计文档总结模块化设计是一种将程序分割成多个独立的模块来设计软件的方法。
模块化设计提供了一种更为结构化和灵活的方式来组织代码,使得代码更易于阅读、理解和维护。
C语言作为一种高级编程语言,广泛应用于软件开发中,因此模块化设计对于C语言程序的开发至关重要。
首先,模块化设计可以提高代码的可读性和可维护性。
通过将代码划分为多个模块,每个模块专注于完成特定的功能,代码的逻辑结构更加清晰,易于理解。
当出现问题需要修改或者优化时,只需要针对特定的模块进行修改,不会影响到其他模块,大大降低了代码的维护成本。
其次,模块化设计可以提高代码的复用性。
在模块化设计中,可以将一些具有通用性的函数或者数据结构封装为模块,这些模块可以在不同的项目中进行复用,提高了代码的复用率。
同时,通过模块化设计,不同的开发人员可以并行开发不同的模块,提高了开发效率。
再次,模块化设计可以提高代码的可测试性。
将代码划分为多个模块后,我们可以对每个模块进行单独的测试。
这样,在进行整体集成测试时,我们可以根据每个模块的测试结果来确定问题所在,更加快速地定位和解决问题。
同时,通过模块化设计,我们可以使用模拟对象或者桩件来替代一些依赖的模块,方便对代码进行单元测试。
最后,模块化设计可以提高团队合作的效率。
在大型项目中,通常需要多人协同开发。
通过模块化设计,可以将程序的不同模块分配给不同的开发人员,每个人员负责一个或多个模块的开发工作。
这样,可以减少代码的冲突和合并,提高开发效率。
总之,模块化设计对于C语言的程序开发具有重要的意义。
通过模块化设计,可以提高代码的可读性、可维护性、复用性和可测试性,同时也有助于提高团队合作的效率。
因此,在C语言程序的开发中,我们应该采用模块化设计的方法来设计和组织代码。
C语言模块化程序设计模块划分C语言模块化程序设计需理解如下概念:(1)模块即是一个.c文件和一个.h文件的结合,头文件(.h)中是对于该模块接口的声明;(2)某模块提供给其它模块调用的外部函数及数据需在.h中文件中冠以extern关键字声明;(3)模块内的函数和全局变量需在.c文件开头冠以static关键字声明;(4)永远不要在.h文件中定义变量!定义变量和声明变量的区别在于定义会产生内存分配的操作,是汇编阶段的概念;而声明则只是告诉包含该声明的模块在连接阶段从其它模块寻找外部函数和变量。
一个嵌入式系统通常包括两类模块:(1)硬件驱动模块,一种特定硬件对应一个模块;(2)软件功能模块,其模块的划分应满足低偶合、高内聚的要求。
多任务还是单任务所谓"单任务系统"是指该系统不能支持多任务并发操作,宏观串行地执行一个任务。
而多任务系统则可以宏观并行(微观上可能串行)地"同时"执行多个任务。
多任务的并发执行通常依赖于一个多任务操作系统(OS),多任务OS的核心是系统调度器,它使用任务控制块(TCB)来管理任务调度功能。
TCB包括任务的当前状态、优先级、要等待的事件或资源、任务程序码的起始地址、初始堆栈指针等信息。
调度器在任务被激活时,要用到这些信息。
此外,TCB还被用来存放任务的"上下文"(context)。
任务的上下文就是当一个执行中的任务被停止时,所要保存的所有信息。
通常,上下文就是计算机当前的状态,也即各个寄存器的内容。
当发生任务切换时,当前运行的任务的上下文被存入TCB,并将要被执行的任务的上下文从它的TCB中取出,放入各个寄存器中。
究竟选择多任务还是单任务方式,依赖于软件的体系是否庞大。
例如,绝大多数手机程序都是多任务的,但也有一些小灵通的协议栈是单任务的,没有操作系统,它们的主程序轮流调用各个软件模块的处理程序,模拟多任务环境。
单任务程序典型架构(1)从CPU复位时的指定地址开始执行;(2)跳转至汇编代码startup处执行;(3)跳转至用户主程序main执行,在main中完成:/index.php/Main_Page-->C语言模块化程序设计模块划分C语言模块化程序设计需理解如下概念:(1)模块即是一个.c文件和一个.h文件的结合,头文件(.h)中是对于该模块接口的声明;(2)某模块提供给其它模块调用的外部函数及数据需在.h中文件中冠以extern关键字声明;(3)模块内的函数和全局变量需在.c文件开头冠以static关键字声明;(4)永远不要在.h 文件中定义变量!定义变量和声明变量的区别在于定义会产生内存分配的操作,是汇编阶段的概念;而声明则只是告诉包含该声明的模块在连接阶段从其它模块寻找外部函数和变量。
Rose 第三章模块化程序设计济南大学Rose引出如果程序中有多个数,多处需要判断是否是素数,怎么办?反复书写那段重复的代码?解决办法:将判断素数的功能用一个独立的模块来实现,即自定义函数;在main 函数中反复调用此功能模块就可以了。
for(i=2;i<=x/2;i++)if(x%i==0) break;if(i>=x/2)printf("yes\n");else printf("no\n");济南大学Rosemain(){ int a,b;printf("input a number:");scanf("%d%d",&a,&b);sushu(a);sushu(b);模块化的优点:•实现了代码的复用;•编程效率高;代码少;•功能分解,易于实现;•便于合作开发大型项目等。
void sushu(int x){int i;for(i=2;i<=x/2;i++)if(x%i==0) break;if(i>=x/2) printf("yes\n");else printf("no\n");}[教学要求]1.掌握函数定义的一般形式。
2.掌握函数调用的两种方式。
3.理解函数形参与实参的对应关系、参数传递方法及函数返回值的概念。
4.掌握指针的含义。
5.掌握指针作为函数参数的数据传递特点。
3.2 函数的定义•函数的定义位置:应写在其它函数的外面,前后都可以,但不能写在内部。
•函数的定义形式:第一行写函数名和括号第二行开始是函数体,用大括号扩起来,如:函数名称用户自定函数定义的基本知识•函数定义的声明:函数被调用在前面,而函数定义书写在后面的,需要在使用该函数前进行声明。
•函数声明的形式:将函数定义的第一行信息重新写一遍,末尾加分号。
void sushu(int x) ;main() { ……sushu(a);……}void sushu(int x) {……声明可以放在调用之前的任意位置处。
c语言实训报告模块化程序设计-回复C语言是一门非常重要的编程语言,被广泛应用于各个领域。
而实训报告主题为模块化程序设计,模块化程序设计是一种重要的程序设计方法,可以提高代码的可读性、可维护性和可扩展性。
本文将一步一步回答有关模块化程序设计的问题,通过详细分析和实例展示,帮助读者更好地理解和应用模块化程序设计。
第一步:理解模块化程序设计的概念和意义模块化程序设计是将一个大型的复杂程序分解为若干个小的模块,每个模块完成特定的功能,并且模块之间通过接口进行通信。
模块化程序设计的目的是提高代码的可读性、可维护性和可扩展性,使得程序的开发和维护更加容易。
第二步:合理划分模块在进行模块化程序设计之前,需要对程序进行合理的划分。
划分的原则可以根据功能或者特性来进行,例如将与输入输出相关的功能划分为一个模块,将与数据处理相关的功能划分为另一个模块。
同时,需要注意模块之间的耦合度尽可能低,模块内部的功能尽可能独立。
第三步:定义模块的接口每个模块都有自己的功能和特性,需要定义相应的接口。
接口包括输入参数、输出参数、全局变量以及函数的返回值等。
定义良好的接口可以提高模块之间的耦合度,方便进行单个模块的调试和测试。
第四步:实现模块在实现模块时,可以将每个模块单独进行开发,并进行相应的单元测试。
模块之间的接口必须按照定义的方式进行通信,确保数据的正确传递和处理。
在实现过程中,需要注意对模块的封装,隐藏细节,方便其他模块对其进行调用。
第五步:模块整合与测试当每个模块都实现并通过了单元测试后,就可以进行模块的整合和测试。
模块整合需要通过模块之间的接口将各个模块连接起来,并进行综合测试。
综合测试主要是验证模块之间的通信是否正常,各个模块是否正常协作,以及整个程序是否能够按照预期完成相应的功能。
第六步:模块调试与优化在进行模块调试时,可以逐个模块进行调试,并根据调试结果对模块进行优化。
模块调试的过程中,可以通过打印输出、断点调试等方式来定位和解决问题。
C语言编程如何实现模块化设计在软件开发领域,模块化设计是一种重要的编程思想和方法论。
它将一个大型的软件系统分解为若干个独立的模块,每个模块都有自己的功能和责任,通过模块之间的接口进行交互和通信。
这种模块化设计的好处是可以提高代码的可读性、可维护性和可重用性,同时也有利于团队合作和项目管理。
C语言是一种广泛应用于嵌入式系统和系统级编程的高级编程语言,如何在C语言中实现模块化设计呢?下面将从几个方面进行探讨。
首先,模块化设计的核心思想是将一个大的问题分解为若干个小的问题,并将每个小问题封装到一个独立的模块中。
在C语言中,可以通过函数来实现模块化设计。
每个函数都有自己的输入和输出,通过函数之间的调用和参数传递,可以实现模块之间的交互和通信。
在设计函数时,应该遵循单一职责原则,即每个函数只负责一个具体的功能,这样可以提高函数的可读性和可维护性。
其次,C语言中可以使用头文件来定义模块的接口。
头文件包含了模块的声明和定义,其他模块可以通过包含头文件来使用该模块的功能。
在头文件中,可以定义模块的结构体、函数原型和宏定义等。
通过头文件的使用,可以将模块的实现和使用分离开来,提高了代码的可重用性和可维护性。
另外,C语言中还可以使用静态变量和静态函数来实现模块的封装。
静态变量和静态函数只在当前模块内部可见,其他模块无法直接访问。
这样可以避免不同模块之间的命名冲突和变量污染,提高了代码的安全性和可靠性。
同时,静态变量和静态函数也有利于代码的优化和性能的提升。
此外,C语言中还可以使用宏定义和条件编译来实现模块的定制化和可配置性。
通过宏定义,可以定义一些常量和条件,根据不同的条件编译不同的代码块。
这样可以根据不同的需求和环境来选择不同的功能和实现方式,提高了代码的灵活性和适应性。
最后,C语言中还可以使用库文件和动态链接库来实现模块的封装和复用。
库文件是一组函数和数据的集合,可以被其他程序调用和使用。
通过库文件,可以将一些常用的功能和算法封装起来,供其他模块和项目使用。
C语言软件工程模块化设计和版本控制C语言作为一门广泛应用于软件开发的编程语言,具备了高效和灵活的特性。
在大型软件项目开发过程中,模块化设计和版本控制是非常重要和必不可少的一环。
本文将详细介绍C语言软件工程中的模块化设计和版本控制的概念、原则和最佳实践。
一、模块化设计在C语言编程中,模块化设计是将一个大型软件系统拆分成多个互相独立且易于管理的模块的过程。
通过模块化设计,软件开发团队可以将复杂的问题分解为各个独立的部分,每个模块负责完成独立的任务,并通过接口进行通信。
1. 模块化设计的优势模块化设计有以下几个优势:1.1 提高代码的可读性和可维护性:模块化设计使得代码结构清晰,功能划分明确,易于理解和修改。
1.2 便于团队合作:模块化设计使得各个模块相互独立,不同开发人员可以独立开发、测试和维护各自的模块,提高协同效率。
1.3 重复利用代码:通过对模块的设计和编写,可以使得一些通用功能的代码可以被多个模块复用,减少冗余代码的产生。
2. 模块化设计的原则在进行模块化设计时,需要遵循以下原则:2.1 单一职责原则:每个模块应该具备完成一个明确任务的能力,不承担其他无关任务。
2.2 接口隔离原则:模块之间的通信应该通过简单明确的接口进行,模块的内部细节对外部模块隐藏。
2.3 低耦合高内聚原则:模块之间的耦合度应该尽量低,模块内部的各个功能应该高内聚。
3. 模块化设计的最佳实践在进行模块化设计时,可以参考以下最佳实践:3.1 根据功能划分模块:根据软件需求,将整个系统划分成独立的功能模块,每个模块负责完成一个特定的任务。
3.2 设计清晰的接口:为每个模块定义清晰简洁的接口,限制模块之间的通信和依赖关系。
3.3 提高模块的独立性:每个模块应该尽可能独立,减少与其他模块的耦合度,确保可以单独测试和维护。
二、版本控制随着软件开发的持续迭代和不断演化,版本控制成为了管理软件代码和协作开发的重要手段。
而对于C语言软件工程的版本控制,主要采用的是Git和SVN工具。
单片机C语言模块化编程下面让我们揭开模块化神秘面纱,一窥其真面目。
C语言源文件 *.c提到C语言源文件,大家都不会陌生。
因为我们平常写的程序代码几乎都在这个XX.C文件里面。
编译器也是以此文件来进行编译并生成相应的目标文件。
作为模块化编程的组成基础,我们所要实现的所有功能的源代码均在这个文件里。
理想的模块化应该可以看成是一个黑盒子。
即我们只关心模块提供的功能,而不管模块内部的实现细节。
好比我们买了一部手机,我们只需要会用手机提供的功能即可,不需要知晓它是如何把短信发出去的,如何响应我们按键的输入,这些过程对我们用户而言,就是是一个黑盒子。
在大规模程序开发中,一个程序由很多个模块组成,很可能,这些模块的编写任务被分配到不同的人。
而你在编写这个模块的时候很可能就需要利用到别人写好的模块的接口,这个时候我们关心的是,它的模块实现了什么样的接口,我该如何去调用,至于模块内部是如何组织的,对于我而言,无需过多关注。
而追求接口的单一性,把不需要的细节尽可能对外部屏蔽起来,正是我们所需要注意的地方。
C语言头文件 *.h谈及到模块化编程,必然会涉及到多文件编译,也就是工程编译。
在这样的一个系统中,往往会有多个C文件,而且每个C文件的作用不尽相同。
在我们的C文件中,由于需要对外提供接口,因此必须有一些函数或者是变量提供给外部其它文件进行调用。
假设我们有一个LCD.C文件,其提供最基本的LCD的驱动函数LcdPutChar(char cNewValue) ; //在当前位置输出一个字符而在我们的另外一个文件中需要调用此函数,那么我们该如何做呢?头文件的作用正是在此。
可以称其为一份接口描述文件。
其文件内部不应该包含任何实质性的函数代码。
我们可以把这个头文件理解成为一份说明书,说明的内容就是我们的模块对外提供的接口函数或者是接口变量。
同时该文件也包含了一些很重要的宏定义以及一些结构体的信息,离开了这些信息,很可能就无法正常使用接口函数或者是接口变量。
C语言模块化程序设计需理解如下概念:
(1)模块即是一个.c文件和一个.h文件的结合,头文件(.h)中是对于该模块接口的声明;
(2)某模块提供给其它模块调用的外部函数及数据需在.h中文件中冠以extern关键字声明;
(3)模块内的函数和全局变量需在.c文件开头冠以static关键字声明;
(4)永远不要在.h文件中定义变量!定义变量和声明变量的区别在于定义会产生内存分配的操作,是汇编阶段的概念;而声明则只是告诉包含该声明的模块在连接阶段从其它模块寻找外部函数和变量。
一个嵌入式系统通常包括两类模块:
(1)硬件驱动模块,一种特定硬件对应一个模块;
(2)软件功能模块,其模块的划分应满足低偶合、高内聚的要求。
多任务还是单任务
所谓"单任务系统"是指该系统不能支持多任务并发操作,宏观串行地执行一个任务。
而多任务系统则可以宏观并行(微观上可能串行)地"同时"执行多个任务。
多任务的并发执行通常依赖于一个多任务操作系统(OS),多任务OS 的核心是系统调度器,它使用任务控制块(TCB)来管理任务调度功能。
TCB 包括任务的当前状态、优先级、要等待的事件或资源、任务程序码的起始地址、初始堆栈指针等信息。
调度器在任务被激活时,要用到这些信息。
此外,TCB还被用来存放任务的"上下文"(context)。
任务的上下文就是当一个执行中的任务被停止时,所要保存的所有信息。
通常,上下文就是计算机当前的
状态,也即各个寄存器的内容。
当发生任务切换时,当前运行的任务的上下文被存入TCB,并将要被执行的任务的上下文从它的TCB中取出,放入各个寄存器中。
究竟选择多任务还是单任务方式,依赖于软件的体系是否庞大。
例如,绝大多数手机程序都是多任务的,但也有一些小灵通的协议栈是单任务的,没有操作系统,它们的主程序轮流调用各个软件模块的处理程序,模拟多任务环境。
单任务程序典型架构
(1)从CPU复位时的指定地址开始执行;
(2)跳转至汇编代码startup处执行;
(3)跳转至用户主程序main执行,在main中完成:
a.初试化各硬件设备;
b.初始化各软件模块;
c.进入死循环(无限循环),调用各模块的处理函数
用户主程序和各模块的处理函数都以C语言完成。
用户主程序最后都进入了一个死循环,其首选方案是:
while(1)
{
}
中断服务程序
中断是嵌入式系统中重要的组成部分,但是在标准C中不包含中断。
许多编译开发商在标准C上增加了对中断的支持,提供新的关键字用于标示中
断服务程序(ISR),类似于__interrupt、#program interrupt等。
当一个函数被定义为ISR的时候,编译器会自动为该函数增加中断服务程序所需要的中断现场入栈和出栈代码。
中断服务程序需要满足如下要求:
(1)不能返回值;
(2)不能向ISR传递参数;
(3) ISR应该尽可能的短小精悍;
(4) printf(char * lpFormatString,…)函数会带来重入和性能问题,不能在ISR中采用。
硬件驱动模块
一个硬件驱动模块通常应包括如下函数:
(1)中断服务程序ISR
(2)硬件初始化
a.修改寄存器,设置硬件参数(如UART应设置其波特率,AD/DA设备应设置其采样速率等);
b.将中断服务程序入口地址写入中断向量表:
/* 设置中断向量表*/
m_myPtr = make_far_pointer(0l); /* 返回void far型指针void far * */
m_myPtr += ITYPE_UART; /* ITYPE_UART:uart中断服务程序*/
/* 相对于中断向量表首地址的偏移*/
*m_myPtr = &UART _Isr; /* UART _Isr:UART的中断服务程序*/ (3)设置CPU针对该硬件的控制线
a.如果控制线可作PIO(可编程I/O)和控制信号用,则设置CPU内部
对应寄存器使其作为控制信号;
b.设置CPU内部的针对该设备的中断屏蔽位,设置中断方式(电平触发还是边缘触发)。
(4)提供一系列针对该设备的操作接口函数。
例如,对于LCD,其驱动模块应提供绘制像素、画线、绘制矩阵、显示字符点阵等函数;而对于实时钟,其驱动模块则需提供获取时间、设置时间等函数。
C的面向对象化
在面向对象的语言里面,出现了类的概念。
类是对特定数据的特定操作的集合体。
类包含了两个范畴:数据和操作。
而C语言中的struct仅仅是数据的集合,我们可以利用函数指针将struct模拟为一个包含数据和操作的"类
"。
下面的C程序模拟了一个最简单的"类":
#ifndef C_Class
#define C_Class struct
#endif
C_Class A
{
C_Class A *A_this; /* this指针*/
void (*Foo)(C_Class A *A_this); /* 行为:函数指针*/
int a; /* 数据*/
int b;
};
我们可以利用C语言模拟出面向对象的三个特性:封装、继承和多态,但是更多的时候,我们只是需要将数据与行为封装以解决软件结构混乱的问题。
C模拟面向对象思想的目的不在于模拟行为本身,而在于解决某些情况下使用C语言编程时程序整体框架结构分散、数据和函数脱节的问题。
我们
在后续章节会看到这样的例子。
总结
本篇介绍了嵌入式系统编程软件架构方面的知识,主要包括模块划分、多任务还是单任务选取、单任务程序典型架构、中断服务程序、硬件驱动模块设计等,从宏观上给出了一个嵌入式系统软件所包含的主要元素。
请记住:软件结构是软件的灵魂!结构混乱的程序面目可憎,调试、测试、维护、升级都极度困难。
系统分类: 软件开发| 用户分类: 收藏文件夹| 来源: 转贴| 【推荐给朋友】| 【添加到收藏夹】。